go cmd/link: package versioning for shared libraries is incompatible with linkobj builds

iovurdzv  于 9个月前  发布在  Go
关注(0)|答案(5)|浏览(107)

在链接对象构建过程中,__.PKGDEF文件仍然包含在链接器对象文件中,但它们是空的存根文件,只包含已经存在于.o文件中的信息,因此我打算在这种情况下去掉它们。

在cmd/link上工作时,我注意到genhash(用于从__.PKGDEF文件生成共享库构建的包版本)做出了两个与此不兼容的假设:

  1. 它们假设__.PKGDEF文件是.a文件中的第一个文件。这目前是正确的,因为loadobjfile需要它是这样的,但如果我们去掉了来自链接对象文件的__.PKGDEF文件(如我所计划的那样),情况就会不同。
  2. 在链接对象构建过程中,__.PKGDEF文件对于版本控制基本上没有用处,因为它实际上并没有记录关于包的任何信息。因此,版本控制是破坏性的。

我的计划如下:

  1. 近期:修改cmd/link,使其不再要求非共享构建的__.PKGDEF文件,修改genhash,如果归档缺少__.PKGDEF文件,则报错,并修改cmd/compile,使其不再在链接对象文件中生成无用的__.PKGDEF文件。
    这意味着共享库、链接对象构建现在会显式失败,而之前它们可以工作,但由于无用的包版本文件而微妙地出现错误。
  2. 中期:让cmd/compile计算包版本哈希并直接将其包含在链接对象中,这样cmd/link就根本不需要__.PKGDEF文件了。
    /cc @ianlancetaylor@mwhudson
rsl1atfo

rsl1atfo1#

https://golang.org/cl/102236提到了这个问题:cmd/compile: always write pack files

erhoui1w

erhoui1w2#

https://golang.org/cl/102281提到了这个问题:cmd/link: skip __.PKGDEF in archives

wecizke3

wecizke33#

https://golang.org/cl/102280提到了这个问题:cmd/link: make sure we're hashing __.PKGDEF in genhash

0vvn1miw

0vvn1miw4#

@mdempsky 你知道这个状态是什么吗?

ocebsuys

ocebsuys5#

@ianlancetaylor 我概述的"近期"步骤已经完成。"中期"步骤尚未完成。

相关问题