Почему символы общей библиотеки не разрешены во время ссылки?

Это - мое 2-е сообщение на этом сайте в моем усилии понять процесс компиляции/соединения с gcc. Когда я пытаюсь сделать исполняемый файл, символы должны быть разрешены во время ссылки, но когда я пытаюсь сделать общую библиотеку, символы не разрешены во время ссылки этой библиотеки. Они будут, возможно, разрешены, когда я попытаюсь сделать исполняемый файл, пользующийся этой общей библиотекой. Практический:

bash$ cat printhello.c
#include <stdio.h>
//#include "look.h"

void PrintHello()
{
look();
printf("Hello World\n");
}

bash$ cat printbye.c
#include <stdio.h>
//#include "look.h"

void PrintBye()
{
look();
printf("Bye bye\n");
}

bash$  cat look.h
void look();

bash$ cat look.c
#include <stdio.h>

void look()
{
printf("Looking\n");
}

bash$ gcc printhello.c printbye.c
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
/tmp/cck21S0u.o: In function `PrintHello':
printhello.c:(.text+0x7): undefined reference to `look'
/tmp/ccNWbCnd.o: In function `PrintBye':
printbye.c:(.text+0x7): undefined reference to `look'
collect2: ld returned 1 exit status

bash$ gcc -Wall -shared -o libgreet printhello.c printbye.c
printhello.c: In function 'PrintHello':
printhello.c:6: warning: implicit declaration of function 'look'
printbye.c: In function 'PrintBye':
printbye.c:5: warning: implicit declaration of function 'look'

Таким образом, мой вопрос состоит в том, почему символы не разрешены, когда я связываю общую библиотеку. Эта работа (Разрешение символов его нисходящего потока) должна будет быть сделана, когда я буду пользоваться этой библиотекой для создания исполняемого файла, но это означает, что мы должны знать то, от чего эта библиотека зависит при пользовании этой библиотекой, но не является ею не нежелательный?

Спасибо, Jagrati

8
задан 4 revs, 3 users 70% 8 February 2013 в 16:29
поделиться

5 ответов

Делает ли добавление -z defs при сборке библиотеки то, что вы хотите? Если нет, посмотрите справочные страницы ld, там довольно много опций по обработке неопределенных символов.

9
ответ дан 5 December 2019 в 10:39
поделиться

Связанный не имеет возможности узнать, по крайней мере в ELF, где находятся символы (т.е. в каких библиотеках). В OS X, с другой стороны, вам нужно связать библиотеки так, как вы описали. В конце концов, это вопрос дизайна. Один более гибкий, другой более строгий.

0
ответ дан 5 December 2019 в 10:39
поделиться

Я думаю, что опция компоновщика -Bsymbolic - это то, что вы ищете.

2
ответ дан 5 December 2019 в 10:39
поделиться

Даже когда вы создаете разделяемую библиотеку, она должна разрешить все зависимости.

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

1) Создайте общую (look. ) библиотеку с look ()
2) Создайте общую (hg. ) библиотеку со ссылкой hello () bye () на look.
3) Создайте приложение с main (), которое ссылается на hg.

Затем во время выполнения приложение загрузит hg. , который будет загружать внешний вид разделяемой библиотеки.

0
ответ дан 5 December 2019 в 10:39
поделиться

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

0
ответ дан 5 December 2019 в 10:39
поделиться