为何frida-trace能识别macOS/Clang编译函数却无法识别Ubuntu/GCC二进制函数?
问题原因
Linux平台下GCC默认编译生成的ELF格式可执行文件,只会将需要和动态库交互的符号放入动态符号表(.dynsym节),你代码里的fx、main这类内部函数默认仅存在于常规调试符号表(.symtab节)。而frida-trace默认仅扫描模块的动态符号表匹配函数规则,因此无法识别到对应函数。
解决方案
编译时添加-rdynamic参数,该参数是-Wl,--export-dynamic的简写,会通知链接器将所有全局符号添加到动态符号表中,符合frida-trace的扫描规则:
gcc -g -O0 -rdynamic test.c
如果你不需要导出全部全局符号,也可以使用细粒度的导出参数,仅导出指定函数:
gcc -g -O0 -Wl,--export-dynamic-symbol=fx -Wl,--export-dynamic-symbol=main test.c
验证方法
编译完成后执行readelf -s a.out查看动态符号表,即可看到fx和main的条目,此时再运行frida-trace ./a.out -i 'a.out!*'就能正常跟踪到目标函数。
你之前调整符号可见性参数未生效,是因为这类参数默认针对动态库的符号导出控制,对主程序不生效,必须通过上述参数强制主程序导出全局符号到动态符号表。
内容的提问来源于stack exchange,提问作者user3909192
相关产品推荐
相关产品推荐

