Я использую компилятор g cc в PowerShell windows10. g cc поставляется с Atolli c TrueSTUDIO ide. Причина, по которой я это делаю, заключается в том, что я могу создать файл .exe из кода C, чтобы облегчить модульное тестирование.
Я сталкиваюсь с ошибкой компоновщика (неопределенная ссылка на 'имя_функции'), когда есть функция, которая определена как слабая, и эта функция используется в другом файле. c.
Между тем я не получаю эту ошибку компоновщика, если я использую arm-atolli c -eabi-g cc или g cc, работающий в Ubuntu.
Вот простой код, демонстрирующий это:
привет. c:
#include "weak.h"
void whatever(void)
{
iamweak();
}
слабый. c :
#include <stdio.h>
#include "weak.h"
void __attribute__((weak)) iamweak(void)
{
printf("i am weak...\n");
}
weak.h
void iamweak(void);
main. c
int main(void)
{
return 0;
}
Создание объектных файлов и связывание:
> g cc - c основной. c слабый. c привет. c
> g cc -o main.exe main.o слабый. Привет o
> hello.o: hello. c :(. text + 0x7): неопределенная ссылка на `iamweak 'collect2.exe: ошибка: ld вернул 1 состояние выхода
Теперь я проверил с помощью g cc -nm таблицу символов hello.o:
* 103 3 *> g cc -nm hello.o
00000000 b .bss
00000000 d. Данные
00000000 r .eh_frame
00000000 r .rdata $ zzz
00000000 т. текст
U _iamweak
00000000 T _относительно
Таблица символов для слабых. o:
> г cc -нм слабый 1061 * 00000000 r .rdata
00000000 r .ata $ zzz
00000000 т. Текст
00000000 т. Слабый. _Слабый. 1070 *
U _puts
Теперь, когда я использую g cc в Ubuntu, как я уже сказал, все работает. Также таблицы символов немного отличаются.
Таблица символов для hello.o:
nm hello.o
U _GLOBAL_OFFSET_TABLE_
U iamweak
0000000000000000 T независимо от
Таблица символов для слабого. o:
нм слабого.
0000000000000000 W iamweak
U ставит
С https://linux.die.net/man/1/nm, он говорит, что «Если строчные, то символ локальный; если прописными, является глобальным (внешним). "
Таким образом, iamweak является локальным в windows10 и глобальным в Ubuntu. Поэтому компоновщик его не видит? Что я могу сделать по этому поводу? Определения слабых функций также есть в некоторых библиотеках HAL, и я не хочу их изменять. Есть ли обходной путь?