Исполняемые разделяемые библиотеки - PullRequest
5 голосов
/ 01 августа 2011

В большинстве случаев, когда вы компилируете разделяемую библиотеку, ее выполнение бессмысленно и ничего полезного:

$ ./libfoobarbaz.so
Segmentation fault

Тем не менее, люди в GNU смогли использовать некоторые выходные данные при выполнении glibc:

$ /lib/libc.so.6
GNU C Library (Debian EGLIBC 2.11.2-10) stable release version 2.11.2, by Roland McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.4.5.
Compiled on a Linux 2.6.32 system on 2011-01-23.
Available extensions:
    crypt add-on version 2.1 by Michael Glad and others
    GNU Libidn by Simon Josefsson
    Native POSIX Threads Library by Ulrich Drepper et al
    BIND-8.2.3-T5B
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.

Несмотря на то, что это конкретное использование кажется мне старым раздуванием, как им удалось создать общую библиотеку, которая также работает как исполняемый файл?

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

Хитрость в том, что исполняемые файлы и библиотеки общих объектов используют один и тот же формат, называемый ELF и , что libc.so , в сотрудничестве с кодом, найденным в crt0.o (on * nixes), часть компилятора, фактически отвечает за настройку среды выполнения и затем вызывает соответствующую функцию int main(...). Без связывания с libc.so и crt0.o программа с int main(...) не будет выполнена. Технически можно установить функцию main в качестве исполняемой точки входа, но при ее запуске программа не будет получать аргументы командной строки, среду и т. Д., Все это входит в сферу ответственности стандартной среды выполнения. библиотека libc.so

Итак, libc.so , будучи также ответственным за подготовку вызова функции int main(...), может легко определить, была ли она связана с какой-либо другой программой или она "автономна". Если процесс был запущен через точку входа libc.so , в нем отобразится это сообщение, а затем завершится. Только если процесс запускается через двоичную точку входа исполняемых файлов, которую двоичный файл получает через эту магию crt0.o , процесс будет работать как обычно.

0 голосов
/ 01 августа 2011

Ответ заключается в названии «Исполняемый и связующий формат».Один и тот же формат файла используется как для исполняемых файлов, так и для библиотек.

...