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

Текст программы классический:
#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.

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

Date: 2023-11-02 19:00 (UTC)
lxe: (Default)
From: [personal profile] lxe
Я именно о переводе слова shared. Dynamic предлагаю уже как паллиатив.

Date: 2023-11-04 12:51 (UTC)
ufm: (Default)
From: [personal profile] ufm
Интересно, вилки с ложками на кухне в семье - они динамические или разделяемые? :)

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

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

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

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

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

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