Ich habe eine statische Bibliothek wie folgt zusammengestellt:Adresse zwischen statisch gelinkte Bibliothek geteilt wird als 32 Bit behandelt anstelle von 64 Bit
ar rcs libd.a *.o
und dann wird diese Bibliothek gegen ein anderes Projekt wie folgt zusammengestellt:
gcc *.c -ld
In der Bibliothek gibt es einen Malloc-Aufruf wie folgt. Wenn ich diese Adresse drucken, sieht es so etwas wie dieses:
// In the libd.a
void *foo() {
void *ptr = malloc(size);
printf("malloc: %p\n", ptr);
return ptr;
}
Ausgang: malloc: 0x7fe3b3c04cd0
Das Problem ist, dass, wenn ich diese Funktion aufrufen, diese Adresse als 32-Bit-Wert behandelt wird, und je höher Teil ist getrimmt.
Der Code:
//Outside the libd.a
void bar() {
void *ptr = foo(size);
printf("foo: %p\n", ptr);
}
Der Ausgang: foo: 0xffffffffb3c04cd0
Wenn Sie darauf achten, wird die Adresse als eine Adresse 32 Bit übertragen, das hohe Teil davon zu verlieren, und da b
vorangestellt ist Mit Bit 1 wird der Wert als negativ behandelt.
ich dies in einem OS X System, 10.10.5 Yosemite
tun, gcc -version
gibt:
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
Ist ein Prototyp für 'foo()' im Bereich zum Zeitpunkt des Aufrufs? –