vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2023-11-01 10:46 pm

Челлендж для энтузиастов

Хотите хитрую задачку для любителей чего-нибудь просимулировать? В качестве домашнего хобби. Предлагается запустить на Линуксе бинарник от мака. Будет время - я сам эту задачку осилю, а пока предложу уважаемой публике.

Текст программы классический:
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
}
Если у вас линукс:
  • на интеловском процессоре - вот вам маковский бинарник Hello-World для архитектуры x86_64: hello-x86_64
  • на процессоре ARM (скажем, Raspberry Pi) - вот бинарник для архитектуры arm64: hello-arm64
Суть задания - написать программу, предположительно на Си или Си++, которая положит этот выполняемый код в память и запустит его, чтобы выдалось "Hello, World". Сразу предупрежу: бинарник требует системную динамическую библиотеку, а именно /usr/lib/libSystem.B.dylib. Вам придётся её сымитировать.

Подсказка: про устройство маковских бинарников и динамических библиотек можно подсмотреть в исходниках проекта Darling.
lxe: (Default)

[personal profile] lxe 2023-11-02 04:18 pm (UTC)(link)
Немножко попурю и попеданчу -- "разделяемый" по-русски это "разделяемая боевая часть", а библиотека, скорее, "совместно используемая" (но я бы просто говорил "динамическая").
spamsink: (Default)

[personal profile] spamsink 2023-11-02 05:03 pm (UTC)(link)
Если это до сих пор никем не сделано, то довольно удивительно.
ircicq: (Default)

[personal profile] ircicq 2023-11-02 06:07 pm (UTC)(link)
/usr/lib/libSystem.B.dylib. Вам придётся её сымитировать.

В такой формулировке достаточно имитировать printf().

Но чтобы эмулятор оказался хоть сколько-то универсальным, надо имитировать системные вызовы изнутри libSystem.

[personal profile] ivanrubilo 2023-11-02 10:54 pm (UTC)(link)
Ну можно подхачить в загруженном бинаре `bl puts@plt` на правильный (и литерал пул со строкой) и не надо библиотек.

Короче я сделал не универсально, зато быстро - сишка линкуется с объектником, который `binary: .incbin hello-arm64`. Патчит адреса и запускает через pthread_attr_setstack и pthread_create.
Но конечно это неуниверсальное фуфло.