Zuerst habe ich gesehen this (< - ein Link), und es funktioniert nicht. Ich bin mit OS X.Warum kann diese dynamisch geladene Bibliothek nicht auf die globalen Variablen des Ladeprogramms zugreifen?
A. C:
#include <stdio.h>
#include <dlfcn.h>
int global_var = 0x9262;
int main(void) {
void *handle = dlopen("libb.so", RTLD_LAZY);
void (*func)(void);
char *err;
if (handle == NULL) {
fprintf(stderr, "%s\n", dlerror());
return 1;
}
func = dlsym(handle, "func");
if ((err = dlerror()) != NULL) {
fprintf(stderr, "%s\n", err);
return 2;
}
global_var = 0x9263;
func();
return -dlclose(handle) * 3;
}
b.c:
#include <stdio.h>
extern int global_var;
void func(void) {
printf("0x%x\n", global_var);
}
Kompilieren und Ausführen:
$ gcc -shared -rdynamic -fpic -o liba.so a.c
$ gcc -shared -fpic -o libb.so -L. -la b.c
$ gcc -fpic -o a a.c
$ ./a
0x9262
Warum es nicht 0x9263
drucken? Ich habe viele Kombinationen von Compiler-Flags ausprobiert, und keiner von ihnen funktioniert.
+1 Genau (und einige mehr Zeichen) – slezica