Символы в dylib, Работает с gcc-4.0, а не с gcc-4.2 (OSX-default) - PullRequest
0 голосов
/ 23 сентября 2010

у меня есть динамический Lib, который я строю с

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)

Моя тестовая программа связывается с этой библиотекой

$(CC) -DSYS_MACOSX  -g -fPIC testmain.c -o testmain -I. -flat_namespace -L. -lpthread  -lmylib 

Когда CC = gcc-4.2, я получаю следующую ошибку в gdb, когда пытаюсь получить доступ к символам const в 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

Программа работает, с:

  • gcc-4.0 на SnowLeopard
  • gcc-4.3.2 в Debian i386
  • gcc-4.1.2 для arm-angstrom-linux-gnueabi

Обновление: вот некоторые выходные данные отладки main = main loadKeyList = функция в 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) 

Структура выглядит так:

typedef struct _KeyList {
    int count;
    Key keys[4152];
} KeyList;

Обновление 2: это работает в gcc-4.2 из основного

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

Это тот же адрес, что и у указателя-> keyList!

КЛАВИАТУРА выглядит так:

typedef struct _KeyMapList {
    int count;
    KeyList keyList[];
} KeyMapList;

const KeyMapList KEYMAP = {
  .count = 6,
  .keyList = {
   { ... }, { .... },
   { ... }, { .... },
   { ... }, { .count=3086, keys.... }
   }
};

Так в чем проблема с gcc-4.2?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 сентября 2010

Моя программа тоже не работала в Linux-x86_64

Но настоящий ответ таков: вы должны слушать предупреждения gcc и компилировать с -Wall

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

Это предупреждение было в строке, где я вызвал функцию из Lib, без #, включая соответствующий заголовочный файл. Без функции-декларации это сработало:

  • i386-архитектура как общая библиотека и статическая
  • x86_64-архитектура только статическая

Итак, после включения правильного заголовочного файла все работало нормально.

0 голосов
/ 24 сентября 2010

окей .. похоже, с gcc не проблема.

Это проблема архитектуры x86_64. Сборка с "-arch i386" решает проблему с gcc4.2.

Я до сих пор не знаю, почему он не работает с x86_64. И бинарный, и dylib имеют вид x86_64:

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