我正在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