【发布时间】:2021-02-01 07:20:01
【问题描述】:
据我所知,链接器的工作是将目标文件中未定义的符号与静态库中定义的符号进行匹配。如果找到,正确的符号定义将包含在最终的可执行文件中。这就是所谓的符号解析。
如果从静态库中删除所有符号会发生什么?它会阻止链接器正确解析符号吗?
【问题讨论】:
据我所知,链接器的工作是将目标文件中未定义的符号与静态库中定义的符号进行匹配。如果找到,正确的符号定义将包含在最终的可执行文件中。这就是所谓的符号解析。
如果从静态库中删除所有符号会发生什么?它会阻止链接器正确解析符号吗?
【问题讨论】:
剥离符号是一种通常用于删除符号上的调试信息的操作,而不是实际链接过程所需的符号(尽管它可用于删除您不需要的东西的符号想要在链接过程中使用,例如,如果您没有生成目标文件)。
如果该工具使库或目标文件对链接无用,那将是一个相当糟糕的使用。
不要误会我的意思,您可以实际上使用例如strip --strip-all 执行此操作,这不是明智的做法。例如,考虑文件prog1.c 和prog2.c:
// prog1.c
int fn(void);
int main(void) { return fn(); }
// prog2.c
int fn(void) { return 42; }
对这些文件运行以下命令:
gcc -o prog1.o -c prog1.c
gcc -o prog2.o -c prog2.c
strip --strip-all prog2.o
gcc -o prog prog1.o prog2.o
将导致链接器错误,因为它找不到fn() - 它已从prog2.o 中删除。但是,除了strip 之外,执行相同的命令也可以正常工作。
【讨论】: