LINUX.ORG.RU

Как strip влияет на бинарники?


2

3

Как сказывается на работе приложения результат обработки утилитой strip и (главное) как это влияет на библиотеки, в особенности если вызвать с параметром --strip-all? Ведь чтобы обратиться к библиотечной функции по имени в ней должны быть экспортируемые символы, так?

★★★

.dynsym секция есть даже у stripped. А все символы, которые нужны для работы вроде как там прописаны. Я не спец в линкере если что.

nanoolinux ★★★★
()

Если сделаешь --strip-all, никуда потом либу не прилинкуешь, бо symtab накроется. --strip-all, для статически слинкованых бинарей. А вот --strip-unneeded и размер уменьшит и возможность прилинковаться к либе не потеряешь.

unborn
()

Хочешь выбирать, что экспортировать в динамическом бинарнике, используй visibility или ld version script.

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

так ты бы его так unborn упомянул, что бы он хотя бы в уведомлениях твою благоданость увидел.

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

Если сделаешь --strip-all, никуда потом либу не прилинкуешь

Это наглая ложь. --strip-all не удаляет .dynsym и всё замечательно линкуется. У меня в gentoo все либы со --strip-all, если что.

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

Понятия не имею. Особенно по части «зачем».

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

4.2 - дабы стрипать правильно, надо просто задавать при их сборке одну переменную
а просто strip -s ломает их, да
матчасть кури

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

уже хочу. это в каком то файле ядра надо выставлять или просто перед make?

ps. я тупо щас gz все модули делаю

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

переменной перед сборкой достаточно
но можешь и сорсы курнуть...только зачем?

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

Если сделаешь --strip-all, никуда потом либу не прилинкуешь

Это наглая ложь. --strip-all не удаляет .dynsym и всё замечательно линкуется. У меня в gentoo все либы со --strip-all, если что.

Так кому же верить?

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

доверься Силе юный падаван.

ну или megabaks.

У меня в скрипте вроде вобще strip без параметров вызывается, нормально.

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

--strip-all можно применять к бинарникам и разделяемым библиотекам (.so), но не к статическим библиотекам (.a) Каждый, кто собрал LFS, об этом знает.

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

модули ядра ненадо стрипать. проверено.

модули ядра надо стрипать. проверено.

Только не тупо, а внимательно прочитав man strip

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

анонимусу можно быть неконкретным. но написать название параметра наверное руки бы не отвалились.

irton ★★★★★
()

ты так и не сказал - зачем?

ну а вообще-то, можно использовать strip-all, как я понимаю, sharel lib всё равно связываются динамически, однако их НЕ прилинковать СТАТИЧЕСКИ. (оно и не надо тебе очевидно).

Впрочем, если ты сомневаешься, используй --strip-unneeded, который стрипает только не нужное, оставляя возможность статической линковки ТВОЕЙ либы другими кодерами.

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

Если сделаешь --strip-all, никуда потом либу не прилинкуешь

да. Если ты пишешь программу, и хочешь статически слинковать В НЕЁ эту либу.

А динамически - можно, почему нет?

вот ссылочка: http://www.technovelty.org/linux/stripping-shared-libraries.html

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

анонимусу можно быть неконкретным. но написать название параметра наверное руки бы не отвалились.

Написал бы. Если бы ты спросил.

anonymous
()
Ответ на: комментарий от drBatty
ubuntu@ubuntu:~/test$ gcc -c -o libtest.o libtest.c
ubuntu@ubuntu:~/test$ readelf --symbols ./libtest.o

Symbol table '.symtab' contains 12 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS libtest.c
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 
     4: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 
     5: 0000000000000000     4 OBJECT  LOCAL  DEFAULT    3 static_var
     6: 0000000000000000    12 FUNC    LOCAL  DEFAULT    1 static_function
     7: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 
     8: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 
     9: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 
    10: 0000000000000004     4 OBJECT  GLOBAL DEFAULT    3 global_var
    11: 000000000000000c    31 FUNC    GLOBAL DEFAULT    1 global_function
ubuntu@ubuntu:~/test$ strip --strip-all libtest.o
ubuntu@ubuntu:~/test$ readelf --symbols ./libtest.o
ubuntu@ubuntu:~/test$ 

Создаётся впечатление, что на всех пользователей метадистров, 1-2 пользователя, которые изучают матчасть и знают зачем и для чего им это нужно, а всё остальное - фанбои не удосужившиеся прочитать документацию.

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

Ну ка давай демо сюда.

Какое тебе ещё «демо»? Во всех дистрибутивах в пакетах так делается.

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

Я это знаю, а ты пример по ссылке почитай, ага.

$ strip --strip-unneeded libtest.o
$ readelf --symbols ./libtest.o

Symbol table '.symtab' contains 15 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
...
    10: 00000004     4 OBJECT  GLOBAL DEFAULT    5 global_var
    13: 00000016    36 FUNC    GLOBAL DEFAULT    3 global_function

Одно это наталкивает на мысль, что кто-то пи.дит.

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

срашиваю. какой использовать параметр?

мне действительно это важно,т.к. ядро готово и пересобирать нет смысла

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

мне действительно это важно

Если действительно важно, вообще не стрипай. Или man elf, man strip и прими решение сам.

unborn
()
Ответ на: комментарий от unborn
$ readelf --symbols libgpkutils.so | grep Symbol
Symbol table '.dynsym' contains 22 entries:
Symbol table '.symtab' contains 9245 entries:
$ strip --strip-all libgpkutils.so 
$ readelf --symbols libgpkutils.so | grep Symbol
Symbol table '.dynsym' contains 22 entries:
redgremlin ★★★★★
()
Последнее исправление: redgremlin (всего исправлений: 1)
Ответ на: комментарий от redgremlin

facepalm.jpg

Тред перечитай. И обрати внимание на то, что подметил анон.

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

что-то я не понял, к чему ты это всё клонишь? Если честно - лень разбираться, так скажи. ЕМНИП so и так линкуется, ибо там таки табличка остаётся даже с -all. Достаточная, для shared линковки. А вот для static конечно нет. А может я и ошибся, не помню.

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

прочитано и усвоено. нужен чужой опыт дабы по своим граблям не ходить и время съекономить

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

что-то я не понял, к чему ты это всё клонишь?

К тому, что в приведённом тобой примере, кекс стрипает объектник и утверждает что там, динсим уцелел.

ЕМНИП so и так линкуется, ибо там таки табличка остаётся даже с -all.

Не изменяет, но при попытке статической линковки будет фэйл. Если ТС вообще спросил про стрип, то ему желательно с ним не заигрывать.

//экс-чемпион мира по стрельбе в ногу

unborn
()

--strip-all напрочь убивает библиотеки. Об этом подробно написано в книге LFS (о пользе её чтения).

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

К тому, что в приведённом тобой примере, кекс стрипает объектник и утверждает что там, динсим уцелел.

да? ну возможно. я первую попавшуюся сцылку взял.

Не изменяет, но при попытке статической линковки будет фэйл.

это очевидно. но я лично вообще не понимаю профита от статической линковки…

Если ТС вообще спросил про стрип, то ему желательно с ним не заигрывать.

гентушник наверное… Только гентушник может заняться экономией 100Кб памяти, имея 16Гб в наличие.

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

--strip-all напрочь убивает библиотеки. Об этом подробно написано в книге LFS (о пользе её чтения).

Убей себя об стену (о пользе учить уроки и не прогуливать занятия)

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

-strip-unneeded -R .comment

При сборке ядра:

make ... INSTALL_MOD_STRIP="-strip-unneeded -R .comment" modules_install

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

гентушник наверное… Только гентушник может заняться экономией 100Кб памяти, имея 16Гб в наличие.

Нет, у меня Slackware. Собирал LLVM и вывод получился на полтора гига, против 64Мб бинарников предложенных на их сайте. Ни --strip-unneeded, ни -s не помогли уменьшить размер, разве что процента на два.

normann ★★★
() автор топика
1 февраля 2015 г.
Ответ на: комментарий от normann

Собирал LLVM и вывод получился на полтора гига, против 64Мб бинарников предложенных на их сайте.

Не знаю что у тебя с LLVM-ом, у меня конечно тоже не 64Mb, но и не полтора гига.

$ find /usr/lib -name "*LLVM*" -ls | awk '{total += $7} END {print total}'
108712694
$ find /usr/bin -name "*llvm*" -ls | awk '{total += $7} END {print total}'
2941431

~ 112Mb, это вместе с бинарниками, если запаковать, то может и 64 будет + доки и хэды

А насчёт стрипа, так это же очевидно

--strip-unneeded
что означает «выпилить всё ненужное», любой другой расклад не так привлекателен.

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