创建动态库时__stack_chk_fail符号仍未定义的问题求助
问题原因与解决方案
你的问题出在两个关键环节:
1. 链接库的顺序不符合链接器规则
链接器处理输入文件的顺序是从左到右,只有当遇到未定义的符号时,才会去后续指定的库中查找对应的定义。你当前的命令把-lssp放在libstat.a前面:
bin/gcc -include ... -L /home/test_usr/gcc-10.3.0/aarch64-unknown-linux-gnu/lib64/ -lssp -o libtest.so libstat.a
此时链接器先处理libssp.so,但还没有遇到任何未定义的__stack_chk_fail符号,因此不会将该符号的定义引入到输出文件中;后续处理libstat.a时,虽然发现了未定义的__stack_chk_fail,但后面已经没有其他库可供查找,最终符号依然保持未定义状态。
2. 缺少生成动态库的必要选项
你的命令中没有添加-shared参数,gcc默认会生成可执行文件而非动态库,这会导致输出的libtest.so并非标准的动态链接库,进一步影响符号的处理逻辑。
修正后的构建命令
将libstat.a放在-lssp之前,并添加-shared选项:
bin/gcc -shared -include ... -L /home/test_usr/gcc-10.3.0/aarch64-unknown-linux-gnu/lib64/ libstat.a -lssp -o libtest.so
验证结果
执行修正后的命令后,再用nm检查符号状态:
nm libtest.so | grep __stack_chk_fail
此时应该能看到符号已被正确解析(不再是U标记的未定义状态)。
内容的提问来源于stack exchange,提问作者Kiran
相关产品推荐
相关产品推荐

