BFD_RELOC_64:使用C ++在32位Linux上编译汇编程序指令

时间:2014-05-20 21:33:12

标签: 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位项目,它在同一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选项从现有的和更新的gcc上的rpms安装的)?在这种情况下,你能给我一个使用asm指令的代码示例,它应该在我的32位盒子上编译吗?
  4. 我还可以尝试修复编译错误(好吧,使用空定义与WIN32案例不同)?

1 个答案:

答案 0 :(得分:2)

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 ...位只是为调试选择断点或非调试模式的代码没有断点变化的一种方法。

2)你真的不得不问问谁写了代码 - 没想到需要32位,我期待。

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

4)不确定你在这里要求什么?

请注意,我正试着在我的回答中读到你的想法,如果我的“力量”今天不强,我会道歉,而且我已经回答了你所要求的其他事情。如果您发布了以下内容,那将非常有帮助(供将来参考)

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