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



我有一个编译如下的静态库:

ar rcs libd.a *.o

然后这个库被编译成另一个类似的项目:

gcc *.c -ld

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

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

输出:malloc: 0x7fe3b3c04cd0

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

代码:

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

输出:foo: 0xffffffffb3c04cd0

如果你注意的话,地址被传输为32位地址,失去了它的高部分,并且由于b前面是位1,所以该值被视为负。

我在OS X System, 10.10.5 Yosemite中这样做,gcc -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

很可能用户代码缺少foo的声明,所以编译器将其视为返回int的非变元函数。gcc没有对未声明的函数发出警告吗?

最新更新