【问题标题】:!the compiler just leaves a stub! ,C++, find these "stubs" in .o file!编译器只留下一个存根! ,C++,在 .o 文件中找到这些“存根”
【发布时间】:2013-07-12 20:33:53
【问题描述】:

我想要实现的目标

在编译的时候,编译器就知道函数调用是 有效,因为您包含了 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

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 在这个输出中寻找“存根”?

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

【问题讨论】:

  • 存根似乎是连续的三个call 语句,它们只是相互调用。不知道它是如何工作的。
  • 这实际上是 x86 指令编码的结果 - 在最终的可执行文件中,它们被重定向到其他位置(即其他功能)。

标签: c++ assembly compiler-construction linker


【解决方案1】:

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

【讨论】:

  • 使用objdump -dr main.o 将在反汇编输出中显示这些重定位记录,从而更清楚这一切是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
相关资源
最近更新 更多