【发布时间】:2013-05-14 10:52:31
【问题描述】:
出于显而易见的原因,C 编译器必须编译对其他共享库外部可见的所有函数,以便它们符合平台的调用约定和其他 ABI 要求。但是,我了解到,对于可以保证永远不会从外部模块调用的函数,不一定需要这样做。
编译器如何以及何时可以确定给定函数是否适用?
静态函数仅对同一编译单元中的其他函数可见,因此非常适合此类破坏 ABI 的优化。但是指向静态函数的函数指针仍然可以传递给其他模块。编译器是否尝试确定函数指针是否在代码中的任何位置传递?
gcc 编译器有some extensions,它允许将符号声明为默认、隐藏甚至是内部符号,并且文档特别提到此信息可用于执行某些外部可见功能无法实现的优化.如果将函数指针传递给注释为内部函数的外部代码会发生什么?
什么是帮助编译器执行尽可能多的优化,同时仍保证与其他库的互操作性的最佳方法?我是否应该只使用编译器选项将所有函数定义为内部函数,并为所有需要在外部可见的函数使用属性覆盖它?
【问题讨论】:
标签: linker shared-libraries calling-convention abi