2017-03-13 5 views
1

2つの機能をエクスポートするアセンブリファイルがあります。関数名はNASM_RDRAND_GenerateBlockNASM_RDSEED_GenerateBlockです。シンボルには先頭のアンダースコアの装飾がありません。ファイルはNASMでアセンブルされます。 C/C++コードでNASMでMach-Oシンボルエイリアスを作成するには?

は、シンボル名をマングル回避するextern "C"として宣言されています。 LinuxとCygwinの下でのリンクは期待通りに機能します。 OS Xの下にリンクすることで失敗します。

... 
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 

私はAppleのリンカがシンボルにリンクできるように_NASM_RDRAND_GenerateBlock = NASM_RDRAND_GenerateBlockというエイリアスを作成します。 MicrosoftのPE format and MASM allow itがありますが、AppleとMach-Oに同様の機能があるかどうかはわかりません。

私の最初の質問は、Mach-Oファイルフォーマットがシンボルエイリアスをサポートしているかどうかです。

もしそうなら、私の2番目の質問は、どのように私は、エイリアスを作成するために、NASMを言うのですか?あるいは、シンボルエイリアスを作成するためにNASMで何をする必要がありますか?ここで


オブジェクトファイルを構築するために使用されるコマンドです:

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

ここassembler fileです。

+0

はあなたにアセンブリファイルをコンパイルするために使用しているあなたのnasmのコマンドラインを追加します。質問。また、OSXでもC/C++ファイルを再コンパイルしていますか? NASMで '--prefix _'コマンドオプションを使う必要があるでしょう。 –

答えて

1

macOSでは、別のシンボルを別名するタイプN_INDRを使用することができます。

/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach-o/nlist.h から:タイプは、シンボルがあると定義されるN_INDRある

場合別のシンボルとして同じ 。この場合、n_valueフィールドは、 のインデックスであり、他のシンボルの名前の文字列テーブルです。他のシンボル が定義されている場合、定義されたタイプと値の両方を使用します。

あなたはそれがアセンブリを使用した場合には役立つかもしれないコンパイルできるツールindrは、もあります:

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

関連する問題