Слабый атрибут работает только с разделяемой библиотекой в ​​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:

  1. Скомпилируйте libfoo.c и weakref.c и свяжите объектные файлы.
  2. Скомпилируйте libfoo.c как статическую библиотеку и свяжите ее с объектным файлом слабого ref.c
  3. Скомпилируйте 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
Другие вопросы по тегам