2011-01-06 12 views
1
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 
} 
+0

이 질문에 대한 자세한 설명을 추가해주십시오. 무슨 문제 있니? 너 뭐 해봤 니? 너 뭐하려고? 상황에 따라 질문에 쉽게 답할 수 있습니다. – templatetypedef

+0

'dlsym' 캐스팅은 무의미합니다. – user562374

답변

1
를 링크 할 때 당신이 -rdynamic 같은 링커 플래그를 사용하지 않는

myvar는 일반적으로, 동적 심볼 테이블에 내 보내지 않습니다.

::myvar = myvar + 1; 

다음 네임 스페이스 :

+0

RTLD_NEXT를 사용하는 기념물 위치를 얻지 못하지만 RTLD_DEFAULT가 왜 이해가 안되는지 알려주세요. – nitinrakh

2

getpiderrno 기호는 libc에서 내 보냅니다. myvvar 기호가 실행 파일에 있으며 아마도 내보낼 수 없습니다.

Objdump -T는 기호를 내보냈는지 여부를 확인하는 데 도움이됩니다.

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

는 왜 C++ 범위 연산자를 사용하지 마십시오.

관련 문제