2010-09-23 5 views
0

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

+0

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à? –

+0

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

+0

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

Répondre

0

Mon programme a échoué sur Linux x86_64, trop

Mais la vraie réponse est: vous devriez écouter les avertissements gcc et de compiler avec -Wall

keyextractor.c:114: warning: cast to pointer from integer of different size 

Cet avertissement était dans la ligne, où j'ai appelé une fonction du Lib, sans # en incluant le fichier d'en-tête respectif. Sans fonction declartion cela a fonctionné:

  • i386-architecture partagée lib et statique
  • x86_64 architecture seulement statique

Ainsi, après y compris le droit fichier d'en-tête, tout a bien fonctionné.

0

ok .. il ne semble pas être un problème avec gcc.

C'est un problème avec l'architecture x86_64. La construction avec "-arch i386" résout le problème avec gcc4.2.

Je ne sais toujours pas, pourquoi cela ne fonctionne pas avec x86_64. deux binaires et dylib sont x86_64:

libmylib.dylib: Mach-O 64-bit dynamically linked shared library x86_64 
keyextractor: Mach-O 64-bit executable x86_64 
Questions connexes