在非库类型C项目中使用LibFuzz遇链接错误:函数未定义求助
LibFuzz链接静态库出现未定义引用的解决办法
问题场景
给一个原本编译为可执行文件的C项目做LibFuzz模糊测试,执行了以下步骤:
- 通过项目自带Makefile编译生成目标文件
- 用
ar rcs libmylib.a a.o b.o ...将目标文件打包为静态库 - 执行链接命令:
链接器报错:clang++ -Wall -fsanitize=fuzzer -Wno-cpp -Wpedantic -std=c++11 -O2 -g -I/usr/include/libxml2 -g -O2 -rdynamic -o fuzzing libmylib.a fuzztarget.cc -lcurl -lxml2 -I.Undefined reference to function_xy(),能找到函数声明但找不到实现。
排查与解决步骤
检查静态库是否包含目标符号
用nm命令验证静态库中是否存在function_xy的实现:nm libmylib.a | grep function_xy如果无输出,说明打包静态库时漏了包含该函数的目标文件。回到项目编译目录,找到对应目标文件(如
xy.o),重新执行ar rcs libmylib.a 所有必要的.o文件。调整链接顺序
Clang/GCC链接器按从左到右顺序解析符号,静态库必须放在引用它的源文件/目标文件之后。修改链接命令,将libmylib.a移至fuzztarget.cc之后:clang++ -Wall -fsanitize=fuzzer -Wno-cpp -Wpedantic -std=c++11 -O2 -g -I/usr/include/libxml2 -rdynamic -o fuzzing fuzztarget.cc libmylib.a -lcurl -lxml2 -I.对齐编译选项
确认项目Makefile编译目标文件时的选项(如-fPIC、编译宏-DDEBUG、优化级别-O等),与链接fuzztarget时的选项保持一致。如果项目编译时用了特定宏定义,链接命令也要同步添加,否则可能因符号不一致导致未定义引用。跳过静态库打包,直接链接目标文件
避免手动打包静态库可能漏文件的问题,直接将项目所有目标文件与fuzztarget.cc一起链接:clang++ -Wall -fsanitize=fuzzer -Wno-cpp -Wpedantic -std=c++11 -O2 -g -I/usr/include/libxml2 -rdynamic -o fuzzing fuzztarget.cc a.o b.o ... -lcurl -lxml2 -I.
内容的提问来源于stack exchange,提问作者niklbird
相关产品推荐
相关产品推荐

