Itusilẹ ti ile-ikawe C boṣewa Cosmopolitan 2.0, ti dagbasoke fun awọn faili imuṣiṣẹ

Itusilẹ ti iṣẹ akanṣe Cosmopolitan 2.0 ti ṣe atẹjade, idagbasoke ile-ikawe C boṣewa ati ọna kika faili ti gbogbo agbaye ti o le ṣee lo lati kaakiri awọn eto fun awọn ọna ṣiṣe oriṣiriṣi laisi lilo awọn onitumọ ati awọn ẹrọ foju. Abajade ti o gba nipasẹ iṣakojọpọ ni GCC ati Clang ti wa ni akopọ sinu ṣoki ti o sopọ mọ faili ti o le ṣiṣẹ ni gbogbo agbaye ti o le ṣiṣẹ lori pinpin Linux eyikeyi, macOS, Windows, FreeBSD, OpenBSD, NetBSD, ati paapaa pe lati BIOS. Koodu ise agbese ti pin labẹ iwe-aṣẹ ISC (ẹya ti o rọrun ti MIT/BSD).

Eiyan fun ṣiṣẹda awọn faili ṣiṣe ṣiṣe ni gbogbo agbaye da lori apapọ awọn apakan ati awọn akọle ni pato si awọn ọna ṣiṣe oriṣiriṣi (PE, ELF, MACHO, OPENBSD) ninu faili kan, apapọ ọpọlọpọ awọn ọna kika oriṣiriṣi ti a lo ni Unix, Windows ati macOS. Lati rii daju pe faili kan ti o le ṣiṣẹ lori awọn eto Windows ati Unix, ẹtan ni lati ṣe koodu awọn faili Windows PE bi awọn iwe afọwọkọ ikarahun, ni anfani ti otitọ pe Thompson Shell ko lo ami afọwọkọ “#!”. Lati ṣẹda awọn eto ti o pẹlu awọn faili pupọ (sisopọ gbogbo awọn orisun sinu faili kan), o ṣe atilẹyin didasilẹ faili ti o le ṣiṣẹ ni irisi ibi ipamọ ZIP ti a ṣe apẹrẹ pataki. Eto ọna kika ti a dabaa (apẹẹrẹ hello.com ohun elo):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(aṣẹ -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" jade ni 1 Ipo GIDI… ELF SEGMENTS… OPENBSD AKIYESI… MACHO HEADERS… CODE AND DATA… ZIP Itọnisọna…

Ni ibẹrẹ faili naa, aami “MZqFpD” jẹ itọkasi, eyiti o jẹ akiyesi bi akọsori ọna kika Windows PE. Ọkọọkan yii tun jẹ iyipada ninu itọnisọna “pop% r10; jno 0x4a; jo 0x4a", ati laini "\177ELF" si itọnisọna "jg 0x47", eyiti a lo lati firanṣẹ siwaju si aaye titẹsi. Awọn eto Unix nṣiṣẹ koodu ikarahun ti o nlo pipaṣẹ exec, ti o kọja koodu ṣiṣe nipasẹ paipu ti a ko darukọ. Idiwọn ọna ti a dabaa ni agbara lati ṣiṣẹ lori awọn ọna ṣiṣe bi Unix nikan ni lilo awọn ikarahun ti o ṣe atilẹyin ipo ibaramu Thompson Shell.

Ipe qemu-x86_64 n pese afikun gbigbe ati gba koodu ti a ṣajọpọ fun faaji x86_64 lati ṣiṣẹ lori awọn iru ẹrọ ti kii ṣe x86, gẹgẹbi awọn igbimọ Rasipibẹri Pi ati awọn ẹrọ Apple ti o ni ipese pẹlu awọn ero ARM. Ise agbese na tun le ṣee lo lati ṣẹda awọn ohun elo ti ara ẹni ti o nṣiṣẹ laisi ẹrọ ṣiṣe (irin igboro). Ni iru awọn ohun elo bẹ, bootloader ti wa ni asopọ si faili ti o le ṣiṣẹ, ati pe eto naa ṣiṣẹ bi ẹrọ ṣiṣe bootable.

Libc ikawe C boṣewa ti o dagbasoke nipasẹ iṣẹ akanṣe nfunni awọn iṣẹ 2024 (ni itusilẹ akọkọ awọn iṣẹ 1400 wa). Ni awọn ofin ti iṣẹ, Cosmopolitan n ṣiṣẹ ni iyara bi glibc ati pe o wa ni akiyesi niwaju Musl ati Newlib, botilẹjẹpe Cosmopolitan jẹ aṣẹ ti titobi kere ni iwọn koodu ju glibc ati isunmọ ni ibamu si Musl ati Newlib. Lati mu awọn iṣẹ ti a pe ni igbagbogbo bii memcpy ati strlen, ilana “iṣẹ-isalẹ” jẹ afikun lilo, ninu eyiti a ti lo abuda macro lati pe iṣẹ naa, ninu eyiti a ti sọ fun olupilẹṣẹ nipa awọn iforukọsilẹ Sipiyu ti o ni ipa ninu ipaniyan koodu. ilana, eyiti ngbanilaaye fifipamọ awọn orisun nigba fifipamọ ipo Sipiyu nipa fifipamọ awọn iforukọsilẹ iyipada nikan.

Lara awọn ayipada ninu itusilẹ tuntun:

  • Eto fun iwọle si awọn orisun inu inu faili zip kan ti yipada (nigbati o ba ṣii awọn faili, awọn ọna / zip/... deede ni a lo ni bayi dipo lilo zip: ìpele iṣaaju). Bakanna, lati wọle si awọn disiki ni Windows, o ṣee ṣe lati lo awọn ọna bii “/ c/...” dipo “C:/...”.
  • A ti dabaa agberu APE tuntun (Nitootọ Portable Executable) ti a ti dabaa, eyiti o ṣalaye ọna kika ti awọn faili ṣiṣe ṣiṣe gbogbo agbaye. Agberu tuntun nlo mmap lati gbe eto naa si iranti ati pe ko tun yi awọn akoonu pada mọ lori fo. Ti o ba jẹ dandan, faili ti o le ṣiṣẹ ni gbogbo agbaye le yipada si awọn faili ṣiṣe ṣiṣe deede ti a so si awọn iru ẹrọ kọọkan.
  • Lori pẹpẹ Linux, o ṣee ṣe lati lo module kernel binfmt_misc lati ṣiṣẹ awọn eto APE. O ṣe akiyesi pe lilo binfmt_misc jẹ ọna ifilọlẹ ti o yara ju.
  • Fun Lainos, imuse ti iṣẹ ṣiṣe ti ijẹri () ati ṣiṣafihan () awọn ipe eto ti o dagbasoke nipasẹ iṣẹ akanṣe OpenBSD ti ni imọran. A pese API kan fun lilo awọn ipe wọnyi ni awọn eto ni C, C++, Python ati Redbean, bakanna bi ohun elo pledge.com fun ipinya awọn ilana lainidii.
  • Itumọ naa nlo IwUlO IwUlO Landlock - ẹda ti GNU Ṣe pẹlu ṣiṣe ayẹwo igbẹkẹle lile diẹ sii ati lilo ipe eto Landlock lati ya sọtọ eto naa kuro ninu eto iyokù ati ilọsiwaju ṣiṣe caching. Gẹgẹbi aṣayan, agbara lati kọ pẹlu GNU Rii deede ti wa ni idaduro.
  • Awọn iṣẹ fun multithreading ti ni imuse - _spawn () ati _join (), eyiti o jẹ awọn asopọ agbaye lori API ni pato si awọn ọna ṣiṣe oriṣiriṣi. Iṣẹ tun n lọ lọwọ lati ṣe atilẹyin POSIX Threads.
  • O ṣee ṣe lati lo koko-ọrọ _Thread_local lati lo ibi ipamọ ọtọtọ fun okun kọọkan (TLS, Ibi ipamọ agbegbe-o tẹle). Nipa aiyipada, akoko asiko C naa ṣe ipilẹṣẹ TLS fun okun akọkọ, eyiti o jẹ ki iwọn ṣiṣe ti o kere ju lati pọsi lati 12 si 16 KB.
  • Atilẹyin fun “-ftrace” ati “-strace” paramita ti ni afikun si awọn faili ṣiṣe lati gbejade alaye nipa gbogbo awọn ipe iṣẹ ati awọn ipe eto si stderr.
  • Atilẹyin ti a ṣafikun fun ipe eto isunmọ lati (), atilẹyin lori Linux 5.9+, FreeBSD 8+ ati OpenBSD.
  • Lori pẹpẹ Linux, iṣẹ ti clock_gettime ati awọn ipe gettimeofday ti pọ si awọn akoko mẹwa 10 nipa lilo ẹrọ vDSO (ohun ti o pin ti o ni agbara foju), eyiti o jẹ ki o ṣee ṣe lati gbe olutọju ipe eto si aaye olumulo ati yago fun awọn iyipada ipo.
  • Awọn iṣẹ mathematiki fun sisẹ pẹlu awọn nọmba eka ti a ti gbe lati ibi ikawe Musl. Iṣẹ ti ọpọlọpọ awọn iṣẹ mathematiki ti ni iyara.
  • Iṣẹ nointernet() ti ni imọran lati mu awọn agbara nẹtiwọki ṣiṣẹ.
  • Awọn iṣẹ tuntun ti a ṣafikun fun imudara awọn gbolohun ọrọ: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf ati vappendf.
  • Ṣe afikun ẹya ti o ni aabo ti idile kprintf () ti awọn iṣẹ, ti a ṣe lati ṣiṣẹ pẹlu awọn anfani ti o ga.
  • Iṣe ilọsiwaju pataki ti SSL, SHA, curve25519 ati awọn imuse RSA.

orisun: opennet.ru

Fi ọrọìwòye kun