Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
!编译器只留下一个存根,C++中,在.O文件中找到这些“存根”_C++_Assembly_Compiler Construction_Linker - Fatal编程技术网

!编译器只留下一个存根,C++中,在.O文件中找到这些“存根”

!编译器只留下一个存根,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()

我想要达到的目标

在编译时,编译器知道函数调用是正确的 有效,因为您包含了iostream头文件,但是 函数不是cpp文件的一部分,编译器只留下一个存根 在呼叫站点。链接器遍历对象文件,然后 对于每个存根,它会找到正确的函数地址并替换存根 使用正在创建的另一个对象文件中的正确地址 链接。亚历克斯·艾伦,跳到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的反汇编,您将看到所有这些零都被其他值替换,即代码使用的地址、函数、变量等的偏移量。

在本文中,存根并不意味着一个小函数。相反,它指的是一个小的占位符值。注意,在十六进制偏移量109、120、125等处,4个字节是如何为零的?那是存根。当链接器处理对象文件时,它将查看存储在对象文件其他位置的重定位表。此表包括对其他符号的引用以及代码/数据的哪些部分使用这些符号。一旦链接器找到该符号的定义位置,它将重新定位这些存根值以指向正确的地址。如果要从实际可执行文件中查看main的反汇编,您将看到所有这些零都被代码使用的其他值(即地址、函数偏移量、变量等)替换。

存根似乎是一行中的三个调用语句,它们只是相互调用。不知道它是如何工作的。这实际上是x86指令编码的结果-在最终的可执行文件中,它们被重定向到其他位置,即其他函数。存根似乎是一行中的三个调用语句,它们只是相互调用。不知道如何工作。这实际上是x86指令编码的结果-在最终可执行文件中,它们被重定向到其他位置,即其他函数。使用objdump-dr main.o将在反汇编输出中显示这些重新定位记录,使用objdump-dr main.o将在反汇编输出中显示这些重新定位记录,从而使这一切的工作方式更加清晰。