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

C 静态链接库之间共享的地址被视为32位而不是64位,c,gcc,C,Gcc,我有一个如下编译的静态库: // In the libd.a void *foo() { void *ptr = malloc(size); printf("malloc: %p\n", ptr); return ptr; } ar rcs libd.a*.o 然后根据另一个项目编译此库,如下所示: // In the libd.a void *foo() { void *ptr = malloc(size); printf("malloc: %p\n"

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

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

然后根据另一个项目编译此库,如下所示:

// In the libd.a
void *foo() {
    void *ptr = malloc(size);
    printf("malloc: %p\n", ptr);
    return ptr;
}
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,因此该值将被视为负值

我在一个
OSX系统,10.10.5Yosemite
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没有对未声明的函数发出警告吗?

是调用点作用域中的
foo()
的原型吗?Include错误,因此原型丢失!谢谢D