Проблемы с связыванием некоторых библиотек с компоновщиком riscv

Я пытаюсь скомпилировать набор файлов с помощью созданного компилятором здесь (riscv64-linux). Однако у меня возникли некоторые проблемы, которые, как я полагаю, являются результатом моего непонимания с библиотеками.

Я включаю библиотеку libgcc в Makefile с флагом -lgcc в части LINKER_FLAGS. Однако я получаю следующий вывод:

riscv64-linux-ld: cannot find -lgcc

Когда я выполняю $ riscv64-linux-ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012, чтобы увидеть, где riscv64-linux-ld ищет библиотеки, я получаю несколько путей. Один из них /home/luna/noelv-buildroot/output/host/riscv64-buildroot-linux-musl/lib".

Однако, когда я вижу содержимое этого пути, я могу найти библиотеку libgcc:

$ ls /home/luna/noelv-buildroot/output/host/riscv64-buildroot-linux-musl/lib
ldscripts    libatomic.la  libatomic.so.1      libgcc_s.so
libatomic.a  libatomic.so  libatomic.so.1.2.0  libgcc_s.so.1". 

Это заставляет меня задуматься:

  1. Означает ли это, что библиотека находится по этому пути?

  2. Как я могу добавить путь к SEARCH_DIR этого компилятора?

  3. Я думал, что это может произойти, потому что ему нужна статическая библиотека. Для этого я попытался слинковать статическую библиотеку libgcc (libgcc.a), добавив в Makefile LINKER_INCLUDES = -L/home/laumecha/noelv-buildroot/output/host/lib/gcc/riscv64-buildroot-linux-musl/8.3.0/, где по этому пути мы можем найти libgcc.a. Почему компоновщик все еще не находит -lgcc?

  4. Когда я добавляю LINKER_FLAGS += -lm -static -lgcc -nostartfiles -L/home/luna/noelv-buildroot/output/build/host-gcc-final-8.3.0/build/riscv64-buildroot-linux-musl/libgcc/ к флагам компоновщика, я получаю несколько неопределенных ссылок:

riscv64-linux-ld: /home/luna/multibench_automotive_2.0.2653/builds/riscv64/riscv-gcc64/obj/mith.a(th_al.o): in function `al_printf':
/home/luna/multibench_automotive_2.0.2653/mith/al/src/th_al.c:505: undefined reference to `vsscanf'
riscv64-linux-ld: /home/luna/multibench_automotive_2.0.2653/builds/riscv64/riscv-gcc64/obj/mith.a(th_al.o): in function al_sprintf':
/home/luna/multibench_automotive_2.0.2653/mith/al/src/th_al.c:523: undefined reference to `vfscanf'
riscv64-linux-ld: /home/luna/multibench_automotive_2.0.2653/builds/riscv64/riscv-gcc64/obj/mith.a(th_al.o): in function al_fcreate':
/home/luna/multibench_automotive_2.0.2653/mith/al/src/th_al.c:664: undefined reference to `strchr'
riscv64-linux-ld: /home/luna/multibench_automotive_2.0.2653/builds/riscv64/riscv-gcc64/obj/mith.a(th_al.o): in function `al_fsize':
/home/luna/multibench_automotive_2.0.2653/mith/al/src/th_al.c:693: undefined reference to `stat'
riscv64-linux-ld: /home/luna/multibench_automotive_2.0.2653/mith/al/src/th_al.c:714: undefined reference to `getenv'

Означает ли это, что я успешно подключил библиотеку, и мне не хватает другой?

ПРИМЕЧАНИЕ. Я не помещал код из Makefile, потому что понимаю, что моя проблема связана с моими базовыми концепциями, а Makefile был создан на каком-то официальном сайте.


person Lane    schedule 26.11.2020    source источник


Ответы (1)


Проблема в том, что компоновщик ищет libgcc.so или libgcc.a, но в вашей папке есть libgcc_s.so, что не одно и то же.

Вы можете указать SEARCH_DIR в скрипте компоновщика или использовать опцию -L, что проще.

Все неопределенные ссылки являются функциями из libc. Однако в вашей папке нет libc. Вам нужно будет предоставить libc или предоставить эти функции.

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

person yflelion    schedule 26.11.2020
comment
Если я поищу библиотеку, которую использует компилятор, и передам путь к этой библиотеке компоновщику, будет ли это правильно? Мне нужно использовать компоновщик из-за структуры Makefile. Спасибо вам большое за ваш ответ. - person Lane; 27.11.2020
comment
да обычно вы можете использовать то, что компилятор использует по умолчанию. вы можете увидеть эту информацию в подробном режиме. - person yflelion; 27.11.2020