在古老的 Linux 发行版上构建 git

在古老的 Linux 发行版上构建 git

我有一个基于 Mandriva 2010.1 发行版的旧系统,它不再接收任何更新。

直到最近,我还能够使用内置的 git 二进制文件与 GitHub 正常通信,但由于他们改变了有关不安全协议的政策,我现在收到此错误消息:

fatal: unable to access 'https://github.com/user/repo.git/': error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

有很多答案与该消息相关,其中大多数只是“更新您的客户端”,如果我在可预见的未来不会被那个古老的系统所困扰的话,这对我来说会很好。

幸运的是,我在那台机器上拥有所有需要的构建工具,因此我下载了 git 的源代码2.16.2,将其提取出来/usr/src/git-2.16.2,然后简单地运行了这些命令:

./configure
make
./git --exec-path=/usr/src/git-2.16.2 clone https://github.com/user/repo.git

但是,正如您可能很明显地知道的那样,这并没有解决问题。

因此,我进一步研究了它git-remote-https的构建方式,并发现我还需要一个更新的libcurl和更新的open-ssl库。

因此,我从 OpenSSL 开始,使用以下命令将其放入/usr/src/openssl-1.1.0g并构建:

./config enable-shared enable-egd
make

这个构建得很好,所以我继续构建,curl试图确保它能使用openssl我刚刚构建的。我安装了它的源代码/usr/src/curl-7.58.0,经过一些反复试验,查看了各种资源,我得出了以下命令:

LDFLAGS="-L/usr/src/openssl-1.1.0g -Wl,-rpath,/usr/src/openssl-1.1.0g" LIBS="-ldl" ./configure --with-ssl=/usr/src/openssl-1.1.0g --with-libssl-prefix=/usr/src/openssl-1.1.0g --disable-ldap
make

构建得很好,我可以libcurl.so.4在里面找到/usr/src/curl-7.58.0/lib/.libs

/usr/src/git-2.16.2因此我进入最后一步,即使用以下命令从内部源构建 git :

LDFLAGS="-L/usr/src/openssl-1.1.0g -L/usr/src/curl-7.58.0 -Wl,-rpath,/usr/src/openssl-1.1.0g,-rpath,/usr/src/curl-7.58.0/lib/.libs" LIBS="-ldl" ./configure --with-curl=/usr/src/curl-7.58.0 --with-openssl=/usr/src/openssl-1.1.0g
make

通过所有这些,我得到了一组 git 二进制文件,如果使用readelfgit-remote-https它看起来是正确的:

Dynamic section at offset 0x125448 contains 27 entries:

  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libcurl.so.4]
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.1]
 0x0000000000000001 (NEEDED)             Shared library: [libexpat.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [/usr/src/openssl-1.1.0g:/usr/src/curl-7.58.0/lib/.libs:/usr/src/curl-7.58.0/lib]
 0x000000000000000c (INIT)               0x403870
 0x000000000000000d (FINI)               0x4e7448
 0x000000006ffffef5 (GNU_HASH)           0x400240
 0x0000000000000005 (STRTAB)             0x401838
 0x0000000000000006 (SYMTAB)             0x4002a8
 0x000000000000000a (STRSZ)              2411 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x725658
 0x0000000000000002 (PLTRELSZ)           5160 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x402448
 0x0000000000000007 (RELA)               0x4023d0
 0x0000000000000008 (RELASZ)             120 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x402370
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x4021a4
 0x0000000000000000 (NULL)               0x0

但是,如果我启动上面相同的命令来检索相同的存储库,我会得到非常不同的输出:

Cloning into 'repo'...
warning: templates not found /usr/local/share/git-core/templates
kernel: git-remote-http[14950]: segfault at 0 ip 00007f027380ce66 sp 00007fffa34bf5f8 error 4 in libc-2.11.1.so[7f0273793000+163000]

因此,很明显,我构建 git 二进制文件的方式有问题,但我真的不知道问题是什么。

检查构建 Git 时的日志make,我注意到以下警告消息:

/usr/bin/ld: warning: libssl.so.1.0.0, needed by /usr/lib/gcc/x86_64-manbo-linux-gnu/4.4.3/../../../../lib64/libcurl.so, may conflict with libssl.so.1.1

很多git-remote可执行文件都会重复出现这种情况,我觉得有点奇怪。我的意思是,它readelf告诉我libcurl.so.4使用的是哪个,但看起来好像链接器仍在从我过时的系统库中导入旧版本。

这也许可以很好地解释我观察到的段错误,但是,我应该如何构建整个链条呢?

任何帮助将不胜感激。

答案1

为了进一步探究崩溃的根源,我使用了ldd -aon git-remote-https,结果显示它使用的libcurl.so.4是系统文件夹,而不是我的libcurl文件夹。因此,加载程序允许libcrypto使用两个版本,这肯定会导致我观察到的段错误。

但是,在确保make clean在每个目录中调用之后,我现在就可以工作了,使用以下命令集:

对于 OpenSSL

./config enable-shared enable-egd
make

然后对于 CURL

LDFLAGS="-L/usr/src/openssl-1.1.0g -Wl,-rpath,/usr/src/openssl-1.1.0g" LIBS="-ldl" ./configure --with-ssl=/usr/src/openssl-1.1.0g --with-libssl-prefix=/usr/src/openssl-1.1.0g --disable-ldap --enable-libcurl-option
make

此时,请确保libcurl.so.4中存在/usr/src/curl-7.58.0/lib/.libs。 似乎 确保--enable-libcurl-option了这一点,而上面使用的命令行并不总是如此。

最后,对于 git 本身:

LDFLAGS="-L/usr/src/openssl-1.1.0g -L/usr/src/curl-7.58.0 -Wl,-rpath,/usr/src/openssl-1.1.0g,-rpath,/usr/src/curl-7.58.0/lib/.libs" LIBS="-ldl" ./configure --with-curl=/usr/src/curl-7.58.0 --with-openssl=/usr/src/openssl-1.1.0g
make

现在,使用时ldd您将看到/usr/src/curl-7.58.0/lib/.libs/libcurl.so.4使用的是 而不是系统目录中的那个。这意味着以下 git 命令可以正常工作:

./git --exec-path=/usr/src/git-2.16.2 clone https://github.com/user/repo.git

--exec-path每个 git 命令都要求使用有点麻烦,但alias在这种情况下命令非常方便。

相关内容