0

私は私が構築するダイナミックライブラリを持っています

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 の場合、libmylib.dylib の const シンボルにアクセスしようとすると、gdb で次のエラーが発生します。

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

プログラムは次のように動作します。

  • SnowLeopard の gcc-4.0
  • Debian i386 上の gcc-4.3.2
  • arm-angstrom-linux-gnueabi 用の gcc-4.1.2

更新:これはいくつかのデバッグ出力 main=main loadKeyList=function in 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 の問題点は何ですか?

ありがとう

4

2 に答える 2

0

わかりました.. gccの問題ではないようです。

x86_64-Architecture の問題です。「-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
于 2010-09-23T22:22:11.497 に答える
0

私のプログラムは Linux-x86_64 でも失敗しました

しかし、本当の答えは次のとおりです。gcc の警告を聞いて、-Wall でコンパイルする必要があります。

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

この警告は、それぞれのヘッダー ファイルを #includeせずに、Lib から関数を呼び出した行にありました。関数宣言なしではうまくいきました:

  • 共有ライブラリおよび静的としての i386 アーキテクチャ
  • x86_64-アーキテクチャのみ静的

したがって、適切なヘッダーファイルを含めた後、すべてが正常に機能しました。

于 2010-09-24T11:06:38.057 に答える