uclinux - ссылка с библиотекой libc.so.0

Я пытаюсь скомпилировать приложение "hello world" на C для встроенной системы с процессором ARM под управлением uClinux. Я использую этот набор инструментов

Когда я компилировал приложение C с флагом -static, приложение работало нормально. Когда я убрал флаг -static - я получил ошибку: can't load library 'libc.so.6'

libc.so.6 не существует в целевой папке, в папке /lib на целевом устройстве символическая ссылка libc.so.0 указывает на libuClibc-0.9.33.2.so

Как я могу "сказать" компилятору связать с libc.so.0?

3 ответа

Решение

Похоже, что набор инструментов, который вы используете, создан для glibc. Но на целевой плате установлен uClibc.
Эти две библиотеки несовместимы.
Во время выполнения они несовместимы, а во время компиляции они несовместимы.
Вы не можете "указать компилятору использовать другую и несовместимую библиотеку".
Вам нужно получить набор инструментов, созданный специально для uClibc вместо glibc / eglibc.

На сайте gnuarm.com были надежные наборы инструментов, но этого сайта больше нет.

Вы можете попробовать создать свой собственный набор инструментов, используя crosstool-NG, что намного проще, чем создание отдельных пакетов наборов инструментов. Попробуйте arm-unknown-linux-uclibcgnueabi Конфигурация и настроить его в соответствии с вашими потребностями.

У меня была похожая проблема при кросс-компиляции простого helloworld из набора инструментов openwrt (с использованием uClibc, target IPQ4028) в мой маршрутизатор Gl-iNet-B1300. После успешной компиляции я scp файл к маршрутизатору и при попытке выполнить эту ошибку возникла:

    root@GL-B1300:~# ./helloworld
    /root/helloworld: can't load library 'libc.so.0'

Когда я запускаю 'ls -la | grep libc.so.' на /lib/ это получилось:

    libc.so.1 -> libuClibc-1.0.14.so

Так как libc.so.0 там не было, я просто создал ссылку в /lib/

    lib/# ln -s libc.so.1 libc.so.0

Бег снова 'ls -la | grep libc.so.':

    libc.so.0 -> libc.so.1
    libc.so.1 -> libuClibc-1.0.14.so

И затем, выполняя файл:

    root@GL-B1300:~# ./helloworld
    Hell! O' world, why won't my code compile?
    The value of pi is 3.141593

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

Вы должны добавить код "загрузить XXX.lib" в свой код, если вы удалите -I. Есть некоторые различия между статической и динамической связью, которые вы можете найти в Google.

Другие вопросы по тегам