我打算为LLVM编写一个类似pascal的前端(我在Windows上工作)。没有什么可以用于生产用途,而是用于使用LLVM。但是有一件事我无法绕过头脑。在(Object)Pascal语言中,您可以在一个Unit中编写它,以从不同的库中导入具有相同名称的2个函数:
porcedure FooExecute; external 'Foo.dll' name 'Execute';
procedure BarExecute; external 'Bar.dll' name 'Execute';
通过在代码中使用别名,我可以正确地解决这些功能。但是我不知道如何在llvm +链接器阶段解决这个问题。 Sofar我知道,我需要为链接器生成一个导入库。这不是问题。从理论上讲,我最终会选择Foo.a和Bar.a.但是,两个导入库都会导出"执行"它与我的LLVM模块中使用的函数名称不匹配。因此理论上我需要将LLVM模块中的正确符号分配给正确导入库中的正确符号。似乎GNU-Linkerscript允许这种机制,但LLVM Linker ld.lld.exe不支持COFF,LLD-Link.exe不支持链接描述文件。
令人惊讶的是,这种问题在Flat-Assembler(我多年前在玩具编译器中使用)中解决非常简单,您可以使用外部SymbolName + LibraryName连接SymbolName。所以理论上我可以使用其他工具来生成一些我链接的额外二进制文件。然而,这似乎不是最佳方式,需要在asm级别上进行平台手动工作。
那么解决此类问题的理想方法是什么(假设您无法修改要导入的库,即Windows库)