【发布时间】:2018-11-25 15:44:25
【问题描述】:
假设我有以下文件:
libmy_static_lib.c:
#include <stdio.h>
void func1(void){
printf("func1() called from a static library\n");
}
void unused_func1(void){
printf("printing from the unused function1\n");
}
void unused_func2(void){
printf("printing from unused function2\n");
}
libmy_static_lib.h:
void func(void);
void unused_func1(void);
void unused_func2(void);
my_prog.c:
#include "libmy_static_lib.h"
#include <stdio.h>
void func_in_my_prog()
{
printf("in my prog\n");
func1();
}
这是我链接库的方式:
# build the static library libmy_static_lib.a
gcc -fPIC -c -fdata-sections --function-sections -c libmy_static_lib.c -o libmy_static_lib.o
ar rcs libmy_static_lib.a libmy_static_lib.o
# build libmy_static_lib.a into a new shared library
gcc -fPIC -c ./my_prog.c -o ./my_prog.o
gcc -Wl,--gc-sections -shared -m64 -o libmy_shared_lib.so ./my_prog.o -L. -l:libmy_static_lib.a
libmy_static_lib.c中有2个函数没有用到,我认为来自this post
gcc fdata-sections --function-sections
应该为每个函数创建一个符号,并且
gcc -Wl,--gc-sections
链接时应删除未使用的符号
但是当我运行时
nm libmy_shared_lib.so
这表明这两个未使用的函数也被链接到共享库中。
关于如何让 gcc 自动删除未使用的函数有什么建议吗?
编辑: 如果我将静态库直接链接到可执行文件,我可以使用 gcc 的上述选项来删除未使用的函数。但如果我将静态库链接到共享库,它不会删除未使用的函数。
【问题讨论】:
-
更便携的方法是将每个函数放入一个单独的翻译单元中。
-
你的 .h 是错误的,它应该是
void func1(void);而不是void func(void); -
如果您的平台不支持
--gc-sections,您可以尝试使用-flto。在此处查看此答案stackoverflow.com/questions/6687630/… -
@Jean-FrançoisFabre 编译时没有警告,我修复了 .h 但未使用的函数仍然存在
-
其实我已经测试过了,如果没有编译
-shared
标签: c gcc shared-libraries static-libraries dead-code