Как сам динамический компоновщик/загрузчик может быть динамически слинкован, как сообщает `file`?

Предполагая, что вы используете OpenSSH, вы можете настроить свой файл ~/.ssh/configдля каждого, тогда вам также не нужно будет указывать пользователя, вы можете создать свое собственное имя:

host host1
    User testuser
    IdentityFile ~/.ssh/id_rsa-test

тогда, когда вы сделаете ssh host1, это будет сделано автоматически, или, поскольку вы будете использовать host1как другие пользователи, вы также можете сделать

host test-host1
    User testuser
    IdentityFile ~/.ssh/id_rsa-test
    Hostname host1

затем выполнитеssh test-host1

и вы можете сделать то же самое для любого желаемого хоста.

Любой хост, который не соответствует записи в файле конфигурации ssh _(5 ), будет использовать поведение по умолчанию --или использовать значения по умолчанию, указанные в конфигурации ssh _по адресу глобальная настройка, т. е. не внутри хост-блока

ssh _config не поддерживает сопоставление имен пользователей, но вы можете написать сценарий оболочки, чтобы определить это для вас. Вот хрупкий пример в bash, который предполагает, что ваше имя пользователя/хост всегда является первым аргументом, и сломается, если это не так:

ssh() {
    if [[ "$1" =~ ^testuser@ ]]; then
        command ssh -i ~/.ssh/id_rsa-test "$@"
    else
        command ssh "$@"
    fi
}
12
23.09.2019, 15:17
2 ответа
  1. Да, он связывается сам с собой при инициализации. Технически динамический компоновщик не нуждается в разрешении и перемещении объекта для самого себя, поскольку он полностью разрешается, как -, но он определяет символы и должен заботиться о них при разрешении бинарного файла, который он «интерпретирует», и эти символы обновляются, чтобы указывать на их реализации в загруженных библиотеках. В частности, это влияет на malloc— компоновщик имеет встроенную минимальную версию -с соответствующим символом, но она заменяется версией библиотеки C после ее загрузки и перемещения (или даже промежуточной версией, если есть является одним ), с некоторыми предосторожностями, чтобы гарантировать, что это не произойдет в момент, когда это может привести к поломке компоновщика.

    Кровавые подробности в rtld.c, в функции dl_main.

    Обратите внимание, однако, что ld.soне имеет внешних зависимостей. Вы можете увидеть символы, связанные с nm -D; ни один из них не определен.

  2. Справочная страница ссылается только на записи непосредственно под /lib, , то есть/lib/ld.so(динамический компоновщик libc 5, который поддерживаетa.out/lib*/ld-linux*.so*(динамический компоновщик libc 6, который поддерживает ELF ). Страница руководства очень специфична, а ld.soнет ld-2.28.so.

    Динамический компоновщик, присутствующий в подавляющем большинстве современных систем, не поддерживает a.out.

fileи lddсообщают о разных вещах для динамического компоновщика, потому что у них разные определения того, что представляет собой статически -связанный двоичный файл. Для lddдвоичный файл считается статически связанным, если он не содержит DT_NEEDEDсимволов, , т. е. не содержит неопределенных символов. Для fileдвоичный файл ELF статически компонуется, если он не имеет раздела PT_DYNAMIC(, это изменится в выпуске fileпосле 5.37; теперь он использует наличие секции PT_INTERPв качестве индикатора динамически -связанного двоичного файла, что соответствует комментарию в коде ).

В динамическом компоновщике библиотеки C GNU нет символов DT_NEEDED, но есть раздел PT_DYNAMIC(, поскольку технически это общая библиотека ). В результате ldd(, который является динамическим компоновщиком, )указывает, что он статически связан, а fileуказывает, что он динамически связан. В нем нет раздела PT_INTERP, поэтому в следующем выпуске fileтакже будет указано, что он статически связан.

$ ldd /lib64/ld-linux-x86-64.so.2
        statically linked

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

file5,35)

$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped

(с текущей -разрабатываемой версиейfile).

20
27.01.2020, 19:55
  1. Я подозреваю, что программа fileошибается в том, что динамически компоновщик/загрузчик сам динамически компонуется. Программа lddне согласна. По крайней мере, не в моей системе (Debian Stretch):

    ldd /lib/x86_64-linux-gnu/ld-2.24.so
        statically linked
    
  2. man ld.soтакже читается как:«ld -linux.so *обрабатывает ELF» . Кстати, в вашей системе (и в моей тоже )оба являются символическими ссылками на один и тот же двоичный файл, который, как я понимаю, способен обрабатывать как ELF, так и (старый устаревший формат )a.out.

0
27.01.2020, 19:55

Теги

Похожие вопросы