I'v a une dynamique Lib que je construis avecSymboles en dylib, Fonctionne avec gcc 4.0 non gcc-4.2 (OSX par défaut)
OBJECTS=keys.o etc2.o foo.o
$(CC) -DSYS_MACOSX -g -fPIC -flat_namespace -L. -lpthread -Wl,-flat_namespace -dynamiclib -shared -o libmylib.dylib $(OBJECTS)
Mes tests liens Progam avec cette bibliothèque
$(CC) -DSYS_MACOSX -g -fPIC testmain.c -o testmain -I. -flat_namespace -L. -lpthread -lmylib
lorsque CC = gcc-4.2 Je reçois l'erreur suivante dans gdb, lorsque je tente d'accéder à des symboles const dans libmylib.dylib:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000112dd0
0x0000000100004ec7 in extractKeyFromList (keyList=0x112dd0, key=0x1002001e0 "Adresse1.aName1") at keys.c:148
Les travaux programm, l'esprit h:
- gcc 4.0 sur SnowLeopard
- gcc-4.3.2 sur Debian i386
- gcc-4.1.2 pour le bras-angström-linux-gnueabi
Mise à jour: Voici certains debug-sortie principale = principale loadKeyList = fonction Lib
GCC 4.0:
main: sizeof KeyList = 149480
loadKeyList: sizeof KeyList = 149480
loadKeyList: list at 0xfe88c
loadKeyList: sizeof list = 149480
loadKeyList: list->count 3086
main: sizeof handle->keyList = 149480
main: handle->keyList at 0xfe88c
main: handle->keyList->count 3086
GCC4.2
(gdb) run
Starting program: keyextractor -k Adresse1.aName1
Reading symbols for shared libraries ++. done
main: sizeof KeyList = 166088
loadKeyList: sizeof KeyList = 166088
loadKeyList: list at 0x112dd0
loadKeyList: sizeof list = 166088
loadKeyList: list->count 3086
main: sizeof handle->keyList = 166088
main: handle->keyList at 0x112dd0
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000112dd0
0x0000000100001940 in main (argc=3, argv=0x7fff5fbfefb8) at keyextractor.c:110
110 printf("main: handle->keyList->count %i\n", handle->keyList->count);
(gdb)
struct ressemble à ceci:
typedef struct _KeyList {
int count;
Key keys[4152];
} KeyList;
Mise à jour 2: Cela fonctionne dans gcc-4.2 de la principale
printf("KEYMAP.keyList[5] at 0x%x count = %i\n", &KEYMAP.keyList[5], KEYMAP.keyList[5].count);
Output: KEYMAP.keyList[5] at 0x112dd0 count = 3086
C'est la même adresse comme poignée de pointeur -> keyList!
KEYMAP ressemble:
typedef struct _KeyMapList {
int count;
KeyList keyList[];
} KeyMapList;
const KeyMapList KEYMAP = {
.count = 6,
.keyList = {
{ ... }, { .... },
{ ... }, { .... },
{ ... }, { .count=3086, keys.... }
}
};
Alors quel est le problème avec gcc-4.2?
Merci
Avez-vous essayé de déboguer le problème? Par exemple. exécuter le programme sous gdb, faire un backtrace quand il se bloque, et travailler à partir de là? –
oui ... il plante, lorsqu'il essaie d'accéder à un membre d'une structure. \t int last = keyList-> count; avec l'erreur gdb ci-dessus – boecko
Je pense que nous avons besoin de voir du code pour aider à cela - peut-être que vous obtenez un comportement indéfini qui peut faire différentes choses sur différents compilateurs – Mark