Кросс-компиляция для конкретной платформы - связывание libc - PullRequest
0 голосов
/ 07 октября 2019

Мне нужно скомпилировать простой двоичный файл для очень старой системы Linux. У меня нет доступных библиотек gcc / build на целевой машине, но у меня есть доступ к машине.

У меня проблемы с компиляцией кода на моей машине и его выполнением на целевой машине.

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

Я скопировал libc с целевой машины на мою и попытался скомпилировать ее. с моим целевым исполняемым файлом.

это завершается успешным выполнением:

gcc -nostdlib ./libc-[version].so myFile.c -emain -o outfile.out

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

Кажется, у меня есть недостаток понимания связи. Любая помощь?

1 Ответ

0 голосов
/ 09 октября 2019

Кажется, у меня есть некоторое непонимание связи.

Вы делаете. «Обычная» программа уровня пользователя не начинает выполняться с main, она начинается с _start.

Символ _start обычно происходит из файла crt0.o (часть libc), изнает, как «взаимодействовать» между тем, как ядро ​​предоставляет аргументы, и тем, как main ожидает их нахождения. Он также инициализирует различные данные, которые должны быть инициализированы перед запуском main (например, stdio streams).

Затем вы хотите:

  1. Узнать фактическую ссылкукоманда, которую gcc main.o выполняет. Вы можете сделать это, добавив флаг -v.
  2. Скопируйте такую ​​команду, предоставив crt0.o и другие входные файлы, соответствующие для вашей версии целевой библиотеки libc.

Возможно, будет проще раскрутить виртуальную машину с операционной системой, соответствующей вашей цели (и со старыми инструментами, нацеленными на нее), и создать вашу программу внутри этой виртуальной машины.

В противном случае вы, вероятно, получитеустановить полную среду кросс-компиляции (которая включает в себя libc и все другие библиотеки, которые вам нужны). Это , а не тривиальное предложение, и, конечно, это не достигается путем копирования libc.so с целевой машины. Но это хорошо документировано и, безусловно, выполнимо (с некоторыми навыками).

...