Как определить, какая библиотека lib c .so будет ссылаться на `rust c --target = $ TARGET`? - PullRequest
1 голос
/ 25 апреля 2020

Я хочу найти файл lib c .so, который используется в сборке Rust, чтобы я мог запросить его с помощью --version. (Некоторые libcs ​​предоставляют информацию о своей версии через макросы C, поэтому альтернативой для них может быть использование ящика cc в скрипте сборки. Но другие, такие как musl, этого не делают.)

I может выяснить, с каким libstd-*.so файлом будет связан двоичный файл ржавчины или библиотека. Когда этот libstd.so связан с lib c хоста , то запуск на нем ldd показывает, что libc.so. Но когда хост-система использует glib c и целевой средой является musl, это не работает («Недопустимый заголовок ELF»). Вместо ldd я мог бы вместо libstd.so использовать readelf -d или objdump -p. Но они показывают только файл имя из libc.so файла, который он использует, а не его полный путь. И этого libc.so нет ни в одном из каталогов LD_LIBRARY_PATH. (Я знаю, где он находится в моих собственных системах, но я пытаюсь найти его программно в произвольных системах.)

Запуск ldconfig -p дает мне только информацию о lib c для хост-системы .

Было бы замечательно, если бы была ржавчина c, эквивалентная г cc и лямки -print-file-name=libc.so, чтобы я мог сделать что-то вроде rustc --target=$TARGET --print-file-name=libc.so.

Другие идеи о том, как я мог получить эту информацию?

1 Ответ

2 голосов
/ 25 апреля 2020

Вы можете передать аргументы компоновщика в rustc примерно так:

rustc -C link-args=...

Чтобы выяснить, какой libc.so используется, я считаю, что следующей команды должно быть достаточно:

rustc -C link-args=-Wl,-t ...

От man ld :

  -t
  --trace
       Print the names of the input files as ld processes them. ...

Обновление :

Это не сработало: rustc " "съедает" вывод из компоновщика.

Мне удалось получить желаемый вывод косвенно:

echo 'fn main() { println!("")}' | rustc -C link-args=-Wl,-Map=map.out -o foo -
grep 'libc\.so' map.out
libc.so.6                     /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-f25e49a311b0f577.rlib(std-f25e49a311b0f577.std.cy8lhng1-cgu.2.rcgu.o) (setuid@@GLIBC_2.2.5)
LOAD /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libc.so
LOAD /lib/x86_64-linux-gnu/libc.so.6
...