GCC ссылка на файл .so без кода souce - PullRequest
1 голос
/ 23 июня 2019

Я пытаюсь скомпилировать и скомпилировать простую программу "hello world" для Axis A210 (архитектура cris).Мне удалось получить GCC от производителя, но он шел с glibc, а камера работает под управлением uClibc-0.9.27.Я вытащил файл /lib/libuClibc-0.9.27.so из устройства.

Мне удалось скомпилировать эту программу с ошибками:

#include <unistd.h>

int main(int argc, char** argv)
{
    *((unsigned int*)0) = 0xDEAD;
}

и эту программу, которая просто зависает:

#include <unistd.h>

int main(int argc, char** argv)
{
    int a = 0;
}

with cris-gcc -g -static -nostdlib -o compiled main.c.

Теперь я хотел бы использовать функции в libuClibc, но я не могу заставить работать ссылку: я пробовал

cris-gcc -g -static -nostdlib -o compiled main.c -luClibc-0.9.27 -L.

но это просто дает:

./libuClibc-0.9.27.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status

Есть ли способ ссылки на этот файл .so или иным образом заставить работать некоторые стандартные функции, такие как exit?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Помимо всех проблем, замеченных @ user3629249 в его ответе (все они должны соблюдаться), сообщение:

./libuClibc-0.9.27.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status

означает, что двоичный файл libuClibc-0.9.27.so был удален из его символов илиу вас нет привилегий для чтения файла, а значит, таблицы символов.Компоновщик не может использовать этот двоичный файл, и он может быть загружен только в память.В любом случае вам нужен нераздробленный разделяемый объект, и, как предлагает @ user3629249, не используйте -static (по причине, указанной в его ответе), приведите параметры в порядок (библиотека dir перед библиотекойбыть связанным, также заявлено им).Даже вы можете связать общий ресурс, указав его:

cris-gcc -nostdlib -o compiled main.c libluClibc-0.9.27.so

и еще одну вещь: вам нужна не только стандартная библиотека C для связи исполняемого файла ... вы обычно используете crt0.o в начале вашей программы со средой выполнения C и стартовым кодом вашей программы.Вы не включили это, и, вероятно, компилятор получает его из другого места.

Один вопрос: если у вас есть компилятор, почему вы намереваетесь предоставить свою собственную версию стандартной библиотеки?не предоставляется компилятором?Если вы измените libc, то вы также должны изменить файл crt0.o.По умолчанию используется какой-то предоставленный компилятор, и вы не получили сообщение no definition for start.

Попытайтесь скомпилировать, используя только основную функцию, как вы, но не указывайте совместно используемые библиотеки или каталоги ...просто основной код:

cris-gcc -o compiled main.c

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

0 голосов
/ 23 июня 2019

относительно:

cris-gcc -g -static -nostdlib -o compiled main.c -luClibc-0.9.27 -L.

Компоновщик работает с библиотеками в том порядке, в котором они встречаются.Поэтому они должны быть перечислены в необходимом порядке.

Компоновщик должен знать, где находится библиотека, прежде чем узнавать, какую библиотеку проверять.Рекомендуется:

cris-gcc -g -static -nostdlib -o compiled main.c -L.  -luClibc-0.9.27 

Однако библиотека * .so НЕ является статической.Это динамическая библиотека, поэтому параметр: -static следует удалить. Однако для этого требуется, чтобы динамическая библиотека была доступна во время выполнения, если связанная * .a (статическая библиотека) доступна, то ее следует использовать воператор compile / link.

Примечание: прототип функции: exit() имеет свой 'прототип, представленный через файл заголовка stdlib.h, а не файл заголовка unistd.h.

относительно:

#include <unistd.h>

int main(int argc, char** argv)
{
    *((unsigned int*)0) = 0xDEAD;
}

параметры: argc и argv не используются, поэтому компилятор выведет два предупреждения о «неиспользуемых параметрах».Предложите использовать сигнатуру функции: int main( void )

этот код пытается записать на адрес 0. Однако приложение не имеет «собственного» адреса 0 (обычно такой адрес будет «помечен» как«только для чтения», поэтому приложение будет завершено с «событием сбоя сегмента»)

Плохая практика программирования - включать заголовочные файлы, содержимое которых не используется.Предложите удалить оператор: #include <unistd.h>

этот оператор: int a = 0; приведет к тому, что компилятор выведет предупреждающее сообщение о переменной, которая «установлена», но никогда не «используется»

относительно:

cris-gcc -g -static -nostdlib -o compiled main.c -L. -luClibc-0.9.27

При компиляции всегда следует включать предупреждения, а затем исправлять эти предупреждения.Предложить:

cris-gcc -Wall -Wextra -Wconversion -pedantic -std=c99 -g -static -nostdlib -o compiled main.c -luClibc-0.9.27 -L.    
...