c - dylib 中的符号,适用于 gcc-4.0,不适用于 gcc-4.2(OSX 默认)

标签 c macos gcc exc-bad-access dylib

我有一个动态库,我用它来构建

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

该程序可以运行:

  • 雪豹上的 gcc-4.0
  • Debian i386 上的 gcc-4.3.2
  • 用于arm-angstrom-linux-gnueabi的gcc-4.1.2

更新:这是 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:这适用于 main 中的 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 有什么问题吗?

谢谢

最佳答案

好吧..这似乎不是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

关于c - dylib 中的符号,适用于 gcc-4.0,不适用于 gcc-4.2(OSX 默认),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3778539/

相关文章:

c++ - 在 Mac OS X 上使用现代 OpenGL

macos - 对 NSTextField 设置限制

c++ - Qt4: QMap导致 "strict-aliasing rules"编译错误

objective-c - 对 c/objective-c 中的 float 进行舍入。最后一位数字为 5 时出错

java - 将一串 1's and 0' 写入二进制文件?

php - 我需要从 PHP 脚本执行 C 程序

c++ - 将 std::tr1::shared_ptr 与 std::function/std::bind 混合会导致较新的 gcc 出现编译器错误

c - 合并 openmp 区域会带来性能优势吗?

mysql - MAC OSX,我应该下载哪个版本的 MySQL?

linux - 使用 gcc 时找不到版本 `GLIBC_2.11'