我试图在使用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。"
现在的问题是:
rpm -ivh --force
选项从现有的和更新的gcc上的rpms安装的)?在这种情况下,你能给我一个使用asm指令的代码示例,它应该在我的32位盒子上编译吗?答案 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)不确定你在这里要求什么?
请注意,我正试着在我的回答中读到你的想法,如果我的“力量”今天不强,我会道歉,而且我已经回答了你所要求的其他事情。如果您发布了以下内容,那将非常有帮助(供将来参考)