2013-04-15 73 views
0

我正在嘗試讀取ELF符號表。ELF中的符號地址

我面臨着共享庫的差異,無法理解它背後的原因。

對於libc,使用readelf我得到以下輸出。

Num: Value   Size Type Bind Vis  Ndx Name 
7: 00000033c32160b0 146 FUNC WEAK DEFAULT 11 [email protected]@GLIBC_2.2.5 
8: 00000033c3421000  4 OBJECT WEAK DEFAULT 21 [email protected]@GLIBC_PRIVATE 
9: 00000033c32118f0 382 FUNC GLOBAL DEFAULT 11 [email protected]@GLIBC_PRIVATE 
10: 00000033c3421280 40 OBJECT GLOBAL DEFAULT 21 [email protected]@GLIBC_2.2.5 
11: 00000033c341fdc8  8 OBJECT GLOBAL DEFAULT 17 [email protected]@GLIBC_2.2.5 
12: 00000033c3215f30 252 FUNC WEAK DEFAULT 11 [email protected]@GLIBC_2.2.5 
13: 00000033c3211a70 140 FUNC GLOBAL DEFAULT 11 [email protected]@GLIBC_PRIVATE 
14: 00000033c3216040 52 FUNC WEAK DEFAULT 11 [email protected]@GLIBC_2.2.5 
15: 00000033c341fc88  8 OBJECT GLOBAL DEFAULT 17 [email protected]@GLIBC_PRIVATE 
16: 00000033c3211000 599 FUNC GLOBAL DEFAULT 11 [email protected]@GLIBC_2.2.5 

和爲自己的共享庫的構建使用下列命令

gcc -rdynamic -Wint-to-pointer-cast -g -fPIC -lpthread -c probes.c -ldl -lelf 
gcc -shared -lpthread -Wl,--no-as-needed,-soname,libprobes.so.1 -o libprobes.so.1 mutrace.o -ldl -lelf 

輸出是

Num: Value   Size Type Bind Vis  Ndx Name 
. 
. 
. 
34: 00000000000040d0 66 FUNC GLOBAL DEFAULT 11 pthread_create 
35: 0000000000001d72 109 FUNC GLOBAL DEFAULT 11 thread_local_init 
36: 0000000000002b21 481 FUNC GLOBAL DEFAULT 11 trylock_ret_event 
37: 00000000000030c4 652 FUNC GLOBAL DEFAULT 11 lock_init_event 
38: 0000000000003e4d 130 FUNC GLOBAL DEFAULT 11 pthread_mutex_init 
39: 0000000000004668  0 FUNC GLOBAL DEFAULT 12 _fini 
40: 0000000000003dd0 125 FUNC GLOBAL DEFAULT 11 pthread_cond_timedwait 
41: 0000000000001b03 92 FUNC GLOBAL DEFAULT 11 backtrace 
42: 0000000000001b5f 94 FUNC GLOBAL DEFAULT 11 backtrace_symbols 
43: 0000000000002ee3 481 FUNC GLOBAL DEFAULT 11 unlock_ret_event 
44: 0000000000004026 95 FUNC GLOBAL DEFAULT 11 pthread_mutex_trylock 
45: 0000000000003531 476 FUNC GLOBAL DEFAULT 11 lock_destroy_event 
46: 0000000000004112 1012 FUNC GLOBAL DEFAULT 11 print_symtable 

對於libc中的符號值是絕對的(虛擬地址),但在我的圖書館,這些值是相對的。 什麼決定了這種行爲?

我試過以下信息http://docs.oracle.com/cd/E19082-01/819-0690/chapter6-35166/index.html,但後來當我檢查ELF標題時,兩個庫都有相同的類型。

回答

0

使用以下命令

GCC -rdynamic -Wint到指針鑄造-g -fPIC -lpthread -c probes.c -ldl -lelf
的gcc -shared我自己的共享庫的構建-lpthread -Wl, - 無按需,-soname,libprobes.so.1 -o libprobes.so.1

這些命令是不正確。第一個是彙編命令(因爲-c標誌)。鏈接器選項(-rdynamic,-lpthread等)不屬於它。

第二個命令是鏈接命令,並具有錯誤的庫命令。另外,您忘記了實際使用您編譯的probes.o。這將是更好的:

gcc -shared -o libprobes.so.1 -Wl,-soname=libprobes.so.1 probes.o -lpthread 

對於libc中的符號值是絕對的

不,他們不是。您的libc顯然已在地址0x33c3210000(或類似地址)預先鏈接。這並不是絕對的。您可以撤銷預先鏈接(請參閱man prelink),您將在libc.so.6中看到類似的「相對」地址。

+0

感謝我的命令更正。你的解釋回答了我的問題。 – Kumaran