从共享库中删除未使用的函数

问题描述 投票:0回答:1

考虑以下文件:

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 代表我试图在我的项目中使用的另一个项目的代码。所以,改变它是不可行的。

linker shared-libraries
1个回答
2
投票

--gc-sections
链接器标志可以解决问题。根据
man ld
,它

[启用] 未使用输入部分的垃圾收集。

由于您正在使用

-ffunction-sections
进行编译,因此每个函数都将放入其自己的部分。添加
-Wl,--gc-sections
到您最后的
gcc
调用将删除未使用的
baz
部分。

© www.soinside.com 2019 - 2024. All rights reserved.