我有一个导出两个函数的汇编文件。函数名称为NASM_RDRAND_GenerateBlock
和NASM_RDSEED_GenerateBlock
。符号缺乏领先的下划线装饰。该文件与NASM组装在一起。
在C / C ++代码中,符号名称声明为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
我想创建一个别名_NASM_RDRAND_GenerateBlock = NASM_RDRAND_GenerateBlock
,以便Apple的链接器可以链接到该符号。微软的here,但我不确定Apple和Mach-O是否有类似的设施。
我的第一个问题是,Mach-O文件格式是否支持符号别名?
如果是这样,那么我的第二个问题是,如何告诉NASM创建别名?或者我在NASM中需要做什么才能创建符号别名?
以下是用于构建目标文件的命令:
nasm -f macho32 rdrand.S -DX86 -g -o rdrand-x86.o
nasm -f macho64 rdrand.S -DX64 -g -o rdrand-x64.o
答案 0 :(得分: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