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.