г cc слабый признак противоречивого поведения - PullRequest
2 голосов
/ 29 января 2020

Я использую компилятор 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, и я не хочу их изменять. Есть ли обходной путь?

1 Ответ

0 голосов
/ 29 января 2020

это atolli c g cc ошибка форка. Это делает еще хуже:

          main:
00401440:   push    %ebp
00401441:   mov     %esp,%ebp
00401443:   and     $0xfffffff0,%esp
00401446:   call    0x401970 <__main>
36          iamweak();
0040144b:   call    0x0
37          return 0;
00401450:   mov     $0x0,%eax
38        }

полный atolli c студийный проект здесь

...