我正在写一个使用ptrace(singlestep,getregs,pick_text,opcodes比较等)跟踪所有系统调用和二进制文件(elf)调用的小程序。Printf Symbol Resolution
到目前为止,我已经成功跟踪系统调用和简单的调用,如用户定义的函数。
但是我没有从我选择的地址获取printf符号的名称,这要感谢ptrace。
我的问题是:对于像printf,strlen等动态链接函数,我如何从elf文件中检索地址中的符号名称?
简单的调用很简单,我运行.strtab部分,当地址匹配时返回相应的str。
但是对于printf,该符号在.strtab中已知,但地址为“0”。
objdump -d以某种方式成功地将呼叫链接到printf及其地址。
你有什么想法吗?
是否涉及动态链接? – fuz
在glibc中,由于设防补丁,'printf'的符号实际上被称为'__printf_chk'。在调用'printf'的目标文件上运行'nm',你会看到。一般来说,看看如何解析精灵文件的libelf。我建议你不要手动解析它们。 – fuz
我已经在使用libelf。而实际上,如果我使用nm,我可以看到“printf”符号,但没有看到它的地址,符号标有“未定义”的“U”字母。这是我的问题,我使用该函数的地址来检索其名称。但是如果该地址没有储存在精灵中,我无法检索该名称。是的,libc是动态链接的我猜 –