1

У меня есть старая система, основанная на дистрибутиве 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

Таким образом, я перешел к последнему шагу - сборке git из источников, расположенных в /usr/src/git-2.16.2 с помощью следующих команд:

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, и если использовать readelf для git-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-файлы, но я не могу понять, что именно.

Просматривая логи от make при сборке Git, я заметил следующее предупреждающее сообщение:

/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 ответ1

1

Для дальнейшего изучения причины сбоя я использовал ldd -a в git-remote-https и показал, что он использует libcurl.so.4 из системных папок, а не из моей папки libcurl . В результате загрузчик разрешил использовать две версии libcrypto что, несомненно, привело к тому, что я наблюдал за segfault.

Однако после того, как в каждом каталоге был вызван 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 гарантирует, что это так, в то время как командная строка, используемая выше, не всегда делает.

Тогда, наконец, для самого мерзавца:

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 весьма удобна.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .