Ada中的绑定与链接

时间:2018-06-01 08:10:05

标签: ada gnat

我想知道在使用Ada代码时绑定和链接之间的根本区别是什么?我在谷歌上找不到一个好的解释,这就是我提出这个问题的原因。

对于绑定过程,输入是什么,输出是什么? 绑定和链接之间有什么关系?我认为首先需要进行绑定。

谢谢, 波格丹。

2 个答案:

答案 0 :(得分:6)

使用GNAT,绑定器执行两个作业:首先,检查所有必要的编译是否已完成,以便程序的关闭是一致的,其次安排进行详细说明(任何Ada都需要这些作业)构建系统,但它们可能以不同的方式实现。)

使用gnatmake时,第一项工作通常是多余的,因为gnatmake已经组织了所有必要的编辑。可能会出错(例如,通过将一个单元移动到另一个库而不是从原始位置删除其编译产品),但很难!

精化是Ada的一个功能,在许多其他语言中都没有。在gcc.gnu.org和其他地方有解释,但举一个简单的例子,

with Foo;
package Bar is
   Int : Integer := Foo.Value;
   [...]
end Bar;

package Foo is
   function Value return Integer;
   [...]
end Foo;

我们不知道Foo.Value在编译时会返回什么,我们可能直到运行时才会知道(如果它从命令行读取值会怎样?),所以Foo.ValueBar初始化发生之前,必须处于适合状态。

Bar的初始化在Bar详细阐述时发生,同样适用于Foo,所以gnatbind的工作就是认识到这一点并安排FooBar之前详细说明。

它通过在函数(通常称为adanit)和main()中调用包的精简代码来执行此操作,该adainit将由操作系统调用并调用{{1}然后是Ada主程序,说program.adb

gnatmake然后在Ada的gnatlinkgnatbindb-program.ad[sb]文件中调用b__program.ad[sb],其中包含b~program.ad[sb]生成的代码根据编译器的年份,编译它,并将其与程序的闭包链接以生成最终的可执行文件。

答案 1 :(得分:4)

请参阅此处列出的四点:https://docs.adacore.com/gnat_ugn-docs/html/gnat_ugn/gnat_ugn/building_executable_programs_with_gnat.html#binding-with-gnatbind

您可以将其视为内置make但没有重新编译:它确保对象一致,生成正确的初始化顺序,编译它,并将所有内容传递给链接器。

正如所指出的,在Ada中,程序入口点不是您的主程序,而是执行安全初始化然后调用主程序的程序。