我有一个编译如下的静态库:
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没有对未声明的函数发出警告吗?