C - 存储在符号位置

时间:2016-09-27 22:05:40

标签: c linux ld ld-preload nm

我想要一个简单的命令行应用程序(自定义dir二进制文件)。调试符号已启用,我可以在the_full_path_nameobjdump的输出中看到我感兴趣的全局字符串指针nm -D

是否有可能在中以某种方式查找符号名称/位置,并使用代码注入打印它指向的内存内容(即:LD_PRELOAD库具有自定义{ {1}}和其他功能)?我需要在不必将gcc attribute((constructor))附加到流程的情况下完成此任务。

谢谢。

1 个答案:

答案 0 :(得分: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

BTW,我在MAC上对此进行了测试,因此.so对于.dylib

来说真的是用词不当