【发布时间】:2013-01-01 20:12:24
【问题描述】:
C 标准中是否有要求编译(和链接)二进制文件中的函数将按照它们在 C 文件中写入的顺序出现?
请假设在下面的示例中编译器没有删除/内联任何函数,并且它们都存在于二进制文件中。问题不在于编译器如何处理空函数,而在于函数的顺序。
例如,如果我编译example.c:
void bar() { }
void foo() { bar(); }
int main() { foo(); }
我可以确定foo 在输出文件中会出现在bar 之后吗?
【问题讨论】:
-
我认为 C 标准中没有关于目标文件布局(甚至关于目标文件)的任何内容。即使有,为什么这是一个有趣的保证?
-
@Mat - 我正在与某人讨论通过从下一个函数的指针中减去其指针来找到函数大小(近似值)的选项。在某些情况下它会派上用场。
-
@BinyaminSharet 这是一个合理的用例,但应该使用平台的 ABI 库(libelf、libmacho 等)来完成。如果一个实现正确地记录了这些细节,那么它本身(应该是?)足以正确地执行这样的计算。
-
编译器可以将您的代码(内存中)更改为
int main() { }并编译它。请注意,现在没有函数foo()或bar():) -
@H2CO3 - 谢谢,我没有提到具体的格式或工具链,因为我感兴趣的平台不是标准的,实际上可能没有这样的库,因为其中一些是嵌入的,它们可能根本没有可用的库,因为整个图像是一个二进制文件。
标签: c compiler-construction linker