我正在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它返回一个匹配。我曾经认为自己是一个超级用户,但在此之后我真的很难过。任何意见将不胜感激。从Linux System.map中缺少的函数名称和地址
谢谢
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
你是如何编译代码的?听起来好像代码是用优化开关编译的,在gdb跳过它或system.map与内核不同步的情况下? – t0mm13b 2010-02-20 02:00:21
内核编译时没有进行优化,并且打开了-g(调试信息)。同样,我觉得有趣的是,在同一个文件中定义的相同返回类型和签名的其他函数映射到System.map文件中,并且对调试器可见,但是这个函数神秘地缺失。不过谢谢你的建议。 -jayce – user277453 2010-02-22 14:46:33
我误会了 - 内核是用-Os编译的,而-g是打开的。我试图用-O0进行编译,但是在[kernel root] /net/core/dev.c + 1710和+1717中断了。 – user277453 2010-02-22 20:00:46