我怎样才能制作gdb" grok"用内嵌汇编编写的函数?

时间:2016-12-16 21:10:04

标签: 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不明白如何&#34;步入&#34; calltest函数。在step行上运行printf命令只需直接进入printf,完全跳过calltest来电。请注意,在我目前的用例中,步入calltest本身对我来说并不是一个问题,但令我困扰的是,gdb甚至会跳过对calledtest的整个调用。 。我当然可以通过步进指令进入calltestcalledtest,但这可能非常繁琐,尤其是在具有复杂表达式和/或其他函数调用的行上调用calltest时。

如果我将calltest函数放入我自己的单独的汇编文件中,我用GAS编译,我可以简单地将-g标志传递给GAS,gdb将完全按预期工作,但我&# 39;我不知道有什么办法让GCC做内联汇编的任何事情,我确实需要内联汇编,因为我使用CPP宏生成这些小的存根,作为更大库的一部分。

在我看来,这可以修复以某种方式,因为calltest似乎非常类似于gdb肯定没有问题的标准PLT存根,但我不会&# 39;不知道如何为那些人生成调试信息。

所以我的问题是双重的:首先,gdb真正想要的是什么样的信息&#34;理解&#34;这些功能,其次,如何生成它?

1 个答案:

答案 0 :(得分:3)

.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"
);