我正在尝试使用 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。”
现在是问题:
- 这段代码是什么?
- 这些 asm 指令只是 64 位的?是这样吗,请重写它以便在我的 32 位系统(32 位 Intel Celeron M)上做同样的事情?
- 我可能怀疑编译器安装问题(编译器和所需的依赖项是使用
rpm -ivh --force
选项从 rpm 安装在现有和更新的 gcc 之上)?在这种情况下,您能否给我一个应该在我的 32 位机器上编译的使用 asm 指令的代码示例? - 还有什么我可以尝试修复编译错误(好吧,使用空定义与 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) 不确定您在这里要求的是什么?
请注意,我试图在我的回答中读懂您的想法,如果我今天的“力量”不强,我深表歉意,并且我已经回答了您所要求的其他问题。如果您发布:
- 一些使用这些宏的代码。
- 假设它是一个开源项目,您从中获取源代码的“项目”是什么。然后就可以下载源代码并浏览并了解它的作用。
关于c++ - BFD_RELOC_64 : Compiling assembler directives on a 32 bit linux with C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23770351/