Слабый атрибут работает только с разделяемой библиотекой в Linux GCC?
Я новичок в Linux GCC. Я пишу простой код для изучения слабых атрибутов в Linux gcc.
Смотрите мой пример кода:
слабый файл.c, основной файл. Я хочу, чтобы файл мог работать с или без определения метода foo.
#include <stdio.h>
extern void foo(void) __attribute__((weak));
int main() {
if (foo){
foo();
printf ("foo is defined\n");
} else {
printf("foo is not defined\n");
}
}
Итак, я запускаю следующую команду для его компиляции и запуска:
gcc weakref.c -o main_static
./main_static
и вывод "foo не определен", что я и ожидал.
Затем я создал новый файл libfoo.c, см. Ниже:
#include <stdio.h>
void foo() {
printf("Print in foo.\n");
}
Я попытался 3 способа заставить основной файл работать с libfoo.c:
- Скомпилируйте libfoo.c и weakref.c и свяжите объектные файлы.
- Скомпилируйте libfoo.c как статическую библиотеку и свяжите ее с объектным файлом слабого ref.c
- Скомпилируйте libfoo.c как разделяемую библиотеку и свяжите ее с объектным файлом слабого f.c
Работает только 3-й способ и получается следующий вывод:
Print in foo.
foo is defined
Не могли бы вы сообщить мне, работает ли слабая ссылка только с общей библиотекой, и почему? Большое спасибо!
1 ответ
дайте мне знать, если слабый реф работает только с общей библиотекой
Не за что.
Ожидается, что и 1. и 3. будут производить "foo isfined".
2. не ожидается тянуть libfoo.o
от libfoo.a
, потому что неразрешенная слабая ссылка от weakref.o
не считается неразрешенным символом для извлечения объекта из архивной библиотеки. Тем не менее, вы можете заставить libfoo.o
чтобы быть втянутым в ссылку, вот так: gcc weakref.o -lfoo -ufoo
, а затем вы должны снова получить "Foo определен".
Теперь, когда я заявил, что должно произойти, давайте посмотрим, согласится ли практика. Стенограмма из системы Linux/x86_64 с использованием gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
а также GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303
:
$ gcc -c weakref.c libfoo.c
$ ar ruv libfoo.a libfoo.o
ar: creating libfoo.a
a - libfoo.o
$ gcc weakref.o && ./a.out
foo is not defined
Это ваш № 1:
$ gcc weakref.o libfoo.o && ./a.out
Print in foo.
foo is defined
Как вы можете видеть #1 "работает", как я ожидал, а не так, как вы утверждали. Вы, должно быть, где-то ошиблись.
Это ваш № 2:
$ gcc weakref.o -L. -lfoo && ./a.out
foo is not defined
Ваш номер 2 снова, но вынуждает libfoo.o попасть в ссылку:
$ gcc weakref.o -L. -lfoo -ufoo && ./a.out
Print in foo.
foo is defined