2010-09-23 50 views
0

我心中已經有一個動態庫,我建立與符號在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的問題?

感謝

+0

您是否嘗試過調試該問題?例如。在gdb下運行該程序,在崩潰時執行回溯,並從那裏開始工作? – 2010-09-23 12:56:14

+0

是的......當它試圖訪問一個結構的成員時,它崩潰了。 \t int last = keyList-> count; 與gdb-Error高於 – boecko 2010-09-23 13:03:55

+0

我認爲我們需要看到一些代碼來幫助解決這個問題 - 可能你會得到未定義的行爲,它可以在不同的編譯器上做不同的事情 – Mark 2010-09-23 13:16:04

回答

0

我的計劃失敗了在Linux-x86_64的,太

但真正的答案是:你要聽GCC警告和與-Wall

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

這個警告是在該行,在那裏我稱之爲從庫函數,沒有#包括-ING各自的頁眉文件。 沒有功能declartion它的工作:

  • I386架構的共享庫和靜態
  • x86_64的架構只有靜態

因此,包括正確的頭文件後,一切正常。

0

確定..它似乎不是用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