可以对目标文件进行许多类型的更改。可以用最简单的术语将这些更改分类为以下两组之一:
兼容更新。这些更新中新增了接口,所有先前可用的接口仍保持不变。
不兼容更新。这些更新更改了现有的接口,使此接口的现有用户操作失败或不正确地执行操作。
下表对一些常见的目标文件更改进行了分类。
表 5–1 接口兼容性示例
目标文件更改 |
更新类型 |
---|---|
添加符号 |
兼容 |
删除符号 |
不兼容 |
向非 varargs(3EXT) 函数中添加参数 |
不兼容 |
从函数中删除参数 |
不兼容 |
函数数据项或外部定义数据项的大小或内容更改 |
不兼容 |
目标文件的语义属性保持不变时,对函数进行的错误修复或内部增强 |
兼容 |
目标文件的语义属性发生更改时对函数进行的错误修复或内部增强 |
不兼容 |
添加符号(实质上是插入)可构成不兼容更新,使得新符号可能与应用程序对此符号的使用产生冲突。但是,由于通常使用源级名称空间管理,因此实际上这种情况非常少见。
可以通过维护要生成的目标文件的内部版本定义来适应兼容更新。可以通过生成具有新的外部版本化名称的新目标文件来适应不兼容更新。通过以上两种版本控制技术,可以选择应用程序的绑定,还可以在运行时验证正确版本绑定。以下各节中更详细地介绍了这两种技术。