1

这是一些 C++ 测试代码:

__attribute__((visibility("hidden"))) void foo()
{
   int fd = fopen("data1", "rb");
   printf ("%d", fd);
}

并且所有其他代码不调用函数'foo'和函数'fopen'

然后我使用 gcc 选项 -ffunction-sections 将代码编译为 so 文件。

我认为,函数 foo 符号和 foo 二进制代码没有包含在 so 文件中。

但问题是,我认为符号“fopen”不应该是符号表。ps:我可以确保只有函数'foo'使用'fopen'。实际上并非如此,当我使用命令 nm 时,我发现了 'fopen' 的 'U' 型符号。

gcc 是如何工作的?并有 gcc 其他编译选项发现,符号 'fopen' 没有使用,并删除 'fopen' 符号。

4

1 回答 1

0

问题是,编译器不知道以后是否使用这些符号。

你可以在编译时告诉他你给了他整个程序,所以如果你的程序没有调用这个函数,没有人会。

编译选项是-fwhole-program.

于 2012-05-02T16:43:29.407 回答