Сборка git на древнем дистрибутиве Linux

371
OBones

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

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

немного громоздко требовать использования --exec-pathкаждой команды git, но aliasв этом случае команда довольно удобна.

Похожие вопросы