Кажется, у меня есть некоторое непонимание связи.
Вы делаете. «Обычная» программа уровня пользователя не начинает выполняться с main
, она начинается с _start
.
Символ _start
обычно происходит из файла crt0.o
(часть libc), изнает, как «взаимодействовать» между тем, как ядро предоставляет аргументы, и тем, как main
ожидает их нахождения. Он также инициализирует различные данные, которые должны быть инициализированы перед запуском main
(например, stdio
streams).
Затем вы хотите:
- Узнать фактическую ссылкукоманда, которую
gcc main.o
выполняет. Вы можете сделать это, добавив флаг -v
. - Скопируйте такую команду, предоставив
crt0.o
и другие входные файлы, соответствующие для вашей версии целевой библиотеки libc.
Возможно, будет проще раскрутить виртуальную машину с операционной системой, соответствующей вашей цели (и со старыми инструментами, нацеленными на нее), и создать вашу программу внутри этой виртуальной машины.
В противном случае вы, вероятно, получитеустановить полную среду кросс-компиляции (которая включает в себя libc и все другие библиотеки, которые вам нужны). Это , а не тривиальное предложение, и, конечно, это не достигается путем копирования libc.so
с целевой машины. Но это хорошо документировано и, безусловно, выполнимо (с некоторыми навыками).