2017-03-13 4 views
1

Ich habe eine Assembly-Datei, die zwei Funktionen exportiert. Die Funktionsnamen lauten NASM_RDRAND_GenerateBlock und NASM_RDSEED_GenerateBlock. Die Symbole haben keine führende Unterstreichung. Die Datei wird mit NASM zusammengestellt.Wie erstellt man Mach-O-Symbol Aliase in NASM?

Im C/C++ - Code werden die Symbolnamen als extern "C" deklariert, um ein Mangeln zu vermeiden. Die Verknüpfung unter Linux und Cygwin funktioniert wie erwartet. Die Verknüpfung unter OS X nicht mit:

... 
Undefined symbols for architecture x86_64: 
    "_NASM_RDRAND_GenerateBlock", referenced from: 
     RDRAND::GenerateBlock(unsigned char*, unsigned long) in libcryptopp.a(rdrand.o) 
    "_NASM_RDSEED_GenerateBlock", referenced from: 
     RDSEED::GenerateBlock(unsigned char*, unsigned long) in libcryptopp.a(rdrand.o) 
ld: symbol(s) not found for architecture x86_64 

Ich möchte einen Aliasnamen erstellen, so dass _NASM_RDRAND_GenerateBlock = NASM_RDRAND_GenerateBlock so Apples Linker mit dem Symbol verknüpfen. Microsoft's PE format and MASM allow it, aber ich bin mir nicht sicher, ob Apple und Mach-O ähnliche Einrichtungen haben.

Meine erste Frage ist, unterstützt das Mach-O-Dateiformat Symbol Aliase?

Wenn ja, dann ist meine zweite Frage, wie sage ich NASM, um den Alias ​​zu erstellen? Oder was muss ich in NASM tun, um einen Symbolalias zu erstellen?


sind hier der Befehl verwendet, um die Objektdateien zu erstellen:

nasm -f macho32 rdrand.S -DX86 -g -o rdrand-x86.o 
nasm -f macho64 rdrand.S -DX64 -g -o rdrand-x64.o 

Hier ist die assembler file.

+0

Fügen Sie Ihre nasm Befehlszeile Sie verwenden die Baugruppendatei die kompilieren Frage. Außerdem kompilierst du die C/C++ Datei auch auf OSX neu? Wahrscheinlich müssen Sie die Befehlsoptionen '--prefix _' auf NASM verwenden. –

Antwort

1

In macOS können Sie den Typ N_INDR verwenden, um ein anderes Symbol umzubenennen.

Von /System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach-o/nlist.h:

Wenn der Typ N_INDR ist, dann wird das Symbol definiert sein das gleiche als ein anderes Symbol. In diesem Fall ist das Feld n_value ein Index in die Zeichenkettentabelle des anderen Symbols. Wenn das andere Symbol definiert ist, nehmen beide den definierten Typ und Wert an.

Es gibt auch ein Werkzeug indr, die Sie zusammenstellen können, dass bei der Verwendung von Montage helfen könnten:

https://opensource.apple.com/source/cctools/cctools-895/misc/indr.c