考虑以下文件:
foo.c
void
bar(void);
void
foo(void)
{
bar();
}
bar.c
#include <stdio.h>
void
bar(void)
{
printf("bar\n");
}
void
baz(void)
{
printf("baz\n");
}
vis.map
{
global:
foo;
local:
*;
};
我已经将它们编译成一个库
gcc -c -ffunction-sections foo.c
gcc -c -ffunction-sections bar.c
gcc -Wl,--version-script,vis.map -shared -o libfoo.so foo.o bar.o
如预期
nm -D libfoo.so
仅显示foo
符号。但是,objdump -d libfoo.so
显示了 baz
的代码。我本以为,鉴于唯一可见的函数无法访问它,链接器会从最终输出中删除baz
。
是否有链接器标志或其他东西来完成此操作?
对于上下文,bar.c 代表我试图在我的项目中使用的另一个项目的代码。所以,改变它是不可行的。
--gc-sections
链接器标志可以解决问题。根据man ld
,它
[启用] 未使用输入部分的垃圾收集。
由于您正在使用
-ffunction-sections
进行编译,因此每个函数都将放入其自己的部分。添加 -Wl,--gc-sections
到您最后的 gcc
调用将删除未使用的 baz
部分。