ZHCU947E June 2015 – January 2023
有两种方法可以详尽搜索未解析的符号:
链接器通常仅在命令行或命令文件中遇到输入文件(包括存档库)时读取一次。读取存档时,任何对未定义符号的引用进行解析的成员均包含在链接中。如果某个输入文件稍后引用先前读取的存档库中定义的符号,则该引用不会被解析。
使用 --reread_libs 选项可以强制链接器重新读取所有库。链接器会重新读取库,直到没有更多引用可供解析为止。使用 --reread_libs 进行链接的速度可能会更慢,因此应该仅在需要时使用。例如,如果 a.lib 包含对 b.lib 中所定义符号的引用,而 b.lib 包含对 a.lib 中所定义符号的引用,则可以通过两次列出这两个库的其中之一来解析这些相互依赖关系,如下所示:
cl6x --run_linker --library=a.lib --library=b.lib --library=a.lib
或者也可以强制链接器为您执行该操作:
cl6x --run_linker --reread_libs --library=a.lib --library=b.lib
--priority 选项为库提供了另一种搜索机制。使用 --priority 会使包含相应符号定义的第一个库满足每个未被解析的引用。例如:
objfile references A
lib1 defines B
lib2 defines A, B; obj defining A references B
% cl6x --run_linker objfile lib1 lib2
在现有模型下,objfile 解析其对 lib2 中 A 的引用,拉入对 B 的引用,进而解析为 lib2 中的 B。
在 --priority 下,objfile 解析其对 lib2 中 A 的引用,拉入对 B 的引用,但现在会通过按顺序搜索库来解析 B,并将 B 解析为找到的第一个定义,即 lib1 中的定义。
如果库为其他库中的相关函数集提供覆盖定义而无需提供整个库的完整版本,则适合使用 --priority 选项。
例如,假设您想覆盖 rts6600_elf.lib 中定义的 malloc 和 free 版本,而不提供对 rts6600_elf.lib 的完全替代。 在 rts6600_elf.lib 之前使用 --priority 并链接您的新库可确保所有对 malloc 和 free 的引用都解析为新库。
--priority 选项的作用是在发生上述情况时支持使用 SYS/BIOS 来链接程序。