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 在 gdb 中出现以下错误时,当我尝试访问 libmylib.dylib 中的 const 符号时:

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
  • Debian i386 上的 gcc-4.3.2
  • gcc-4.1.2 用于 arm-angstrom-linux-gnueabi

更新:这是 Lib 中的一些调试输出 main=main loadKeyList=function

海湾合作委员会 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 之类的地址相同!

KEYMAP 看起来像:

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 架构的问题。使用“-arch i386”构建解决了 gcc4.2 的问题。

我仍然不知道,为什么它不适用于 x86_64。binary 和 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

这个警告在行中,我从 Lib 中调用了一个函数,而没有#include-ing 相应的 Header-File。没有函数声明它工作:

  • i386 架构作为共享库和静态
  • x86_64 架构仅静态

因此,在包含正确的头文件后,一切正常。

于 2010-09-24T11:06:38.057 回答