Вы можете сделать несколько вещей, чтобы помочь себе понять это .
ldd / usr / bin / cat
На моем ноутбуке это дает следующий результат:
1771 % ldd /usr/bin/cat
linux-vdso.so.1 (0x00007ffc37fba000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f1ea7018000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1ea73bc000)
Вы заметите, что linux-vdso.so.1
и libc.so .6
не имеют полного пути, и что ldd
показывает вам, какой фактический путь будет использоваться для динамического связывания в libc.so.6
.
Вы можете проверить это (и немного узнать), снова выполнив ldd
с небольшими вариациями:
1790 % export LD_LIBRARY_PATH=/lib
1791 % ldd /usr/bin/cat
linux-vdso.so.1 (0x00007fff0a5a0000)
libc.so.6 => /lib/libc.so.6 (0x00007fa257535000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa2578d9000)
Присмотревшись, вы можете увидеть, что динамический компоновщик ( / lib64 / ld-linux-x86-64.so.2
в данном случае) теперь выберет /lib/libc.so.6
в качестве библиотеки C. Таким образом, переменная окружения LD_LIBRARY_PATH важна для принятия решения о том, какие файлы действительно используются при динамической компоновке.
Еще вы можете сделать strace
:
strace -o cat.trace /usr/bin/cat /etc/motd
Файл cat.trace
будет содержать запись о том, какие системные вызовы выполняет ваш подчиненный процесс. Некоторые из них будут mmap ()
из файлов, показываемых ldd
как динамически подключаемые. Затем выполните поиск в Google для mmap
.
Дополнительная литература: man ld.so
.
Посмотрите, установлена ли у вас команда readelf
, можно ли ее установить или скомпилировать. Запустите readelf -a / usr / bin / cat
. Фактическая спецификация ELF , на мой взгляд, непонятна, но есть некоторая хорошая информация о формате ELF там. Попробуй его найти.
Если у вас установлена musl libc
или вы можете ее установить, то выполнение тех же экспериментов, что и выше, с простым исполняемым файлом, скомпилированным с помощью musl libc, может быть очень информативным. Даже такая сложная вещь, как динамическое связывание, может иметь две разные рабочие реализации в одной и той же операционной системе.
Es muy probable que solo necesite
vi /etc/passwd
y cambiar /var/somewhere/somewheredeeper
a /var/somewhere
pero luego necesitará /var/somewhere
para tener propiedad y permisos que permitan al usuario rootftp
acceder ftp
a ese directorio