通过dlsym访问阴影全局变量不起作用

时间:2011-01-06 07:58:29

标签: c++ c linux

int myvar=100;

main()
{
  pid_t (*f) (void );
  int *ip;
  int myvar=10;

  f = (pid_t(*) (void)) dlsym(RTLD_NEXT, "getpid");
  ip = (int *) dlsym(RTLD_NEXT, "errno");
  if (ip) 
    printf("%d \r\n", *ip);
  ip = (int *) dlsym(RTLD_NEXT, "myvar");
  if (ip) 
    printf("%d \r\n", *ip);  //not work where is i am wrong
}

3 个答案:

答案 0 :(得分:2)

libc导出getpiderrno符号。 myvvar符号位于您的可执行文件中,可能未导出。

Objdump -T将帮助您检查符号是否已导出。

$ objdump -T /lib/libc.so.6 | grep -w getpid
00c9c570 g    DF .text  00000036  GLIBC_2.0   getpid

答案 1 :(得分:1)

myvar通常不会导出到动态符号表中,除非您在链接时使用-rdynamic之类的链接器标记。

答案 2 :(得分:0)

为什么不使用C ++范围运算符:

::myvar = myvar + 1;

然后命名空间。