2016-09-27 45 views
1

我有一個簡單的命令行應用程序(自定義dir二進制文件),我想對其進行測試。調試符號被啓用,我可以看到我感興趣的全局字符串指針the_full_path_name,輸出objdumpnm -DC - 存儲在符號位置的打印值

是否有可能,在,以某種方式查找那個符號名稱/位置,並打印它指向在使用代碼注入所述存儲器中的內容(即:LD_PRELOAD庫與自定義gcc attribute((constructor))和附加功能)?我需要完成此操作,而不必將gdb附加到流程中。

謝謝。

+0

℃的用詞不當確實不是蘇pport反思。但是如果你知道這個變量,你可以簡單地使用'printf(「%d」,the_var)'(除了'int'使用不同的轉換類型說明符)。 – Olaf

+2

據我所知,這應該可以通過'LD_PRELOAD'。你是否嘗試過使用全局聲明'extern char * the_full_path_name;'(或者其確切類型是什麼)來導入符號,然後打印它? – 2016-09-27 22:18:17

+0

你用'-rdynamic'編譯了程序嗎? – jxh

回答

1

我不確定如果我理解你的問題,但是不管怎樣幫助你?含

文件全局指針

$ cat global.c  
char mylongstring[] = "myname is nulled pointer"; 

$ gcc -fPIC -shared global.c -o libglobal.so 

原始庫

$ cat get_orig.c 
#include <stdio.h>  
extern char * mylongstring; 
char *get() 
{ 
    mylongstring = "get from orig"; 
    return mylongstring; 
} 

$ gcc -fPIC -shared get_orig.c -o libget_orig.so -L. -lglobal 

假圖書館

$ cat get_dup.c 
#include <stdio.h> 
extern char * mylongstring; 
char *get() 
{ 
    mylongstring = "get from dup"; 
    return mylongstring; 
} 

$ gcc -fPIC -shared get_dup.c -o libget_dup.so -L. -lglobal 

全局變量的實際消費:

$ cat printglobal.c 
#include <stdio.h> 

char *get(); 

int main(void) 
{ 
printf("global value=%s\n",get()); 
return 0; 
} 
$ gcc printglobal.c -L. -lglobal -lget_orig -o a.out 

otool輸出

$ otool -L a.out 
a.out: 
     libglobal.so (compatibility version 0.0.0, current version 0.0.0) 
     libget_orig.so (compatibility version 0.0.0, current version 0.0.0) 
     /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0) 

運行a.out

$ DYLD_LIBRARY_PATH=./ ./a.out                                       
global value=get from orig 

替換庫

$ cp /tmp/libget_dup.so libget_orig.so 
$ DYLD_LIBRARY_PATH=./ ./a.out 
global value=get from dup 

順便說一句,我測試此上MAC所以.so是真正爲.dylib