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

nis*_*013 1 c++ compiler-construction assembly linker

我想要实现的目标

在编译时,编译器知道函数调用是有效的,因为你包含了iostream头文件,但由于该函数不是cpp文件的一部分,编译器只是 在调用站点留下一个存根.链接器遍历目标文件,对于每个存根,它会找到正确的函数地址,并使用正在链接的其他目标文件中的正确地址替换存根.作者: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
Run Code Online (Sandbox Code Playgroud)

在单独的文件中超过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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但是现在我在这个输出中被困在为myFunc找到"stub"?

有人可以帮我吗?或者建议我实现这一目标的另一种策略?

Dre*_*wen 7

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