在链接对象构建过程中,__.PKGDEF文件仍然包含在链接器对象文件中,但它们是空的存根文件,只包含已经存在于.o文件中的信息,因此我打算在这种情况下去掉它们。
在cmd/link上工作时,我注意到genhash(用于从__.PKGDEF文件生成共享库构建的包版本)做出了两个与此不兼容的假设:
- 它们假设__.PKGDEF文件是.a文件中的第一个文件。这目前是正确的,因为loadobjfile需要它是这样的,但如果我们去掉了来自链接对象文件的__.PKGDEF文件(如我所计划的那样),情况就会不同。
- 在链接对象构建过程中,__.PKGDEF文件对于版本控制基本上没有用处,因为它实际上并没有记录关于包的任何信息。因此,版本控制是破坏性的。
我的计划如下:
- 近期:修改cmd/link,使其不再要求非共享构建的__.PKGDEF文件,修改genhash,如果归档缺少__.PKGDEF文件,则报错,并修改cmd/compile,使其不再在链接对象文件中生成无用的__.PKGDEF文件。
这意味着共享库、链接对象构建现在会显式失败,而之前它们可以工作,但由于无用的包版本文件而微妙地出现错误。 - 中期:让cmd/compile计算包版本哈希并直接将其包含在链接对象中,这样cmd/link就根本不需要__.PKGDEF文件了。
/cc @ianlancetaylor@mwhudson
5条答案
按热度按时间rsl1atfo1#
https://golang.org/cl/102236提到了这个问题:
cmd/compile: always write pack files
erhoui1w2#
https://golang.org/cl/102281提到了这个问题:
cmd/link: skip __.PKGDEF in archives
wecizke33#
https://golang.org/cl/102280提到了这个问题:
cmd/link: make sure we're hashing __.PKGDEF in genhash
0vvn1miw4#
@mdempsky 你知道这个状态是什么吗?
ocebsuys5#
@ianlancetaylor 我概述的"近期"步骤已经完成。"中期"步骤尚未完成。