!编译器只留下一个存根,C++中,在.O文件中找到这些“存根”
我想要达到的目标 在编译时,编译器知道函数调用是正确的 有效,因为您包含了iostream头文件,但是 函数不是cpp文件的一部分,编译器只留下一个存根 在呼叫站点。链接器遍历对象文件,然后 对于每个存根,它会找到正确的函数地址并替换存根 使用正在创建的另一个对象文件中的正确地址 链接。亚历克斯·艾伦,跳到C++ 在上面的存根中,我希望看到真实的对象文件 我所做的如下: 代码 //main.cpp!编译器只留下一个存根,C++中,在.O文件中找到这些“存根”,c++,assembly,compiler-construction,linker,C++,Assembly,Compiler Construction,Linker,我想要达到的目标 在编译时,编译器知道函数调用是正确的 有效,因为您包含了iostream头文件,但是 函数不是cpp文件的一部分,编译器只留下一个存根 在呼叫站点。链接器遍历对象文件,然后 对于每个存根,它会找到正确的函数地址并替换存根 使用正在创建的另一个对象文件中的正确地址 链接。亚历克斯·艾伦,跳到C++ 在上面的存根中,我希望看到真实的对象文件 我所做的如下: 代码 //main.cpp #include "f.h" using namespace std; int main()
#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的反汇编,您将看到所有这些零都被其他值替换,即代码使用的地址、函数、变量等的偏移量。在本文中,存根并不意味着一个小函数。相反,它指的是一个小的占位符值。注意,在十六进制偏移量109、120、125等处,4个字节是如何为零的?那是存根。当链接器处理对象文件时,它将查看存储在对象文件其他位置的重定位表。此表包括对其他符号的引用以及代码/数据的哪些部分使用这些符号。一旦链接器找到该符号的定义位置,它将重新定位这些存根值以指向正确的地址。如果要从实际可执行文件中查看main的反汇编,您将看到所有这些零都被代码使用的其他值(即地址、函数偏移量、变量等)替换。存根似乎是一行中的三个调用语句,它们只是相互调用。不知道它是如何工作的。这实际上是x86指令编码的结果-在最终的可执行文件中,它们被重定向到其他位置,即其他函数。存根似乎是一行中的三个调用语句,它们只是相互调用。不知道如何工作。这实际上是x86指令编码的结果-在最终可执行文件中,它们被重定向到其他位置,即其他函数。使用objdump-dr main.o将在反汇编输出中显示这些重新定位记录,使用objdump-dr main.o将在反汇编输出中显示这些重新定位记录,从而使这一切的工作方式更加清晰。