在gcc中链接期间丢失的行号信息

时间:2014-08-19 14:10:38

标签: debugging gcc linker gdb

我正在使用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机器的最终输出中为某个项目提供调试信息。

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

1 个答案:

答案 0 :(得分: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笔记本电脑编译器)。