__attribute __ ((слабый)) и статические библиотекиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 __attribute __ ((слабый)) и статические библиотеки

Сообщение Anonymous »

Я хотел ввести слабый символ в свой код, однако я не могу понять его поведение, когда используются файлы *.a.

Код: Выделить всё

void foo() __attribute__((weak));
file a.c:

Код: Выделить всё

#include "a.h"
#include 

void foo() { printf("%s\n", __FILE__); }
file b.c:

Код: Выделить всё

#include 

void foo() { printf("%s\n", __FILE__); }
file main.cpp:

Код: Выделить всё

#include "a.h"
#include 

int main() { if (foo) foo(); else printf("no foo\n"); }
< /code>
Теперь, в зависимости от того, если я использую файлы *.o (g++ -c a.c
и g ++ -c b.c ) или *.a files (

Код: Выделить всё

ar cr a.o
и ar cr b.o ) Вывод отличается: 1) , 2) работать, но вывод для 3) , 4) , кажется, немного непреднамеренно. С архивами, поэтому я внес несколько изменений:
file a.h:

Код: Выделить всё

void foo();
file a.c:

Код: Выделить всё

#include "a.h"
#include 

void __attribute__((weak)) foo() { printf("%s\n", __FILE__); }
< /code>
После этой модификации: < /p>

1) `g ++ main.cpp a.a b.a` prints [i] a.c < /i>

2)` g ++ main.cpp b.a a.a` prints  b.c < /i>

показывает w _z3foov 
, так что нет нарушения ODR. Тем не менее, я не знаю, является ли это правильным использованием атрибута слабых [/i]. Согласно документации GCC:

Слабый атрибут вызывает декларацию быть излучаемым как слабый символ, а не глобальный. Это в первую очередь полезно при определении библиотечных функций, которые могут быть переопределены в коде пользователя, хотя его также можно использовать с нефункциональными объявлениями. Слабые символы поддерживаются для целей ELF, а также для целей A.out при использовании ассемблера GNU и линкера. Является ли использование атрибута слабым в определении вместо объявления правильным? Без атрибута окончательный двоичный файл генерирует то же самое: < /p>

1) `g ++ main.cpp a.a b.a` prints a.c < /i>

2)` g ++ main.cpp b.a A.a` prints b.c < /i>

так просто является символом, а это так, что это то, что это связано с ними, так что это так, что это связано с именным, и это так, что это так, и это то, что это так же, что с ними. Поведение GCC по умолчанию. Несмотря на то, что `nm A.A 'показывает, что был излучен слабый символ, он, похоже, не влияет на статическое связывание.
можно ли использовать атрибут слабый
со статическим связыванием вообще? Таким образом, самое простое решение, по -видимому, заключается в замене символа во время связывания с B (поскольку клиенты уже связываются с b).
Я знаю>

Подробнее здесь: https://stackoverflow.com/questions/516 ... -libraries
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»