Как исправить ".c: 6: неопределенная ссылка на 'printf' - PullRequest
1 голос
/ 09 апреля 2019

Я новичок, я хочу изучить язык ассемблера ARM и использовать набор инструментов gnu, поэтому я решил начать с небольшого проекта, который смешивает файл сборки arm и файл C с помощью набора инструментов gnu.Моя идея заключается в вызове функции, определенной в файле сборки.

multi.S:

   .globl multi
multi:
    str     fp,[sp,#-4]!
    add     fp,sp,#0
    sub     sp,sp,#12
    str     r0,[fp,#-8]
    str     r1,[fp,#-12]
    ldr     r3,[fp,#-8]
    ldr     r2,[fp,#-12]
    mul     r1,r2,r3
    mov     r3,r1
    mov     r0,r3
    add     sp,fp,#0
    ldr     fp,[sp],#4
    bx      lr

multi.c:

#include <stdio.h>
unsigned int multi(unsigned int a, unsigned int b);

int main(int argc, char *argv[]){
    unsigned int x = multi(3,4);
    printf("%u\n",x);
    return 0;
}

Затем я попытался связатьих вместе, используя команду следующим образом:

arm-none-eabi-gcc -g -c -o multi-arm.o multi.S
arm-none-eabi-gcc -g -c -o multi.o multi.c
arm-none-eabi-ld multi.o multi-arm.o -o multi.elf

Но произошли некоторые ошибки:

  1. предупреждение: не удается найти символ ввода _start;по умолчанию 0000000082000000 => Я решил эту проблему, добавив -lc --entry main, и предупреждающее сообщение исчезло.
  2. multi.c: 6: неопределенная ссылка на 'printf'.Я застрял с этой ошибкой, и мне потребовалось 2 часа на поиски решения, но я до сих пор не могу это исправить.

Выше мой вопрос.Спасибо всем за чтение.

1 Ответ

0 голосов
/ 09 апреля 2019

Попробуйте это

arm-none-eabi-as -g -o multi-arm.o multi.S
arm-none-eabi-gcc -g -o multi.elf multi.c multi-arm.o

Если вы хотите использовать компоновщик напрямую, вам нужно указать путь к библиотеке C в командной строке. Gcc знает, где находится библиотека (относительно того, откуда она выполняется и для которой она была скомпилирована), когда она вызывает компоновщик, но по какой-то странной причине ld этого не делает.

...