Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么gcc会改变二进制函数的顺序? 许多关于强制二进制文件中函数的顺序与源文件的顺序匹配的问题 比如,等等 我不明白gcc为什么要改变他们的订单 从中可以得到什么 此外,为什么toplevel reorder默认值为true_C_Gcc_Ld - Fatal编程技术网

为什么gcc会改变二进制函数的顺序? 许多关于强制二进制文件中函数的顺序与源文件的顺序匹配的问题 比如,等等 我不明白gcc为什么要改变他们的订单 从中可以得到什么 此外,为什么toplevel reorder默认值为true

为什么gcc会改变二进制函数的顺序? 许多关于强制二进制文件中函数的顺序与源文件的顺序匹配的问题 比如,等等 我不明白gcc为什么要改变他们的订单 从中可以得到什么 此外,为什么toplevel reorder默认值为true,c,gcc,ld,C,Gcc,Ld,GCC可以更改函数的顺序,因为C标准(例如或更新的)允许这样做 GCC没有义务将C函数编译成ELF格式意义上的单个函数。请参阅Linux上的 在实践中(启用优化:尝试使用gcc-Wall-fverbose asm-O3 foo.c编译foo.c,然后查看发出的foo.s汇编文件),gcc编译器正在构建中间表示,如。大量的优化正在将GIMPLE转换为更好的GIMPLE 一旦GIMPLE表示“足够好”,编译器就会将其转换为 在Linux系统上,可以使用查找与给定地址最近的ELF函数。您还可以使用在运

GCC可以更改函数的顺序,因为C标准(例如或更新的)允许这样做

GCC没有义务将C函数编译成ELF格式意义上的单个函数。请参阅Linux上的

在实践中(启用优化:尝试使用
gcc-Wall-fverbose asm-O3 foo.c
编译
foo.c
,然后查看发出的
foo.s
汇编文件),gcc编译器正在构建中间表示,如。大量的优化正在将GIMPLE转换为更好的GIMPLE

一旦GIMPLE表示“足够好”,编译器就会将其转换为

在Linux系统上,可以使用查找与给定地址最近的ELF函数。您还可以使用在运行时检查

GCC甚至可以完全删除函数,特别是调用将进行内联扩展的
静态
函数(即使没有任何
内联
关键字)

我倾向于相信,如果你用
gcc-O3-flto-fwhole程序编译并链接你的整个程序
一些非静态但未使用的函数也可以被删除

你也可以自己写来改变函数的顺序

如果你想猜测GCC是如何工作的:下载并研究它的源代码(因为它是免费软件)并在你的机器上编译它,使用GCC,询问关于


另请参阅静态源代码分析器(一些您可能感兴趣的正在进行的工作)和项目。你可以通过电子邮件联系我。您也可以贡献并使用它来生成GCC插件(以C++形式)。

GCC可以更改函数的顺序,因为C标准(例如,或更新的)允许这样做。 GCC没有义务将C函数编译成ELF格式意义上的单个函数。请参阅Linux上的

在实践中(启用优化:尝试使用
gcc-Wall-fverbose asm-O3 foo.c
编译
foo.c
,然后查看发出的
foo.s
汇编文件),gcc编译器正在构建中间表示,如。大量的优化正在将GIMPLE转换为更好的GIMPLE

一旦GIMPLE表示“足够好”,编译器就会将其转换为

在Linux系统上,可以使用查找与给定地址最近的ELF函数。您还可以使用在运行时检查

GCC甚至可以完全删除函数,特别是调用将进行内联扩展的
静态
函数(即使没有任何
内联
关键字)

我倾向于相信,如果你用
gcc-O3-flto-fwhole程序编译并链接你的整个程序
一些非静态但未使用的函数也可以被删除

你也可以自己写来改变函数的顺序

如果你想猜测GCC是如何工作的:下载并研究它的源代码(因为它是免费软件)并在你的机器上编译它,使用GCC,询问关于

另请参阅静态源代码分析器(一些您可能感兴趣的正在进行的工作)和项目。你可以通过电子邮件联系我。您也可以贡献并使用它来生成GCC插件(C++形式)。 从中可以得到什么

优化。如果编译器认为某些代码可能会被大量使用,那么它可能会将这些代码放在与预期不会经常执行的代码不同的区域(或者是一条错误路径,其中性能并不重要)。而可能在其他代码之后执行或暂时在其他代码附近执行的代码应该放在附近,因此在需要时更可能在缓存中

因为同样的原因而存在

为什么顶级重新排序默认值为true

因为99%的开发人员不受这种默认设置的困扰,而且它使程序更快。需要关注排序的1%的开发人员使用属性、配置文件引导优化或其他可能与
无顶层重新排序冲突的功能

从中可以得到什么

优化。如果编译器认为某些代码可能会被大量使用,那么它可能会将这些代码放在与预期不会经常执行的代码不同的区域(或者是一条错误路径,其中性能并不重要)。而可能在其他代码之后执行或暂时在其他代码附近执行的代码应该放在附近,因此在需要时更可能在缓存中

因为同样的原因而存在

为什么顶级重新排序默认值为true


因为99%的开发人员不受这种默认设置的困扰,而且它使程序更快。1%需要关注排序的开发人员使用属性、配置文件引导优化或其他可能与
冲突的功能。无论如何,无顶层重新排序

只是为了确保我理解:二进制代码的重新排序与“打破”独立翻译的C函数的概念有关,并且“正交”于其他functions@OrenIshShalom当前位置我不明白你现在问的是什么。不,它没有打破任何概念,因为没有任何概念。一个人不应该依赖内存中函数的顺序。对不起,重新措辞:如果某个“热”“来自
foo
的代码被移动到它自己的部分,并且
foo
出现在源文件的
bar
之前,那么“hot foo”部分可以在
bar
@orenishhalom之后:是的,因为没有保证abo