我心中已經有一個動態庫,我建立與符號在dylib,工程用GCC-4.0不是GCC-4.2(OSX默認)
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,當我嘗試訪問常量符號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
的PROGRAMM作品,機智H:
- GCC-4.0雪豹
- 在Debian i386的
- GCC-4.1.2手臂埃Linux的gnueabi
更新GCC-4.3.2:這裏是在庫一些調試輸出主=主loadKeyList =函數
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
這是同一個地址指針一樣手柄 - >鍵列表!
KEYMAP樣子:
typedef struct _KeyMapList {
int count;
KeyList keyList[];
} KeyMapList;
const KeyMapList KEYMAP = {
.count = 6,
.keyList = {
{ ... }, { .... },
{ ... }, { .... },
{ ... }, { .count=3086, keys.... }
}
};
所以什麼用gcc-4.2的問題?
感謝
您是否嘗試過調試該問題?例如。在gdb下運行該程序,在崩潰時執行回溯,並從那裏開始工作? – 2010-09-23 12:56:14
是的......當它試圖訪問一個結構的成員時,它崩潰了。 \t int last = keyList-> count; 與gdb-Error高於 – boecko 2010-09-23 13:03:55
我認爲我們需要看到一些代碼來幫助解決這個問題 - 可能你會得到未定義的行爲,它可以在不同的編譯器上做不同的事情 – Mark 2010-09-23 13:16:04