2011-01-06 2 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

Können Sie bitte eine weitere Beschreibung zu dieser Frage hinzufügen? Welches Problem hast du? Was hast du probiert? Was versuchst du zu machen? Der Kontext erleichtert die Beantwortung der Frage erheblich. – templatetypedef

+0

Casting 'dlsym' ist sinnlos. – user562374

Antwort

1

myvar im Allgemeinen nicht in die dynamische Symboltabelle exportiert werden, es sei denn, Sie ein Linker-Flag wie -rdynamic verwenden, wenn es verbindet.

+0

es mermer Standort nicht mit RTLD_NEXT, aber geben Sie, wenn RTLD_DEFAULT, warum ich es nicht verstehen kann – nitinrakh

2

Die getpid und errno Symbole werden exportiert arbeiten. myvvar Symbole ist in Ihrer ausführbaren Datei und wird wahrscheinlich nicht exportiert.

Objdump -T hilft Ihnen zu überprüfen, ob das Symbol exportiert wird oder nicht.

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

Warum Sie nicht den Umfang Operator ++ C verwenden:

::myvar = myvar + 1; 

und dann Namensräume.