2013-03-12 122 views
1

我有Linux內核和我一起努力產生它ELF頭使用objcopy把工具, 下面是第一步當運行readelf爲什麼我得到這個輸出-s

 objcopy -I binary -B i386 -O elf32-i386 --rename-section .data=.text linux_kernel.bin main.o 

並在此之後,我想使用readelf -S main.o,但得到奇怪的符號讀符號表,下面是輸出

Symbol table '.symtab' contains 5 entries: 
    Num: Value Size Type Bind Vis  Ndx Name 
0: 00000000  0 NOTYPE LOCAL DEFAULT UND 
1: 00000000  0 SECTION LOCAL DEFAULT 1 
2: 00000000  0 NOTYPE GLOBAL DEFAULT 1 _binary_linux_kernel_bin_ 
3: 004df650  0 NOTYPE GLOBAL DEFAULT 1 _binary_linux_kernel_bin_ 
4: 004df650  0 NOTYPE GLOBAL DEFAULT ABS _binary_linux_kernel_bin_ 

現在應該可以看到像

_binary_linux_kernel_bin_start 
_binary_linux_kernel_bin__end 
_binary_linux_kernel_bin_size 
符號

任何機構可以讓我知道我在做什麼錯?還是預計一個?

爲什麼我想看看正確的符號,因爲必須做類似下面一個

--entry_point=_binary_linux_kernel_bin_start 
+0

你確定輸出不僅被截斷嗎?你有沒有在更大的終端窗口嘗試? – 2013-03-12 13:16:46

+0

是的,在這個特定的輸出結束後,我可以看到整個大的線。 – 2013-03-12 13:19:26

+0

它不是截斷的終端。它是'readelf'。 – 2013-03-12 16:56:41

回答

1

這僅僅是該字符串是太長,readelf被截斷。嘗試objdump -x main.o

+0

'Thanks Bills「objdump -x main.o」顯示我「_binary_linux_kernel_bin_start」,但只有一個想知道的是_binary_linux_kernel_bin_start = _start ?? – 2013-03-12 17:32:34

+0

它將是'零'。 「objcopy」的工作方式是可以創建一個二進制文件並將其放入一個對象中。 '_start'不會是內核的起始地址。如果您將'main.o'鏈接到其他對象並創建最終的精靈,那麼'_binary_linux_kernel_bin_start'將成爲圖像中的地址。您不能從二進制文件創建Linux加載地址。這些信息消失了。 – 2013-03-12 22:39:42

8

可以使用readelf -W -s main.o命令,其中-W告訴readelf不要將輸出截斷爲80個字符的寬度。

+1

+1你是一個比我更好的「男人」。 – 2013-03-12 22:51:14