编译器或汇编器究竟如何将方法名称转换为动态链接的地址

时间:2012-06-13 22:20:15

标签: compiler-construction vm-implementation

我正在编写自己的编程语言,只是为了它的乐趣。目前我有一个基于堆叠的虚拟机,一种中间语言/汇编语言和一个高级编译器。所以无论如何一切都有效,但我需要动态链接已编译的代码库。问题是我的汇编程序需要知道外部库中各个方法的地址。 C ++编译器或java编译器究竟如何处理这个问题?

1 个答案:

答案 0 :(得分:1)

对于静态链接的可执行文件,链接器负责将函数调用与实际地址进行匹配。一个目标文件将包含符号引用(意思是名称,而不是地址)到其他地方的函数,并且链接器将匹配链接中的某个其他目标文件或库中的符号定义时间。使用此方法需要您将本机机器代码生成到链接器将理解的目标文件中。

另一个可能更适合您的VM情况的选项是使用动态链接,其中您的程序在运行时获取链接函数的地址。这样做的确切方法是依赖于平台的;在Windows上,您可以使用LoadLibraryGetProcAddress,而在Unix风格的平台上,您可以使用dlopendlsym