小编onl*_*rra的帖子

如何告诉 gcc 保留我未使用的标签?

编辑:感谢@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 assembly gcc compiler-flags

12
推荐指数
2
解决办法
979
查看次数

如何在 C 源文件中“标记”某个位置以供以后定义断点?

问题: 我希望能够在我的 C 代码中放置不同的潜在唯一或重复的“标签”,以便我可以在 gdb 中使用它们来创建断点。

类似工作:

  • 行号断点:与源代码行上的断点的主要区别在于,如果以导致或多或少的行的方式修改标记之前的代码,则对标记的引用在语义上仍然是正确的,对源代码行的引用则不会。

  • 标签:我来自上一个问题,如何告诉 gcc 保留我未使用的标签?,其中我先入为主地认为答案是插入标签。在与平台上知识渊博的成员讨论后,我得知标签的名称在编译后不会保留。C 中未使用的标签将被编译器删除。

  • 注入 asm 标签:与之前的方法相关,如果我在 C 源代码中注入 asm 代码,由于内联函数、编译器优化和缺乏作用域,会出现某些问题。这使得这种方法不稳健。

  • 定义一个虚拟函数:在另一个问题上,Set GDB Breakpoint in C file,有一个有趣的方法,其中可以在代码中放置一个“虚拟”函数,然后在函数调用中添加断点。这种方法的问题在于必须为每个不同的标签复制此类函数的定义。

有更好的解决方案来实现这一点吗?或者从不同的角度来解决所提出的问题?

c assembly gcc gdb breakpoints

6
推荐指数
1
解决办法
204
查看次数

MIPS lui指令的word格式如何?

我是 MISP 的婴儿,我对此感到困惑。
我的问题很简单,lui是MISP中的I型指令:

+------+------+------+--------------------+
|opcode|  rs  |  st  |    16bits offset   |
+------+------+------+--------------------+
Run Code Online (Sandbox Code Playgroud)

那么,目标寄存器去哪里了?在rsrt中?还是我错了?

assembly mips

3
推荐指数
1
解决办法
3133
查看次数

标签 统计

assembly ×3

c ×2

gcc ×2

breakpoints ×1

compiler-flags ×1

gdb ×1

mips ×1