静态链接库之间共享的地址被视为32位而不是64位

时间:2017-01-01 20:54:00

标签: c gcc

我有一个像这样编译的静态库:

ar rcs libd.a *.o

然后这个库针对另一个项目进行编译:

gcc *.c -ld

在库中有一个像这样的malloc调用。如果我打印该地址,它看起来像这样:

// In the libd.a
void *foo() {
    void *ptr = malloc(size);
    printf("malloc: %p\n", ptr);
    return ptr;
}

输出: malloc: 0x7fe3b3c04cd0

问题在于,当我调用此函数时,此地址被视为32位值,并且较高的部分被修剪。

代码:

//Outside the libd.a
void bar() {
    void *ptr = foo(size);
    printf("foo: %p\n", ptr);
}

输出: foo: 0xffffffffb3c04cd0

如果注意,地址将被转移为32位地址,从而丢失其高位,并且由于b前面有位1,因此该值被视为负数。

我是在OS X System, 10.10.5 Yosemitegcc -version给出:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin14.5.0
Thread model: posix

1 个答案:

答案 0 :(得分:3)

很可能用户代码缺少foo的声明,因此编译器将其视为返回int的非变量函数。没有gcc在未声明的功能上发出警告吗?

相关问题