c - 如何使 gdb "grok"函数编写成在线汇编?

标签 c gcc gdb

考虑以下用于 GCC 的简单程序:

#include <stdio.h>

int calledtest(int a)
{
    return(a + 5);
}

asm(
    ".pushsection .text;"
    ".type calltest, @function;"
    "calltest:"
    "  call calledtest;"
    "  ret;"
    ".size calltest, .-calltest;"
    ".popsection;"
);

int calltest(int);

int main(int argc, char **argv)
{
    printf("%i\n", calltest(2));
    return(0);
}

该程序按预期运行,但我的问题是,在 gdb 中运行它时,gdb 不理解如何“进入”calltest 函数。在 printf 行上运行 step 命令直接进入 printf,完全跳过 calltest 调用。请注意,在我当前的用例中,进入 calltest 本身对我来说并不是真正的问题,但更让我困扰的是 gdb 甚至跳过了对 calltest 的整个调用。我当然可以通过步进指令进入 calltestcalltest ,但这可能非常乏味,尤其是当 calltest 在一行上被调用时复杂的表达式和/或其他函数调用。

如果我将 calltest 函数放入它自己的、用 GAS 编译的单独的汇编文件中,我可以简单地将 -g 标志传递给 GAS 并且 gdb 将工作完全符合预期,但我不知道有什么方法可以让 GCC 做任何与内联汇编类似的事情,而且我确实需要内联汇编,因为我用 CPP 宏生成了我的这些小 stub 作为更大库的一部分。

在我看来,这可以以某种方式修复,因为 calltest 似乎与 gdb 肯定没有问题的标准 PLT stub 非常相似,但是我不知道如何为这些生成调试信息。

所以我的问题有两个:首先,gdb 真正在寻找什么样的信息来“理解”这些函数,其次,我如何生成它?

最佳答案

.loc.cfi_* 指令似乎可以做到这一点。为了使 .loc 正常工作,我必须将每条指令放在单独的行中:

asm(
    ".pushsection .text\n"
    ".type calltest, @function\n"
    "calltest:\n"
    ".loc 1 14 0\n"
    ".cfi_startproc\n"
    "  call calledtest\n"
    "  ret\n"
    ".cfi_endproc\n"
    ".size calltest, .-calltest\n"
    ".popsection\n"
);

关于c - 如何使 gdb "grok"函数编写成在线汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41192462/

相关文章:

c - 添加到指针时出现意外结果

c++ - Code::Blocks 和 boost 1.55:存在动态库时不使用静态库

gdb\bfd : get child variable address or size or offset

c - float 不精确

c++ - 使用 -O2 标志将 gdb 步进到上一行

c - 当在 C 中的字符串中分配时,ASCII 字符 14(和其他)

c++ - DLL缓存问题

c - 如何在 arm v7 中导致数据中止和预取中止

将字节数组转换为整数

c++ - 禁用 "temporary to non-const reference"错误的 G++ 标志