gpt4 book ai didi

c - 我的链接器会从不需要的源文件链接对象吗?

转载 作者:行者123 更新时间:2023-12-02 05:07:07 24 4
gpt4 key购买 nike

在编译项目时,如果我的源文件包含一个没有使用函数的文件,编译器的输出中是否会包含不需要的目标文件?

例如

foo.c

int main() {return 0;}

酒吧.c

void unusedFunction {;}

编译执行:

gcc foo.c bar.c -o output

如果我从编译器命令中省略 bar.c,输出文件是否会更小?

最佳答案

大多数链接器会链接不需要的文件,除非您告诉它们不要这样做。有这方面的标志。

假设您链接了两个不需要的文件:一个目标文件和一个库:

gcc main.o unneeded.o -lunneeded

对于 GNU Binutils 或 Gold,标志是 --gc-sections 表示不需要的符号/目标文件,--as-needed 表示库。但是,这些是链接器标志,因此它们必须以 -Wl, 为前缀。请注意,这些标志的顺序很重要 - 标志仅适用于在命令行中出现在标志之后的库和目标文件,因此必须首先指定标志。

gcc -Wl,--as-needed -Wl,--gc-sections main.o unneeded.o -lunneeded

在 OS X 上,有一个不同的链接器,所以标志是不同的。 -dead_strip 标志删除不需要的符号/目标文件,-dead_strip_dylibs 标志删除不需要的库。

gcc -Wl,-dead_strip -Wl,-dead_strip_dylibs main.o unneeded.o -luneeded

例子

$ cat main.cint main() { }$ cat unneeded.cvoid unneeded() { }$ gcc -c main.c$ gcc -c unneeded.c

如果我们正常链接,我们会得到所有...

$ gcc main.o unneeded.o -lz$ nm a.out | grep unneeded0000000000400574 T unneeded$ readelf -d a.out | grep NEEDED 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1] 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

有了正确的标志,我们就能得到我们需要的...

$ gcc -Wl,--as-needed -Wl,--gc-sections main.o unneeded.o -lz$ nm a.out | grep unneeded$ readelf -d a.out | grep NEEDED 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

关于c - 我的链接器会从不需要的源文件链接对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16123341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com