LINUX.ORG.RU

Альтернатива статической линковке


0

0

Нужно собрать программу, которая будет работать на сервере с установленным Debian Etch. На моей машине - Ubuntu 8.10.

При запуске ругается на версию libc.

Какие могут быть варианты? Обновлять сервер админы не хотят. Статически все собирать? Переопределять LD_LIBRARY_PATH? Ставить себе Etch и собирать на нем?..

З.Ы. Собрать на сервере не получится - злые админы не дадут установить хедеры

Спасибо

anonymous

Можно заюзать какой-нибудь build service в интернете.

Anoxemian ★★★★★
()

Использовать pbuilder?

anonymous
()
Ответ на: комментарий от Absurd

> Поставить на виртуалку Etch?

Зачем так жестоко? Чрута хватит.

gaa ★★
()

> З.Ы. Собрать на сервере не получится - злые админы не дадут установить хедеры

даже в home ?

Eshkin_kot ★★
()

LD_LIBRARY_PATH тебе в помощь(воможно, немного ошибся в написании).

true_admin ★★★★★
()

Стандартная ситуация, собирается "канадский кросс" (т.е. с x86 на x86) нужной версии GCC и с максимально заниженной версии glibc (обычно 2.2.2). Можно Кегелевскими скриптами, если неохота самому возиться. libstdc++ линкуется статикой, чтобы избежать конфликтов CXXABI. Все сторонние библиотеки по возможности тоже статикой, чтобы в динамике торчали только glibc и ее хвосты вроде libpthread, libm и т.д. После этого получаем приложение, запускающееся на всех вменямых x86 дистрибутивах в обозримом временном периоде.
Хинты:
1.) http://kegel.com/
2.) s/g++ test.cpp -o test -lmylib1 -lmylib2/gcc test.cpp -o test -Wl,-Bstatic -lstdc++ -lmylib1 -lmylib2 -Wl,-Bdynamic/, естественно при этом нужно собрать нашим кроссом libmylib1.a и libmylib2.a и подложить их в каталог с кроссом
3.) Такой перловый скриптик поможет посмотреть максимальную требуемую версию glibc :

#!/usr/bin/perl

my %libc_list = ();

open (CMD_STREAM, "readelf -s $ARGV[0] |");

while (<CMD_STREAM>)
{
if (/^\s*\S+:\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\@GLIBC_(\S+).*\s*$/)
{
my $func_name = $1;
my $libc_ver = $2;
if (defined $libc_list{$libc_ver})
{
push(@{$libc_list{$libc_ver}}, $func_name);
}
else
{
my @func_list = ($func_name);
$libc_list{$libc_ver} = \@func_list;
}
}
}

close(CMD_STREAM);

for my $libc_ver (sort keys %libc_list)
{
print "GLIBC_$libc_ver :\n";
for my $func_name (@{$libc_list{$libc_ver}})
{
print " $func_name\n";
}
print "\n";
}

Т.е. вызов будет таким:
$ ./analyse.pl ./test
GLIBC_2.0 :
readlink
mkdir
...
GLIBC_2.3 :
__ctype_tolower_loc
__ctype_toupper_loc
__ctype_b_loc

Надеюсь, это поможет.

Salieff
()

Спасибо большое всем, особенно Salieff. Сейчас вожусь с кросскомпиляцией. На крайний случай в загашнике поставил виртуалка =)

Еще просьба: толковое руководство по кросскомпиляции не подскажете случайно?

anonymous
()
Ответ на: комментарий от anonymous

А какая система конфигурации используется? Если autoconf, то скорее всего как-то так:
PATH=/usr/local/crosstool/linux/gcc-3.2.3-glibc-2.2.5/i686-unknown-linux-gnu/bi n:$PATH
export PATH

./configure \
CC=i686-unknown-linux-gnu-gcc \
CXX=i686-unknown-linux-gnu-g++ \
--host=i686-unknown-linux-gnu \
--build=i686-unknown-linux-gnu \
host_alias=i686-unknown-linux-gnu \
&& make

Salieff
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.