Как узнать, какие файлы связаны с "-lc"? - PullRequest
2 голосов
/ 06 июня 2019

Потратив почти час на фильтрацию вывода

clang -v hello_world.c

Я получил следующую команду связывания:

ld -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 \
/usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o \
hello_world.o /usr/lib/x86_64-linux-gnu/libc.so \
/usr/lib/x86_64-linux-gnu/crtn.o

Есть ли более простой способ узнать, что -lc расширится до /usr/lib/x86_64-linux-gnu/libc.so?

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

редактировать

Похоже, я должен использовать набор инструментов для кросс-компиляции. Из ленточных документов:

https://clang.llvm.org/docs/CrossCompilation.html

Когда вы извлекли свой кросс-компилятор из zip-файла в директории, вы должны использовать --sysroot =. Путь это корень каталог, в который вы распаковали свой файл, и Clang будет искать каталоги bin, lib, include там.

Где я могу получить тот zip-файл, на который они ссылаются? Я заинтересован в x86_64-linux-gnu target.

1 Ответ

2 голосов
/ 06 июня 2019

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

for i in `find . -type f -executable`
do
    j=$(ldd $i | grep libc.so.6 | wc -l)
    if [ $j -gt 0 ]
    then
        echo $i
    fi
done

Если вы хотите узнать, каков путь libc.so.6, в оригинальном вопросе указано что-то похожее на:

ldd `which ld` | sed 's/^[[:space:]]libc.so.6[[:space:]]=>[[:space:]]\(.*\)[[:space:]](.*)/\1/p' | grep --color=never libc.so

будет печатать путь, вы можете явно заменить выражение после ldd на любое имя файла.

Из комментариев, есть способ с clang напрямую, хотя он будет генерировать много шумачто значительно сложнее исключить по сравнению с ldd способом.

clang -Wl,--verbose hello_world.c

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

...