vak: (Default)
[personal profile] vak
Написать программу "run", которая умеет загружать и выполнять произвольный объектный файл. Например:
$ run hello hello.o
hello world!
Здесь файл hello.o получен компиляцией Си-шного кода в обычный объектник:
сс -с hello.с
Для примера возьмём простейший код:
#include <stdio.h>
void hello() {
printf("hello world!\n");
}
Программа "run" получает два аргумента. Первый аргумент - имя функции, которую надо вызвать. Второй аргумент - имя объектного файла. Для определённости пусть дело происходит в Линуксе, на архитектуре x86_64. Хотя неплохо бы и на arm64 под MacOS.

Date: 2025-09-15 12:35 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Преданья старины глубокой... давно уже забыл, как всё это делать (и на форте, и на си...)

Date: 2025-09-15 13:08 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
#!/bin/bash

cat >main.c << EOF
void $1();

int main(void) {
    $1();
    return 0;
}
EOF

cc main.c $2
./a.out

Date: 2025-09-15 15:55 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Это было сильно легче во времена a.out, а сейчас всё в ELF, гораздо более замороченно. И вариантов перемещаемостей в x86_64 столько, что можно диву даться.

Date: 2025-09-15 17:25 (UTC)
straktor: benders (Default)
From: [personal profile] straktor
ага, первейший вариант соплей для конкретных палок
работает при условии, что на входе не main функция
для поддержки мэйна надо будет _start в asm переписать

Date: 2025-09-16 01:58 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
Делал похожее:
под Windows в Kernel Model загружал модули драйверов Atheros из ELF формата для Linux.
Иходников их не было

Date: 2025-09-16 02:29 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
Драйвер работает с аппаратурой через HAL
И с ядром через несложный API

Достаточно написать совместимые обёртки

Date: 2025-09-22 20:46 (UTC)
From: [personal profile] ymz5
Я щось віддалено схоже робив у RadiOS -- але використовувався RDOFF, і модулі для лінкування (включно з ядром, libc і іншими бібліотеками і користувацькими програмами) надавалися GRUB'ом :)

По-суті, лінкування на етапі system boot. Класно працювало, і елегантно!

Навіть у QNX і HURD такого немає.

Date: 2025-09-23 00:05 (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
заставлять компилировать с -fPIC

тогда функция run будет делать .so, далее dlopen, resolve pointer-to-hello, call it