我不確定如果我理解你的問題,但是不管怎樣幫助你?含
文件全局指針
$ 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
℃的用詞不當確實不是蘇pport反思。但是如果你知道這個變量,你可以簡單地使用'printf(「%d」,the_var)'(除了'int'使用不同的轉換類型說明符)。 – Olaf
據我所知,這應該可以通過'LD_PRELOAD'。你是否嘗試過使用全局聲明'extern char * the_full_path_name;'(或者其確切類型是什麼)來導入符號,然後打印它? – 2016-09-27 22:18:17
你用'-rdynamic'編譯了程序嗎? – jxh