2010-10-05 3 views
3
$ chmod +x libsomelibrary.so 
$ ./libsomelibrary.so 
Segmentation fault 

$ gcc -O2 http://vi-server.org/vi/bin/rundll.c -ldl -o rundll 
$ ./rundll ./libsomelibrary.so main 
(application starts normally) 

Почему я не могу просто начать libsomelibrary.so, если он имеет полезную точку входа?Почему я не могу напрямую запустить общую библиотеку в Linux?

rundll.c тривиальна:

void* d = dlopen(argv[1], RTLD_LAZY); 
void* m = dlsym(d, argv[2]); 
return ((int(*)(int,char**,char**))m)(argc-2, argv+2, envp); 

Почему не используется внутренне при попытке загрузить двоичный файл?

+0

Эта функция полезна: как библиотека это NS плагин, но если это «главный» начал это просто настольное приложение GUI, который проще в отладке. И нет необходимости иметь несколько проектов, статические библиотеки и зависимости. –

ответ

4

main не является точкой входа, признанной ядром или динамическим компоновщиком, - он вызывается кодом запуска, связанным с вашим исполняемым файлом при его компиляции (такой код запуска по умолчанию не связан с разделяемыми библиотеками).

Заголовок ELF содержит начальный адрес.

3

Разделяемые библиотеки не предназначены, чтобы быть непосредственно работоспособной. Они предназначены для привязки к другой кодовой базе. Он может иметь полезную точку входа, но выполнение является более чем просто доступной точкой входа. Удовлетворением является утилита rundll. Второй тест показывает, что разделяемая библиотека действительно исполняема, но только после того, как rundll выполняет некоторую работу. Если вам интересно, что все должно быть сделано до того, как код библиотеки может быть выполнен, посмотрите исходный код для rundll.

+0

«rundll» - это программа, которую я только что написал. Но это тривиальная вещь. Система легко может это сделать (если мы пытаемся выполнить библиотеку, dlopen it, dlsym «main» и выполнить ее). –

+0

Почему «исполняемый» влечет за собой «больше, чем просто наличие удобной точки входа»? Пожалуйста, предоставьте некоторое дополнительное объяснение. – wj32

+0

Это тривиально. Я видел несколько приложений, основной исполняемый файл которых представляет собой небольшую оболочку, такую ​​как 'dlopen' main library и переходит к предварительно определенной функции. Система не делает этого автоматически, потому что в общем случае он не знает, где находится точка входа (или какая точка входа для использования в случае нескольких точек ввода), или какая настройка должна быть выполнена до прыгая в эту точку входа. – bta

3

Вы можете начинают разделяемые библиотеки в Linux.

Например, если вы начинаете /lib/libc.so.6, он будет печатать номер версии:

$ /lib/libc.so.6 
GNU C Library stable release version 2.12, by Roland McGrath et al. 
Copyright (C) 2010 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.5.0 20100520 (prerelease). 
Compiled on a Linux 2.6.34 system on 2010-05-29. 
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 
libc ABIs: UNIQUE IFUNC 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/libc/bugs.html>. 

Там должно быть что-то не хватает из вашей библиотеки.

Смежные вопросы