编辑:感谢@NateEldredge,我在如何在 C 源文件中“标记”位置以供以后断点定义中更好地定义了我的问题?
我使用这些标签在 gdb 中设置断点。因此,无论我在标签之后/之前添加/删除代码行,断点仍然是正确的。
如果我添加-Wno-error=unused-label到编译选项,编译器不会对我大喊大叫,但标签会从程序集中消失。
相反,如果我__attribute__((unused))在代码中使用,结果是相同的:没有抱怨,但标签消失了。
有没有正确的方法来完成这个任务(而不仅仅是黑客)?
这是我的玩具示例:
int main(void){
int a = 15;
label: __attribute__((unused))
a = a + 23;
return a;
}
Run Code Online (Sandbox Code Playgroud)
编译后结果为:
main:
push ebp
mov ebp, esp
sub esp, 16
mov DWORD PTR [ebp-4], 15
add DWORD PTR [ebp-4], 23
mov eax, DWORD PTR [ebp-4]
leave
ret
Run Code Online (Sandbox Code Playgroud)
这是同一示例的交互式版本: https: //godbolt.org/z/zTqd9bM6q
int main(void){
int a = 15;
label: __attribute__((unused))
a = a + 23;
return a;
}
Run Code Online (Sandbox Code Playgroud) 问题: 我希望能够在我的 C 代码中放置不同的潜在唯一或重复的“标签”,以便我可以在 gdb 中使用它们来创建断点。
类似工作:
行号断点:与源代码行上的断点的主要区别在于,如果以导致或多或少的行的方式修改标记之前的代码,则对标记的引用在语义上仍然是正确的,对源代码行的引用则不会。
标签:我来自上一个问题,如何告诉 gcc 保留我未使用的标签?,其中我先入为主地认为答案是插入标签。在与平台上知识渊博的成员讨论后,我得知标签的名称在编译后不会保留。C 中未使用的标签将被编译器删除。
注入 asm 标签:与之前的方法相关,如果我在 C 源代码中注入 asm 代码,由于内联函数、编译器优化和缺乏作用域,会出现某些问题。这使得这种方法不稳健。
定义一个虚拟函数:在另一个问题上,Set GDB Breakpoint in C file,有一个有趣的方法,其中可以在代码中放置一个“虚拟”函数,然后在函数调用中添加断点。这种方法的问题在于必须为每个不同的标签复制此类函数的定义。
有更好的解决方案来实现这一点吗?或者从不同的角度来解决所提出的问题?
我是 MISP 的婴儿,我对此感到困惑。
我的问题很简单,lui是MISP中的I型指令:
+------+------+------+--------------------+
|opcode| rs | st | 16bits offset |
+------+------+------+--------------------+
Run Code Online (Sandbox Code Playgroud)
那么,目标寄存器去哪里了?在rs或rt中?还是我错了?