【问题标题】:line number information lost during linking in gcc在 gcc 中链接期间丢失的行号信息
【发布时间】:2014-08-19 14:10:37
【问题描述】:

我正在使用 Red Hat 4.4.7-3 和 gcc 4.8.3

我在两个文件(test.c 和 sum.c)中有代码,我用 gcc 分别编译了它们(带有调试信息)。在最后一个阶段,当我通过合并两个文件来制作最终输出时,调试信息会丢失。

test.c:

int main()
{

    int a=5,b=7;
    int c=testsum(a,b);

    printf("%d + %d=%d\n",a,b,c);
    return 0;
}



sum.c:
int testsum(int a, int b)
{
    return a+b;
}

我做了以下事情:

gcc -c -g test.c -o test.o
gcc -c -g sum.c -o sum.o

gcc -g test.o sum.o -o output

当我执行 gdb sum.o 时,它会显示行号信息

(gdb) l testsum
1   int testsum(int a, int b)
2   {
3       return a+b;
4   }

但是使用 gdb 输出我没有得到行号信息。

(gdb) l testsum 
No line number known for testsum.
(gdb)

我在我的个人笔记本电脑(gcc-4.8.real (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1)上重复了同样的事情,在这里它工作得很好。但是对于某些项目,我需要在 redhat 机器上的最终输出中提供调试信息。

任何有关在最终可执行文件中获取行号信息的建议/cmets 将不胜感激。

【问题讨论】:

  • 顺便说一句:刚刚在最新的 CentOS 6.5 32 和 64 位(gcc 4.4.7-4、binutils 2.20.51... 和 gdb 7.2)上尝试过,它按预期工作。它也适用于开发人员工具集(2.1)。看来您的系统出了点问题。
  • 此答案可能适用:stackoverflow.com/a/18408197/2554472。 gcc 4.8 默认会以旧版本 gdb 无法识别的格式发出调试信息。

标签: debugging gcc linker gdb


【解决方案1】:

你需要编译和链接gcc -g。也许您在链接时忘记了-g 标志。

并且使用肯定要编译 gcc -Wall -g,因为警告非常有用。

您应该在ELF 可执行文件上运行gdb,而不是在目标文件上运行(所以 gdb sum.o 是错误的):

gdb ./output

你应该有一个Makefile(参见this example)并使用GNU make构建你的程序

可能远程 Redhat 服务器上的 gdb 不接受与本地笔记本电脑上相同的 DWARF 格式。检查gdb 的版本。 (也许考虑在远程服务器上编译,或者将一些明确的debugging option-gdwarf-3 或任何适合远程gdb 的东西传递给您的gcc 笔记本电脑编译器)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    相关资源
    最近更新 更多