Доступ к теневой глобальной переменной в C через dlsym не работает - PullRequest
1 голос
/ 06 января 2011
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 ]

2 голосов
/ 06 января 2011

Символы getpid и errno экспортируются libc.myvvar символов находится в вашем исполняемом файле и, вероятно, не экспортируется.

Objdump -T поможет вам проверить, экспортирован символ или нет.

$ objdump -T /lib/libc.so.6 | grep -w getpid
00c9c570 g    DF .text  00000036  GLIBC_2.0   getpid
1 голос
/ 06 января 2011

myvar обычно не будет экспортироваться в динамическую таблицу символов, если вы не используете флаг компоновщика, такой как -rdynamic, при его связывании.

0 голосов
/ 09 января 2011

Почему бы вам не использовать оператор области видимости C ++:

::myvar = myvar + 1;

, а затем пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...