2つの機能をエクスポートするアセンブリファイルがあります。関数名はNASM_RDRAND_GenerateBlock
とNASM_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です。
はあなたにアセンブリファイルをコンパイルするために使用しているあなたのnasmのコマンドラインを追加します。質問。また、OSXでもC/C++ファイルを再コンパイルしていますか? NASMで '--prefix _'コマンドオプションを使う必要があるでしょう。 –