Насколько широко поддерживается прагма weak, и преодолевает ли она проблемы использования атрибута gcc?

Я только что обнаружил директиву #pragma weak в GCC:

6.57 .9 Слабые прагмы

Для совместимости с SVR4 GCC поддерживает набор директив #pragma для объявления символов слабыми и определения слабых псевдонимов.

#pragma weak symbol

Эта прагма объявляет символ слабым, как если бы объявление имело одноименный атрибут.Прагма может появляться до или после объявления символа. Отсутствие определения символа - не ошибка.

#pragma weak symbol1 = symbol2

Эта прагма объявляет symbol1 как слабый псевдоним symbol2. Это ошибка, если symbol2 не определен в текущей единице перевода.

http://gcc.gnu.org/onlinedocs/gcc/Weak-Pragmas.html

Несмотря на то, что разработчикам GCC обычно не нравится #pragma , они рекомендуют вам использовать __ attribute __ вместо этого для всех видов вещей, которые могут быть прагмами, я склонен полагать, что #pragma weak на самом деле может быть лучше, чем подход на основе атрибутов, который выглядит так:

extern __typeof(old_name) new_name __attribute__(weak, alias("old_name"))

Помимо уродства требования __ typeof (или требования, чтобы вы знали тип и явно указывали его, даже если это действительно сложный тип функции), самая большая проблема подхода, основанного на атрибутах, заключается в том, что "old_name" необходимо передать в gcc как строку , чтобы вставить ее буквально в сгенерированную сборку. Это проблематично, потому что разные системы имеют разные характеристики изменения имен (наиболее популярным является префикс подчеркивания во всех именах символов C или вообще ничего не делается), и чтобы передать правильную строку в атрибут псевдоним , вы должны необходимо знать соглашение об изменении имени системы, для которой вы создаете, что на самом деле не является знанием, которое принадлежит библиотеке уровня приложения, где могут быть полезны слабые псевдонимы.

Синтаксис #pragma weak new_name = old_name , кажется, позволяет избежать этой проблемы, обрабатывая оба имени на уровне компилятора, где t может исправить их оба соответствующим образом, если я не ошибаюсь.

Итак, когда все предварительные задания закончены, мои настоящие вопросы: Ошибаюсь ли я насчет #pragma weak преимущества «переносимости»? и Все ли современные компиляторы поддерживают Unix-подобные системы (gcc, pcc, tinycc, icc, llvm / clang и т. д.) по-прежнему поддерживают традиционный SVR4 #pragma weak ?

Мне известен следующий аналогичный вопрос, но он кажется не совсем таким же, и ответы не дают удовлетворительного ответа на мой вопрос:

Насколько переносима слабая компоновка? #pragma weak my_symbol

6
задан Community 23 May 2017 в 12:09
поделиться