这是一些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时,我发现了'f'符号'fopen'。
gcc如何运作? 并且有gcc其他编译选项发现,符号'fopen'不使用,并删除'fopen'符号。
答案 0 :(得分:0)
问题是,编译器不知道,以后会使用这些符号。
你可以在编译时告诉你你给了他整个程序,所以如果你的程序没有调用该函数,那么没人会。
编译选项为-fwhole-program
。