我有一个导出两个功能的汇编文件。功能名称为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
,以便苹果的链接可以链接到符号。Microsoft的PE格式和MASM允许它,但是我不确定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
这是汇编文件。
在macOS
中您可以使用类型N_INDR
来别名另一个符号。
来自/system/library/frameworks/kernel.framework/a/headers/mamach-o/nlist.h ::
如果类型为n_indr,则将符号定义为相同 作为另一个符号。在这种情况下,n_value字段是索引 另一个符号名称的字符串表。当另一个符号 定义然后他们都采用定义的类型和值。
还有一个工具indr
,您可以对其进行编译,在使用汇编的情况下可能有助于:
↳https://opensource.apple.com/source/cctools/cctools-895/misc/indr.c