我想要达到的目标
在编译时,编译器知道函数调用是 有效,因为您包含了 iostream 头文件,但自那以后 函数不是 cpp 文件的一部分,编译器只留下一个 stub 在呼叫站点。链接器遍历目标文件,并且 每个存根,它找到正确的函数地址并替换存根 来自其他目标文件之一的正确地址是 已链接。 作者:ALEX ALLAN,跳转到 C++
在上面的“存根”中,我想在真实的目标文件中看到。
我做了如下,
代码 //main.cpp
#include "f.h"
using namespace std;
int main()
{
myfunc();
return 0;
}
//f.cpp
#include "f.h"
void myfunc()
{
}
//f.h
#ifndef F_H_INCLUDED
#define F_H_INCLUDED
void myfunc();
#endif // F_H_INCLUDED
以上 3 个在单独的文件中。
我在 main.o 上使用的 objdump 命令
C:\Users\User\Downloads\binutils-2.22-1-mingw32-bin.tar\binutils-2.22-1-mingw32-
bin\bin>objdump.exe -S -C C:\Users\User\Documents\myC++\testFuncstabs\obj\Debug\
main.o
但现在我只能在这个输出中寻找 myFunc 的“存根”?
有人可以帮我吗?或者建议我另一种策略来实现这个目标?
在此上下文中的“存根”并不意味着小函数。相反,它指的是一个小的占位符值。请注意,在十六进制偏移量
109
、120
、125
等中,4 个字节为零?这就是存根。当链接器处理目标文件时,它将查看存储在目标文件其他位置的“重定位表”。该表包括对其他符号的引用以及代码/数据的哪些部分使用这些符号。一旦链接器找到定义该符号的位置,它将替换(也称为重新定位)那些“存根”值以指向正确的地址。如果您要从实际可执行文件中查看 main
的反汇编,您会看到所有这些零都被其他值替换(又名代码使用的函数、变量等的地址(更确切地说,偏移量))。