Linux System.map中缺少函数名称和地址

时间:2010-02-20 01:40:28

标签: linux-device-driver embedded-linux debug-symbols objdump

我正在AT91SAM9263板上进行嵌入式开发并遇到一个奇怪的问题。它正在运行debian Linux内核2.6.18.4,并与arm-linux-gcc 3.4.6交叉编译,并使用uClibc-0.9.28作为C库。我正在调试内核设备驱动程序,并且System.map文件中没有出现特定的功能。可以理解,因此我无法在其上设置断点。奇怪的是,如果我闯入其调用函数,我无法进入它 - 使用gdb的nexti命令执行它但跳过源代码。该函数是atmel_rx_chars(struct uart_port * port)。它是atmel_serial.c中声明的静态void函数,其示例出现在[1]。在同一个文件中有其他静态void函数(例如atmel_tx_chars(struct uart_port * port)),它们在同一个文件中声明,实际上在System.map文件中被索引。根据[2],“System.map由'nm vmlinux'生成,不相关或不感兴趣的符号被剔除。”我尝试使用nm(以及objdump)来查看所有符号,但它仍然没有出现在输出中。但是,当我grep atmel_rx_chars vmlinux时,它会返回一个匹配项。我曾经认为自己有点高级用户但在此之后我真的很难过。任何建议都会非常感激。

谢谢,

Jayce

[1] http://lxr.free-electrons.com/source/drivers/serial/atmel_serial.c#L379
[2] http://www.faqs.org/docs/Linux-HOWTO/Kernel-HOWTO.html#systemmap

2 个答案:

答案 0 :(得分:2)

您没有看到它的原因是因为编译器正在内联该函数。它被声明为静态并且只在一个地方调用,因此编译器会将其内联。如果要在其上放置断点,请更改源,使其不再声明为静态并重新编译。

答案 1 :(得分:0)

对于任何可能感兴趣的人,我无法弄清楚为什么它没有将atmel_rx_chars映射到System.map中的地址。您仍然可以正常设置断点,以便在这种情况下进行调试。我想在我寻找答案时应该更加明显。无论如何在gdb命令行类型

b source_file.c:line#

所以在这个例子中,它将是

b atmel_serial.c:381

每当你点击“缺失”例程时它就会中断。不过,这仍然是一个不完整的解决方案。分解为特定的行但它不会离开调用函数的堆栈帧(atmel_handle_receive),因此gmel无法访问atmel_rx_chars的本地。一如既往,任何帮助或见解将不胜感激。希望如果其他人遇到这个问题或类似的问题,这可以作为一个很好的起点。

谢谢,

Jayce