Поддерживает ли компилятор XC8 слабые символы?

В gcc есть __attribute__((weak)), что позволяет создавать слабый символ, например функцию. Это позволяет пользователю переопределить функцию. Я хотел бы иметь такое же поведение в XC8.

Дополнительная информация:

Я пишу драйвер для XC8, и я хотел бы делегировать низкоуровневую инициализацию пользовательской функции.

Я знаю, что функцию можно переопределить: есть функция putch, реализованная в исходном файле XC8 и вызываемая функцией printf. Пользователю разрешено повторно реализовать putch внутри своего приложения. Есть две функции с одинаковым именем, но ошибка не возникает.

Реализация putch в исходных файлах XC8 имеет комментарий "Слабая реализация. Может потребоваться пользовательская реализация", так что это должно быть возможно.

Я просмотрел прагмы в руководстве пользователя XC8, но директивы по этому вопросу нет.


person a44043    schedule 19.05.2017    source источник
comment
Мы не являемся сайтом поддержки Microchip. Почему бы вам не спросить их?   -  person too honest for this site    schedule 19.05.2017
comment
Если бы я задал вопрос о программировании для Android, вы бы ответили, что вы не являетесь сайтом поддержки Google? Я думаю, что ответ Клиффорда может принести пользу не только мне, но и другим.   -  person a44043    schedule 19.05.2017
comment
Поскольку в руководстве четко указано, что такие директивы игнорируются, возможно, следует задать вопрос Как мне реализовать слабую компоновку в компиляторе, который ее напрямую не поддерживает? @Olaf может меньше возражать против этого, и мой ответ останется прежним.   -  person Clifford    schedule 19.05.2017


Ответы (2)


Компоновщик будет искать статические библиотеки только для разрешения символа, который еще не разрешен входными объектными файлами, поэтому замена функций статической библиотеки может быть выполнена без слабой компоновки. Слабое связывание полезно для кода, предоставленного в виде исходного или объектного кода, а не в виде статической библиотеки.

Поэтому, если директива слабой связи не поддерживается, вы можете создать статическую библиотеку для «слабых» символов и связать ее.

В руководстве по XC8 описано поведение директивы совместимости IAR __weak и weak, и в обоих случаях директивы игнорируются (поддерживается только в XC16 и XC32), поэтому вам придется использовать предложенный выше метод, который в любом случае гораздо более переносим, ​​хотя и несколько неудобен.

В случае с putch() я подозреваю, что это не работает, как вы думаете. Я полагаю, что дело вовсе не в слабой связи; в статической библиотеке, содержащей printf(), существует неразрешенная ссылка на putch(), и компоновщик разрешает ее с помощью того, что вы предоставляете; если бы вы скомпилировали и скомпоновали реализацию Microchip и свою из исходного кода, вы бы получили ошибку компоновщика; точно так же, если бы вы не предоставили никакой реализации, вы бы получили ошибку компоновщика.

person Clifford    schedule 19.05.2017

Компилятор XC8 поддерживает атрибут weak.

Слабый атрибут приводит к тому, что объявление выдается как слабый символ. Слабый символ указывает на то, что если доступна глобальная версия того же символа, вместо нее следует использовать эту версию. Когда слабый атрибут применяется к ссылке на внешний символ, этот символ не требуется для связывания.

Например:

extern int __attribute__((weak)) s;

int foo(void) 
{
    if (&s)
        return s;
    return 0;   /* possibly some other value */
}

В приведенной выше программе, если s не определен каким-либо другим модулем, программа все равно будет компоноваться, но s не получит адрес. Условие проверяет, что s было определено (и возвращает его значение, если оно есть). В противном случае возвращается «0». Эта функция может использоваться по-разному, в основном для предоставления универсального кода, который можно связать с дополнительной библиотекой.

Переменная также может быть квалифицирована с помощью слабого атрибута.

Например:

char __attribute__((weak)) input;
char input __attribute__((weak));
person Cyclops    schedule 02.08.2020