Macos 如何在NASM中创建Mach-O符号别名?
我有一个导出两个函数的程序集文件。函数名为Macos 如何在NASM中创建Mach-O符号别名?,macos,nasm,symbols,mach-o,Macos,Nasm,Symbols,Mach O,我有一个导出两个函数的程序集文件。函数名为NASM\u RDRAND\u GenerateBlock和NASM\u RDSEED\u GenerateBlock。这些符号缺少前导下划线装饰。该文件由NASM组装而成 在C/C++代码中,符号名声明为extern“C”,以避免损坏。在Linux和Cygwin下的链接工作正常。在OS X下链接失败,原因是: ... Undefined symbols for architecture x86_64: "_NASM_RDRAND_GenerateB
NASM\u RDRAND\u GenerateBlock
和NASM\u RDSEED\u 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
我想创建一个别名,这样苹果的链接器就可以链接到这个符号了。微软的,但我不确定苹果和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\u INDR
来别名另一个符号
从/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach-o/nlist.h:
如果类型为N_INDR,则符号定义为相同
作为另一个象征。在这种情况下,n_值字段是到的索引
另一个符号名称的字符串表。当另一个符号
然后它们都接受定义的类型和值
还有一个工具indr
,您可以编译它,在使用汇编时可能会有所帮助:
↳ 将用于编译程序集文件的nasm命令行添加到问题中。另外,您也在OSX上重新编译C/C++文件?您可能需要在NASM上使用
--prefix
命令选项。