【问题标题】:gcc archives not considered when linking?链接时不考虑 gcc 档案?
【发布时间】:2015-09-18 12:00:04
【问题描述】:

gcc 链接器是否链接存档文件或目标文件(或两者)应该有所不同吗?

背景:
在嵌入式项目中,ISR(当然不会被任何其他源代码引用)作为文件中的唯一函数定位。该文件被编译为目标文件,然后放入存档文件。
其他文件中的其他函数被编译为单独的目标文件。
无论链接器是使用 ISR 目标文件还是 ISR 归档文件,二进制文件的构建都没有任何问题,并且毫无例外地在目标上运行。
但是,如果使用存档文件,则 ISR 是链接的。
另外,如果在同一个文件中有任何其他引用(例如,某个其他文件中的某个其他函数使用的变量),它完全链接的。
为什么会这样?

【问题讨论】:

    标签: gcc linker unix-ar


    【解决方案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 的目标文件在以下情况下未链接 它在一个库中,并且不包含其他引用的符号,并且它 当它不在库中或包含其他内容时链接 引用符号。

    【讨论】:

    • 很好的解释!所以我们可以说这不是一个错误,它只是一个必须知道的事实?我在这个问题上花了几乎一整天的时间,没有发现任何相关的东西。我是不是太笨了,无法从一些“官方”文档中得到这个,还是没有?
    • 更新为引用文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2018-08-19
    • 2015-04-24
    • 2020-09-10
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多