LINUX.ORG.RU

Firefox не слинкован с libX11.so, но как-то же выводит на экран! Как?

 , , ,


0

5

Понадобилось мне выяснить какие программы в ОС выводят что-либо на экран или могут выводить. Первой мыслью было натравить на всех ldd и посмотреть кто линкуется с libX11.so. Однако я сразу обнаружил, что Firefox не связан с libX11.so, совсем. Как же он тогда выводит на экран?

$ ldd /usr/lib/firefox/firefox
	linux-vdso.so.1 =>  (0x00007fffe55a7000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f33a32bd000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f33a30b9000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f33a2eb0000)
	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f33a2ba9000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f33a2926000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f33a270f000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f33a237f000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f33a370e000)
★★★★★

Как же он тогда выводит на экран?

Подозреваю, что вот так.

$ ldd /usr/lib/firefox/libxul.so | grep -i x11
	libX11.so.6 => /usr/lib/libX11.so.6 (0xb32f2000)
	libgtk-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0xb1f01000)
	libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0xb1c65000)
	libX11-xcb.so.1 => /usr/lib/libX11-xcb.so.1 (0xafc9c000)

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

Так, да не так

Подозреваю, что вот так...

Постойте, но ведь firefox не слинкован с libxul.so. Как же он его дёргает? Где это видно?

Camel ★★★★★
() автор топика
Ответ на: Так, да не так от Camel

Где это видно?

Здесь:

libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f33a30b9000)

Здесь:

$ strings /usr/bin/firefox | grep libxul
libxul.so

И здесь:

$ pmap `pgrep firefox` | grep xul
b2f8f000  63640K r-x-- libxul.so
b6db5000   2632K r---- libxul.so
b7047000    408K rw--- libxul.so
b2e8f000  63640K r-x-- libxul.so
b6cb5000   2632K r---- libxul.so
b6f47000    408K rw--- libxul.so
Deleted
()

Понадобилось мне выяснить какие программы в ОС выводят что-либо на экран или могут выводить. Первой мыслью было натравить на всех ldd и посмотреть кто линкуется с libX11.so

Вообще говоря, способ ошибочный. Клиент вполне может быть слинкован с xlib статически.

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

strings

Ага, понятно.

strings /usr/lib/firefox/firefox | grep '\.so'
/lib64/ld-linux-x86-64.so.2
libpthread.so.0
libdl.so.2
librt.so.1
libstdc++.so.6
libm.so.6
libgcc_s.so.1
libc.so.6
ld-linux-x86-64.so.2
libxul.so
Camel ★★★★★
() автор топика

язобан

anonymous
()

ldd показывает с чем слинкованы все зависимости рекурсивно. readelf -d покажет с чем бинарь слинкован напрямую

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

прозреваю, что только с gtk, но не с x11. всем посанам wayland-а

anonymous
()
Ответ на: strings от Camel

Но это опять не верный способ. Бинарник легко может содержать название библиотеки, но, при этом, не использовать её. Там легко может быть строка типа «This program is not using yourlibrary.so». И что ты с этим будешь делать?

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

А как?

Но это опять не верный способ. Бинарник легко может содержать название библиотеки, но, при этом, не использовать её. Там легко может быть строка типа «This program is not using yourlibrary.so». И что ты с этим будешь делать?

И что же я с этим буду делать?

Camel ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

firefox != libxul

LANG=C objdump -p /usr/lib/firefox/libxul.so | awk '/NEEDED/{print$2}'

А откуда libxul взялся? В выхлопе ldd firefox слово libxul не встречается. Нет, знаю что Firefox использует libxul, но как проверить произвольный бинарник?

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

Осталось только выяснить, зачем они руками грузят его.

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

man strings

Почитай, что такое strings.

Выдаёт печатаемые строки. Да, я понимаю, что подгружаемые библиотеки здесь не при чём.

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

Неправда, всегда есть дизассемблер.

Неправда, дизассемблер есть не всегда. Дизассемблировав код, ты можешь обнаружить, что это виртуальная машина + байткод в неизвестном тебе формате, для которого у тебя нет дизассемблера. Тогда придётся реверсить алгоритмы ВМ и писать дизассемблер.

Deleted
()

у некоторых из тех, кто выводит, будут .desktop-файлы в /u/s/a/
можно смотреть, в каком пакете живёт бинарник и смотреть, например, на зависимости (может, где-то есть и метаданные типа с gui эта программа или нет)

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