LINUX.ORG.RU

как запретить линкеру версионирование символов?

 , ,


0

1

есть довольно простая аппликуха с огрниченым набором вызовов libc. ну там open(), read(), write(). хочется бинарной переносимости. но то что при линковке использовалась новая glibc предотвращает запуск на старых системах. как зафиксить ситуацию?

★★★★★

Последнее исправление: cvv (всего исправлений: 1)

А, может, просто нужно взять дистрибутив, где libc аккуратно собрана? Например, в Debian testing (Wheezy) libc версии 2.13:

$ objdump -T /lib/x86_64-linux-gnu/libc-2.13.so
...
00000000000ce890  w   DF .text	000000000000005e  GLIBC_2.2.5 open
...
00000000000cea80  w   DF .text	000000000000005e  GLIBC_2.2.5 read
...
00000000000ceae0  w   DF .text	000000000000005e  GLIBC_2.2.5 write
test.c:
#include <unistd.h>
#include <string.h>

int main()
{
        const char* str = "Hello\n";
        write(STDIN_FILENO, str, strlen(str));
        return 0;
}
$ gcc -Wall -g -o test test.c
$ objdump -T test

test:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 write
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strlen
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 __libc_start_main
0000000000000000  w   D  *UND*	0000000000000000              __gmon_start__

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

А, может, просто нужно взять дистрибутив, где libc аккуратно собрана? Например, в Debian testing (Wheezy) libc версии 2.13:

феерическая чушь, версия символа апается при смене поведения реализации, в остальных дистрибутивах все тоже самое

wota ★★
()

А то, что вы хотите, надо делать с двух сторон: 1/ runtime linker 2/ link editor. Вы о котором, кстати?

В Солярисе есть опция LD_NOVERSION для *runtime* linker.

А ежели действительно open(), read(), write(). То можно вообще избежать libc.

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

Так моё словесное описание, значит, чушь, а что насчёт вывода objdump?

а ты подумай, если не догадаешься скомпилируй это:

#include <setjmp.h>
#include <stdio.h>

main() {
	mkstemps();
	jmp_buf buf;
	if(setjmp(buf)==1111) printf("!!\n");
	longjmp(buf,rand());
}

с -O2

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от gag

можешь заодно собрать свой и мой пример на любом другом дистрибутиве

wota ★★
()
Ответ на: комментарий от wota
$ man mkstemps
...
VERSIONS
       mkostemp() is available since glibc 2.7.  mkstemps() and mkostemps() are available since glibc 2.11.
...

Действительно, чуда не произошло, и mkstemps, которая появилась в 2.11 недоступна в какой-нибудь старой версии 2.2.5:

$ objdump -T test

test:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.11  mkstemps
...

Вот если взять пример memcpy, то да можно попасть из-за несовместимого изменения в реализации (а не просто изменения, оптимизации). Но тогда можно попробовать вышеуказанный линк на stackoverflow. Но дебиан по-прежнему поддерживает версию даже для memcpy:

$ objdump -T /lib/x86_64-linux-gnu/libc-2.13.so  | grep memcpy
...
0000000000089220 g   iD  .text	000000000000003c  GLIBC_2.2.5 memcpy
...
P.S. Эх, то, на что отвечаю, меняется просто на глазах :) Ну, это ответ на первую версию поста.

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

Вторая ссылка интересна

cvv ★★★★★
() автор топика
Ответ на: комментарий от gag

Но дебиан по-прежнему поддерживает версию даже для memcpy:

еще одна чушь, версия memcpy апнулась только в 2.14

P.S. Эх, то, на что отвечаю, меняется просто на глазах :) Ну, это ответ на первую версию поста.

здорово, а что на вторую не отвечаешь?

wota ★★
()
Последнее исправление: wota (всего исправлений: 1)
Ответ на: комментарий от gag

и не забудь проверить на любом другом дистрибутиве

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

Но дебиан по-прежнему поддерживает версию даже для memcpy:

еще одна чушь, версия memcpy апнулась только в 2.14

И чего это у людей кое-что с выходом 2.13 стало не так работать как раньше?

здорово, а что на вторую не отвечаешь?

Ну, когда у меня будет под рукой настолько новый дистрибутив, чтобы было свежее 2.13... Даже не знаю, когда это может произойти.

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

И чего это у людей кое-что с выходом 2.13 стало не так работать как раньше?

возможно дебианопроблемы с их любовью к патчам, как я уже говорил символ апнули в 2.14

wota ★★
()

Попробовал согласно ссылке анонимуса срезать завязки на новые glibc. уперся в то что stdio для своих буфферов напрямую дергает mmap() вместо malloc() и это зацепляет код который нельзя выдергнуть из статической libc.

патч для фикса есть http://www.sourceware.org/ml/libc-alpha/2006-11/msg00061.html но при этом естественно подразумевается пересборка статической версии glibc.

вобщем я в размышлениях

cvv ★★★★★
() автор топика

Собери в старой системе.

tailgunner ★★★★★
()
Ответ на: комментарий от cdslow

ну например статические бинарники могут дергать сисколы только через шлюз int 80h, что ресурсозатратно.

cvv ★★★★★
() автор топика

щас wota начнет снова спорить что так делать нельзя, но я все же посоветую использовать apgcc.

использование проще некуда — «CC=apgcc make».

автоматически определяет минимально возможную версию glibc ABI, и линкуется к ней. попутно вырезает ненужные зависимости, которые прилетают из-за кривости pkg-config (или кривости чего-то еще, тут не уверен). например когда линкуешься к gtk2, автоматом добавляется libpng, вот apgcc это вырезает — зависимости от libpng не будет.

правда, я не знаю, откуда его щас можно скачать, т.к. проект autopackage, в рамках которого появилась эта утила, слился с другим, сайт закрылся, и что там дальше случилось непонятно, но у меня есть, могу поделиться.

waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.