Это генерируется, когда glibc компилируется с помощью утилиты Make.
В Makefile-файле glibc есть правило (запускаемое make install
), которое просто выводит нужные строки во временный файл $@.new
:
(echo '/* GNU ld script';\
echo ' Use the shared library, but some functions are only in';\
echo ' the static library, so try that secondarily. */';\
cat $<; \
echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \
'$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\
' AS_NEEDED (' $(slibdir)/$(rtld-installed-name) ') )' \
) > $@.new
А затем этот файл переименовывается в libc.so
mv -f $@.new $@
Вот комментарий от Makefile, который немного объясняет:
# What we install as libc.so for programs to link against is in fact a
# link script. It contains references for the various libraries we need.
# The libc.so object is not complete since some functions are only defined
# in libc_nonshared.a.
# We need to use absolute paths since otherwise local copies (if they exist)
# of the files are taken by the linker.
Я понимаю это как: libc.so.6
не является полным и нуждается в чем-то, что не может быть сохранено в общей библиотеке. Итак, разработчики glibc перенесли это в статическую часть glibc - libc_nonshared.a
. Чтобы принудительно всегда связывать и libc.so.6
, и libc_nonstared.a
, они создали специальный скрипт связывания, который инструктирует ld linker использовать оба, когда запрашивается -lc
(libc)
Что находится в неразделенной части? Давайте проверим:
$ objdump -t /usr/lib/libc_nonshared.a |grep " F "|grep -v __
00000000 g F .text 00000058 .hidden atexit
00000000 w F .text 00000050 .hidden stat
00000000 w F .text 00000050 .hidden fstat
00000000 w F .text 00000050 .hidden lstat
00000000 g F .text 00000050 .hidden stat64
00000000 g F .text 00000050 .hidden fstat64
00000000 g F .text 00000050 .hidden lstat64
00000000 g F .text 00000050 .hidden fstatat
00000000 g F .text 00000050 .hidden fstatat64
00000000 w F .text 00000058 .hidden mknod
00000000 g F .text 00000050 .hidden mknodat
00000000 l F .text 00000001 nop
Имеются функции atexit()
, *stat*()
, mknod
. Зачем? Не знаю на самом деле, но это факт glibc.
Вот несколько длинных объяснений http://giraffe -data.com / ~ bryanh / giraffehome / d / note / proglib и я привожу начало этого:
The stat() family of functions and mknod() are special. Their
interfaces are tied so tightly to the underlying operating system that
they change occasionally.