Вопрос:

Странные пути поиска компоновщика gcc

linux gcc ld

97 просмотра

2 ответа

2813 Репутация автора

Бег gccс -Wl,--verboseпринтами такие вещи, как

attempt to open /foo/gcc-6.3.0/lib64/../lib64/libm.so failed
attempt to open /foo/gcc-6.3.0/lib64/../lib64/libm.a failed
attempt to open /foo/gcc-6.3.0/lib/x86_64-redhat-linux/6.3.0/libm.so failed
attempt to open /foo/gcc-6.3.0/lib/x86_64-redhat-linux/6.3.0/libm.a failed
attempt to open /foo/gcc-6.3.0/lib/../lib64/libm.so failed
attempt to open /foo/gcc-6.3.0/lib/../lib64/libm.a failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/libm.so failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/libm.a failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/../../../x86_64-redhat-linux/6.3.0/libm.so failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/../../../x86_64-redhat-linux/6.3.0/libm.a failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/../../../../lib64/libm.so failed
attempt to open /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/../../../../lib64/libm.a failed
attempt to open /lib/../lib64/libm.so failed
attempt to open /lib/../lib64/libm.a failed
attempt to open /usr/lib/../lib64/libm.so succeeded

Есть ли причина, по которой эти пути должны иметь кучу ../? Например, почему /foo/gcc-6.3.0/lib64/../lib64/libm.soне просто /foo/gcc-6.3.0/lib64/libm.so? Кроме того, некоторые из более длинных путей расширяются до одного и того же, например, /foo/gcc-6.3.0/lib/gcc/x86_64-redhat-linux/6.3.0/../../../../lib64/libm.soи /foo/gcc-6.3.0/lib/../lib64/libm.so.

Кроме того, есть явный недостаток /foo/gcc-6.3.0/lib, в то время как большинство библиотек установлено в, libа не lib64.

Автор: SU3 Источник Размещён: 23.03.2017 07:56

Ответы (2)


0 плюса

2813 Репутация автора

Я нашел два похожих вопроса, задаваемых здесь:

Почему g ++ выглядит в LIBRARY_PATH /../ lib64 и где это задокументировано?

g ++ ищет /lib/../lib/, затем / lib /

Комментарий здесь проливает свет на то, что определяет, как формируются эти пути.

Однако они не отвечают, почему используется так много этих путей, даже если они разрешаются в одном и том же каталоге.

Автор: SU3 Размещён: 23.03.2017 08:56

0 плюса

5148 Репутация автора

Библиотеки в /foo/gcc-*предоставлены gcc-*пакетами, которые являются символической ссылкой на фактические библиотеки, предоставленные в /lib64/или /lib.

Эти символические ссылки обеспечивают целевую поддержку gcc.

Фактические библиотеки содержат общие библиотеки.

Возьмите gcc-objcв качестве примера и библиотеку, на libobjcкоторую он указывает.

$ rpm -ql gcc-objc
<snip>
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include/objc/thr.h
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include/objc/typedstream.h
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libobjc.a
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libobjc.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.7
<snip>

$ ls -l /usr/lib/gcc/x86_64-redhat-linux/4.4.4/libobjc.so
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libobjc.so -> ../../../../lib64/libobjc.so.2

$ rpm -ql libobjc
/usr/lib64/libobjc.so.2
/usr/lib64/libobjc.so.2.0.0

Теперь давайте посмотрим на описание этих пакетов.

$ rpm -qi gcc-objc
gcc-objc provides Objective-C support for the GCC.
Mainly used on systems running NeXTSTEP, Objective-C is an
object-oriented derivative of the C language.

$ rpm -qi libobjc
This package contains Objective-C shared library which is needed to run
Objective-C dynamically linked programs.
Автор: alvits Размещён: 24.03.2017 01:32
Вопросы из категории :
32x32