gcc链接器是否链接存档文件或目标文件(或两者)是否有所不同?
背景:
在嵌入式项目中,ISR(当然不被任何其他源代码引用)被定位为文件中的唯一函数。此文件将编译为目标文件,然后放入存档文件中
其他文件中的其他函数被编译为单独的目标文件
无论链接器是使用ISR目标文件还是ISR存档文件,二进制文件都无需投诉即可在目标上运行并且无异常。
但是,如果使用存档文件,则ISR 不链接。
另外,如果同一文件中有任何其他引用(例如某些其他文件中某些其他函数使用的变量),则 完全链接。
为什么这样?
答案 0 :(得分:1)
是的,它有所不同。
链接器命令行上指定的任何目标文件都已链接 进入可执行文件,无论是否有任何符号 定义由可执行文件引用。
静态库的链接是不同的。它是对象的归档 文件。对于存档中的每个目标文件,链接器将确定 该对象文件是否为任何符号提供定义 到目前为止,在链接中的那个点尚未定义。如果它这样做, 然后链接器将从存档中提取该对象文件 将其链接到可执行文件中;否则没有。
此行为与ld, the GNU linker {- l | --library }
的文档相同
选项:
-l namespec
--library=namespec
...
The linker will search an archive only once, at the location where
it is specified on the command line. If the archive defines a symbol
which was undefined in some object which appeared before the archive
on the command line, the linker will include the appropriate file(s)
from the archive. However, an undefined symbol in an object appearing
later on the command line will not cause the linker to search the
archive again.
...
(要看到这适用于使用gcc
或其他GNU编译器调用的链接,您可能需要知道命名编译器只是一个工具驱动程序,它委托给相应的工具来释放命令行选项,显示:当它看到要求链接的选项时,它会调用ld
。)
因此,包含未引用的ISR的目标文件未链接 它位于库中,不包含其他引用的符号,是 当它不在库中时,或者当它包含其他内容时链接 参考符号。