GNU ld链接整个目标文件还是只链接所需功能?

4
我们有一个库和一个可执行文件,需要将其与库进行静态链接。我们希望尽量减小最终可执行文件的程序空间。
根据avr-libc的文档:
连接器链接包含函数的整个对象模块”。
另一方面,我的同事们一致认为,在某些情况下,链接器会丢弃未使用的函数。
那么谁是正确的,或者我是否误解了什么?答案是否在gcc中始终如一,还是只在avr端口中讨论?

连接器无法知道一个函数是否会被调用,例如通过函数指针。 - CapelliC
我猜如果源代码中提到了一个函数名,那么这个函数就被认为是“已使用”,因此必须进行链接。 - Vorac
通常这是编译器的任务,正如Nikos C.所强调的。 - CapelliC
一个“如何做”的版本:https://dev59.com/03NA5IYBdhLWcg3wQ7Yw - Ciro Santilli OurBigBook.com
1个回答

10

如果你不主动要求,它不会执行无用代码剥离。为此,你需要使用以下编译参数编译所有内容:

-fdata-sections -ffunction-sections

以标记所有数据和函数。并且在使用GCC进行链接时,需要传递以下参数:

-Wl,--gc-sections

以清除所有未使用的部分。


所以我的两个来源都是正确的,而我并没有完全理解。正如预期的那样。感谢您的及时回答! - Vorac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接