所以现在我正在尝试在我的反向工具中解析函数调用及其名称

,我遇到的问题是诸如printf和fwrite之类的库函数在其中没有对应的地址符号表与实际程序中的函数不同,它们确实在符号表中包含虚拟地址,因此当它们被静态调用时,我可以解析它们的名称

我基本上想解析函数名称,甚至是静态库类似于readelf的功能一样的函数(我尝试过readelf,实际上它确实解析了printf的名称,即使它说符号表中的printf的地址值为0也不像其他函数,所以不确定如何实现内部的printf偏移plt)

所以我有以下问题:


如何在PLT中查找printf的索引或地址,以便在看到“呼叫地址”
为什么符号表不包含这些函数的虚拟地址不同于代码中的函数?考虑到这些都是静态库并且在该程序中静态链接,它们是否应该像其他函数一样具有固定地址?
该程序只是main内部的一个printf函数,仅包含stdio.h,现在我的理解是我静态地包括了stdio.h,因为我一开始就将其包括在内,并且在编译时未使用任何特定选项。那么为什么要进入PLT而不是.text节并具有静态地址呢?我想当我在开始时包含一个库时,它基本上是将其复制并粘贴到我的.text部分中吗?

#1 楼


如何在PLT中查找printf的索引或地址,以便当我看到“呼叫地址”时可以解析其名称。


PLT中存在函数时(过程链接表)部分,这意味着它的地址在编译时未知,并且必须在运行时由动态链接器解析。但是,只要知道某个函数在程序中的某个时刻被调用,就可以使用objdump之类的工具,该工具将向您显示函数名称,后跟@plt,如下所示: >

为什么符号表不包含这些函数的虚拟地址,而不是代码中的函数?考虑到这些是静态库并且在该程序中是静态链接的,它们是否应该像其他函数一样具有固定地址?


因为它们不是静态链接的(请参见回答第一个问题)。它们没有固定地址,因为这些地址将在运行时解析。


那么为什么要进入PLT而不是.text节并具有静态地址呢?我想当我在开始时包含一个库时,基本上就是将其复制并粘贴到我的.text部分中吗? 。 .h文件包括在内,它们通常仅包含声明。因此,您无需包括在.h中声明的函数的编译定义,而仅包括原型。链接器负责将程序与其中使用的库链接。它们仍然可以静态或动态链接,并且由于动态链接可以避免将整个库的代码复制到每个可执行文件中,因此通常代替静态代码使用。 >