У меня есть старая система, основанная на дистрибутиве 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, оказывается правильным:
Однако, если я начну ту же самую команду выше, чтобы получить тот же самый репозиторий, я получу совсем другой вывод:
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
OBones
Для дальнейшего изучения происхождения аварии, я ldd -aна, 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гарантирует, что командная строка, использованная выше, не всегда справляется.
Тогда, наконец, для самого мерзавца:
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 работает правильно: