[ Elkerülve ] A manóba! Kódszegmens konvertálása ELF formátumra

Van egy régi linux bináris programom - sajnos forrás nélkül -, ami elvileg régen futott linux alatt. Ma nem fut, mert nem megfelelő formátumú. Tippre, ez a programnak csak a kódszegmens része. (Régen tanultam már az x86 assemblyt, és azóta sem használtam, így gyakorlatilag nulláról indulok.)

Egyetlen érdemi támpontot találtam a neten, miszerint az "objdump" segítségével előállítható belőle az assembly forrás, amit már könnyedén ELF formátumra lehetne fordítani.

Addig eljutottam, hogy az objdump képes belőle assembly szerű forrást készíteni, de nem tiszta assembly kódot, így tovább kell konvertálni ezt a forrást. Egyelőre nem sikerült olyan assembly forrás generálnom az objdump kimenetéből, amit egy assembler le is fordítana.

Ha valakinek van ötlete, hogyan lehetne egy régen futó linux bináris újra futtathatóvá tenni, ne tartsa magában. Minden támpontnak örülnék.

----------------------------

Megoldás helyett meglett a forrás. Köszönöm a segítségeket.

Hozzászólások

VM-be tenni valami ősi Linux disztróval? Nem szakterületem, de így próbálnám, ha régen futott.

Volt egy regi binaris formatum, az a.out, es az ujabb, az ELF. Elobbi nevebol orokolte a gcc a default output nevet is. Ugy emlekszem, ennek a kernelbeli tamogatasa megszunt par eve (5.1-es kernellel deprecated lett). Ha jol gondolom, hogy ez az lehet, akkor a patch elotti kernellel rendelkezo lightweight disztron probalnam futtatni. Valoszinuleg jo az az elv, ahogy elkezdted, de a fuggosegek miatt nem biztos, hogy mukodne. Persze ha valami egyszeru programrol van szo fuggosegek nelkul, elvileg mehetne ugy is.

A strange game. The only winning move is not to play. How about a nice game of chess?

Ha nem ELF akkor milyen formatumu? Meg a.out? Mit mond a `file`, az `ldd` illetve az `nm` latja ebben a file-ban levo szimbolumokat? Meg az `objcopy`-t neznem meg, az tud mindenfele formatumot csinalni, bar igaz hogy azt eddig mindig pont a forditott iranyban lattam hasznalni (ELF -> barmi). 

Az objdump az alapertelmezesben beteszi a cimet is meg a hexadecimalis gepi kodu formatumot is az assembly listing ele alapertelmezesben. Az ugy nem fog lefordulni. Elso korben probald ki egy friss, sajat forditasu, "hello world" bonyolultsagu ELF segitsegevel hogy megy-e az ELF -> objdump -> assembly -> *.o -> *.elf -> futtatas folyamat, mi kell ahhoz hogy az objdump fordithato, kvazi *.s/*.S kimenetet allitson elo. 

Ami meg bekavarhat hogy a regi binaris milyen (g)libc-t is hasznal, illetve ugy altalanossagban milyen dinamikus linkelesu konyvtarak vannak meg hozza. Lasd ugye `ldd`, azert erdemes azt is megnezni. Ha van/lenne kulso dinamikus konyvtara, akkor abbol is tudsz szerezni regit? Vagy, nem leht hogy csak azert nem fordul valojaban mert az nincs meg, de egyebkent a formatum rendben lenne? 

Elvileg a.out formátum lehet, bár a file azt mondja: "Linux/i386 demand-paged executable (QMAGIC)"

Az "nm" nem ismeri fel a formátumát, azt mondja: "file format not recognized"

Egyelőre az objcopy-val sem tudtam konvertálni.

De ha a régi formátum neve az a.out, akkor erre legalább már tudok keresni, hogy a.out -> ELF konverzió. Ez is valami, köszönöm.

A chatgpt szerint létezik egy "aout2elf" program is valahol, de ezt eddig nem találtam.

Hu, aha, akkor talan alakul a dolog! Szerintem keress ra a "Linux/i386 demand-paged executable" kifejezesre az interwebekben, hatha azalapjan mar el lehet indunlni annak ismereteben hogy... :) Egyreszt most ido hijjan annyira nem tudok ebbe belemenni, masreszt meg nem is ismerem a progidat (igy vakon meg azert egy ido utan nehez okosakat mondani), viszont sztem ott lesz sok jo talalat. A QMAGIC az nem egy jo indikacio, lattam ZMAGIC-ot is a talalatok kozott, kicsit felrevezetonek erzem. Viszont az a.out formatumra is sok hivatkozast dob fel. 

Hajra! :)

Az objcopy egyebkent nekem is furcsa, szoval lehet hogy nem az lesz a legjobb irany a "hozzunk letre egy valodi valamibol egy ELF-et" dolognak. Ez is inakbb csak egy otlet, "hatha" alapokon. Az objcopy-t en is inkabb "informacio kiszedesre" szoktam hasznalni: az ELF mindent is tartalmaz a linkelt/futtatando program kapcsan, es sok esetben ennek csak egy reszere van szukseg a tovabbiakban (iskolapelda ugye firmware image-k keszitese a 100 byte-os Arduino kodtol kezdve a Linux kernelekig). No, akkor jo az objcopy. Forditott irany az mar ketseges nekem is igy jobban belegondolva.

nem lehet hogy azert nem fut, mert i386 libraryt igenyel?

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Szerkesztve: 2024. 07. 26., p – 15:44

Elvileg a.out formátum lehet, bár a file azt mondja: "Linux/i386 demand-paged executable (QMAGIC)"

Nemcsak elvileg, a QMAGIC egyértelműen a.out-ra utal (hivatalos leánykori nevén struct exec).

Szerintem ne objdump-al próbálkozz, hanem objconv-al. Ezzel elvileg csinálhatsz belőle működő ELF-et. Megjegyzés: rég használtam, nem biztos, hogy tud még a.out-ot. Inkább BSD környékén keresgélnék, esetleg Plan9, azok még tartalmaznak a.out-ot ismerő toolokat. Első nekifutásra csak a másik irányt találtam, elf2aout, na neked ennek pont a fordítottja kellene, ugye.

Plan9 alatt létezik aout2elf, de gőzöm sincs, ez lefordul-e Linux-on. Ha minden kötél szakad, akkor végső megoldásként VM-be beröffenthetsz egy Plan9-t és azalatt átkonvertálhatod (az ELF fejlécben majd át kell ütni az ABI kódját, hogy nem Plan9, hanem Linux, de ez csak egyetlen bájt).

Valamint ezt találtam még:

Actually, binutils can "convert" (some) a.out programs into ELF files using objcopy. Whether they work or not is another question :)

Szóval esetleg binutils-beli objcopy is szóba jöhet (ha sikerül kitalálni a kapcsolóit). Mégha nem is működik a létrehozott ELF, onnan már egyszerűbb forrássá visszalakítani, mert jóval több tool van hozzá Linux alatt.
Hogy egyértelmű legyen, inkább a BSD-s objcopy-t próbáld, az tud még a.out bfd-t (binutils-nál fordításkori kapcsoló az a.out támogatás, esetleg fordítsd le magadnak az objcopy-t).

Azt szabad megkérdezni, hogy mi az ami még 20+ évvel később is fontos és nincs alternatívája? Vagy ez ilyen ebből is tanulok dolog?

Persze, hogy szabad.

TASM fordító (Telemark Assembler). Vannak régi gépek, amikhez minden vagy szinte minden forrás TASM fordítóra van megadva. Vannak ugyan alternatív fordítók, lehet is velük dolgozni, de mégis sokkal egyszerűbb lenne a TASM-mal dolgozni. Ennek is van windows és mac változata is, de mégis szívesebben dolgoznék a linux verzióval. Valahol elvileg forrása is van, de ezt sem sikerült megtalálnom.

Tehát van alternatívám, de most már érdekel, hogyan lehetne a linux változatot életrekelteni. Ráadásul sajnálnám is, ha egy annakidején ennyire elterjedt, és úgy tűnik hasznos eszköz, eltűnne.

Nekem 7-es unrar (meg 7-zip is) csont nélkül kicsomagolta, de a FreeBSD linuxulator sem szereti már ezt a futtatható formátumot.

Keresgélek én is toolok után, de egyelőre semmi érdemleges. Találtam egy szép blogbejegyzést az objectfájl formátumokról, ami beszél az a.out-ról, meg hivatkozik a FreeBSD-ben mai napig meglevő kézikönyvlapról ami szintén korrekten leírja; valamint hivatkozásokat aout2elf.c-re, pl. 2004-es NetBSD (akkor jelent meg a 2.0-s), aminek distrib/utils/sysinst/contrib könyvtárában talán volt ilyen; valamint más hivatkozásokat szintén NetBSD-re - mondjuk nekem gyanús, hogy az utóbbi aout2elf arról szól, hogy mit kell csinálni OS upgrade esetén, ha AOUT-os rendszert frissítünk már ELF-et használóra.

Még egy érdekesség szembejött: nem lehetne valahogy a QEMU-t és egy GRUB-ot úgy összeházasítani, hogy fenti alkalmazást futtassa spéci diszken ülő OS-ként? Valamikor a múltban mégiscsak ez volt a standard Linuxos futtatható, nem lehet, hogy a kernel is ilyen volt és a grub be tudta tölteni? (Ez is inkább csak érdekesség, szerintem nem visz közelebb - de szintén QEMU-t használ.)