2017-01-01 1 views
2

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 
+1

Ist ein Prototyp für 'foo()' im Bereich zum Zeitpunkt des Aufrufs? –

Antwort

3

Wahrscheinlich fehlt Benutzercode Erklärung für foo so Compiler behandelt es als nicht-variadische Funktion int zurück. Gab gcc keine Warnung bei nicht angemeldeter Funktion?

+0

Include wurde falsch gemacht, daher fehlte der Prototyp! Vielen Dank! : D – anizzomc

Verwandte Themen