c++ - BFD_RELOC_64 : Compiling assembler directives on a 32 bit linux with C++

标签 c++ linux gcc assembly

我正在尝试使用 GCC 4.4.1 在 32 位 Linux 上编译下面的代码。

#ifndef WIN32
    #define DEBUG_STOP_POINT()                     \
        asm ( " 0 : int3 ; "                       \
              " .pushsection embed-breakpoints ; " \
              " .quad 0b ; "                       \
              " .popsection ; " )

        #if defined ( _DEBUG ) && defined ( _ASPECT_DEBUG )
            #define THROW_BREAKPOINT()                     \
                asm ( " 0 : int3 ; "                       \
                      " .pushsection embed-breakpoints ; " \
                      " .quad 0b ; "                       \
                      " .popsection ; " )
        #else
            #define THROW_BREAKPOINT()                         \
                asm ( " 0 : .pushsection embed-breakpoints ; " \
                      " .quad 0b ; "                           \
                      " .popsection ; " )
        #endif
#else
    #define DEBUG_STOP_POINT()
    #define THROW_BREAKPOINT()
#endif

它取自在同一 Linux 的 64 位版本上运行的 64 位项目,在该 Linux 上使用同一 GCC 4.4.1 编译时没有问题。每个使用 THROW_BREAKPOINT()(从未使用过 DEBUG_STOP_POINT())的地方都会发出编译错误:“无法表示重定位类型 BFD_RELOC_64。”

现在是问题:

  1. 这段代码是什么?
  2. 这些 asm 指令只是 64 位的?是这样吗,请重写它以便在我的 32 位系统(32 位 Intel Celeron M)上做同样的事情?
  3. 我可能怀疑编译器安装问题(编译器和所需的依赖项是使用 rpm -ivh --force 选项从 rpm 安装在现有和更新的 gcc 之上)?在这种情况下,您能否给我一个应该在我的 32 位机器上编译的使用 asm 指令的代码示例?
  4. 还有什么我可以尝试修复编译错误(好吧,使用空定义与 WIN32 情况有所不同)?

最佳答案

1) 显然,如果没有一些上下文,很难确切地说出为什么代码在那里,但这就是它“做”的事情:

    asm ( " 0 : int3 ; "                       \     # INT3 = Breakpoint instruction
          " .pushsection embed-breakpoints ; " \
          " .quad 0b ; "                       \     # Trap detection address
          " .popsection ; " )

pushsection 和 popsection 改变数据所在的部分(通过保存在堆栈上,然后恢复到原来的状态(通常是 .text,但显然是其他一些内联汇编程序或 #pragma 可能在此特定点之前已更改。

对于 32 位代码,您可能需要 .long 而不是 .quad 作为陷阱检测地址 - 这将使此引用成为 32 位值而不是 64 位值 - 链接器不会喜欢 64 位值......我不知道 embed-breakpoints 部分的确切目的是什么 - 它可能被扫描到了解实际断点发生的位置,或类似的地方。它存储0: 的地址,换句话说就是int3 指令的地址。

显然,#if _DEBUG ... 位只是一种为调试选择断点或为非 Debug模式选择无断点代码变体的方法。

2) 您真的不得不问编写代码的人 - 我认为没有必要使用 32 位。

3) 呃?我们无法根据您的要求判断您安装了什么,也无法判断它是否安装“正确”。至于示例,我很确定有教程,但是将 .quad 更改为 .long 应该可以修复帖子标题中的直接错误 - 当然,那里很可能是一些实际使用此内容的其他代码也可能需要更改。

4) 不确定您在这里要求的是什么?

请注意,我试图在我的回答中读懂您的想法,如果我今天的“力量”不强,我深表歉意,并且我已经回答了您所要求的其他问题。如果您发布:

  1. 一些使用这些宏的代码。
  2. 假设它是一个开源项目,您从中获取源代码的“项目”是什么。然后就可以下载源代码并浏览并了解它的作用。

关于c++ - BFD_RELOC_64 : Compiling assembler directives on a 32 bit linux with C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23770351/

相关文章:

c++ - 调试断言失败 c >= -1 && c <= 255

c++ - 带有 SURF 的 OpenCV C++ 'Access Violation'

linux - 汇编文件 (*.asm) 的 gedit 语法高亮显示

linux - 逻辑上受到打击

c - 变质示例代码

c++ - 从 MinGW 链接到 MSVC DLL

c++ - 哪种检查对象类型的方法更好?

linux - 如何使用新名称制作文件的副本,并在文件名中包含原始文件的时间戳?

c++ - 不同的函数使用相同的函数,减少开销

c++ - 伺服驱动程序代码使伺服行为异常