கையடக்க இயங்கக்கூடிய கோப்புகளுக்காக உருவாக்கப்பட்ட நிலையான சி லைப்ரரி காஸ்மோபாலிட்டன் 2.0 வெளியீடு

காஸ்மோபாலிட்டன் 2.0 திட்டத்தின் வெளியீடு வெளியிடப்பட்டது, நிலையான சி லைப்ரரி மற்றும் உலகளாவிய இயங்கக்கூடிய கோப்பு வடிவத்தை உருவாக்குகிறது, இது மொழிபெயர்ப்பாளர்கள் மற்றும் மெய்நிகர் இயந்திரங்களைப் பயன்படுத்தாமல் வெவ்வேறு இயக்க முறைமைகளுக்கான நிரல்களை விநியோகிக்கப் பயன்படுகிறது. GCC மற்றும் Clang இல் தொகுப்பதன் மூலம் பெறப்பட்ட முடிவு, எந்த Linux விநியோகம், macOS, Windows, FreeBSD, OpenBSD, NetBSD மற்றும் BIOS இலிருந்தும் கூட இயங்கக்கூடிய நிலையான இணைக்கப்பட்ட உலகளாவிய இயங்கக்கூடிய கோப்பாக தொகுக்கப்படுகிறது. திட்டக் குறியீடு ISC உரிமத்தின் கீழ் விநியோகிக்கப்படுகிறது (எம்ஐடி/பிஎஸ்டியின் எளிமைப்படுத்தப்பட்ட பதிப்பு).

யூனிக்ஸ், விண்டோஸ் மற்றும் மேகோஸில் பயன்படுத்தப்படும் பல்வேறு வடிவங்களை ஒருங்கிணைத்து, வெவ்வேறு இயக்க முறைமைகளுக்கு (PE, ELF, MACHO, OPENBSD) குறிப்பிட்ட பிரிவுகள் மற்றும் தலைப்புகளை ஒருங்கிணைத்து, உலகளாவிய இயங்கக்கூடிய கோப்புகளை உருவாக்குவதற்கான கொள்கலன் அடிப்படையாக உள்ளது. ஒரு இயங்கக்கூடிய கோப்பு விண்டோஸ் மற்றும் யூனிக்ஸ் கணினிகளில் இயங்குவதை உறுதி செய்ய, தாம்சன் ஷெல் "#!" ஸ்கிரிப்ட் மார்க்கரைப் பயன்படுத்தாததைப் பயன்படுத்தி, விண்டோஸ் PE கோப்புகளை ஷெல் ஸ்கிரிப்ட்களாக குறியாக்கம் செய்வது ஒரு தந்திரமாகும். பல கோப்புகளை உள்ளடக்கிய நிரல்களை உருவாக்க (அனைத்து ஆதாரங்களையும் ஒரு கோப்பில் இணைக்கிறது), இது சிறப்பாக வடிவமைக்கப்பட்ட ZIP காப்பகத்தின் வடிவத்தில் இயங்கக்கூடிய கோப்பை உருவாக்குவதை ஆதரிக்கிறது. முன்மொழியப்பட்ட வடிவமைப்பின் திட்டம் (உதாரணம் hello.com பயன்பாடு):

MZqFpD='BIOS BOOT SECTOR' exec 7 $(command -v $0) printf '\177ELF...LINKER-ENCODED-FREEBSD-HEADER' >&7 exec "$0" "$@" exec qemu-x86_64 "$0" "$ @" 1 உண்மையான பயன்முறையிலிருந்து வெளியேறு... ELF பிரிவுகள்... OPENBSD குறிப்பு... மச்சோ ஹெடர்கள்... குறியீடு மற்றும் தரவு... ZIP அடைவு...

கோப்பின் தொடக்கத்தில், "MZqFpD" லேபிள் குறிக்கப்படுகிறது, இது விண்டோஸ் PE வடிவமைப்பு தலைப்பாக கருதப்படுகிறது. இந்த வரிசையானது "pop %r10; jno 0x4a; jo 0x4a", மற்றும் "jg 177x0" அறிவுறுத்தலுக்கான வரி "\47ELF", அவை நுழைவுப் புள்ளிக்கு அனுப்பப் பயன்படும். யூனிக்ஸ் சிஸ்டம்கள் ஷெல் குறியீட்டை இயக்குகிறது, இது exec கட்டளையைப் பயன்படுத்துகிறது, பெயரிடப்படாத குழாய் வழியாக இயங்கக்கூடிய குறியீட்டை அனுப்புகிறது. முன்மொழியப்பட்ட முறையின் வரம்பு, தாம்சன் ஷெல் இணக்கத்தன்மை பயன்முறையை ஆதரிக்கும் ஷெல்களைப் பயன்படுத்தி மட்டுமே யூனிக்ஸ் போன்ற இயக்க முறைமைகளில் இயங்கும் திறன் ஆகும்.

qemu-x86_64 அழைப்பு கூடுதல் பெயர்வுத்திறனை வழங்குகிறது மற்றும் x86_64 கட்டமைப்பிற்காக தொகுக்கப்பட்ட குறியீட்டை x86 அல்லாத இயங்குதளங்களில் இயக்க அனுமதிக்கிறது. இயக்க முறைமை (வெற்று உலோகம்) இல்லாமல் இயங்கும் தன்னிறைவான பயன்பாடுகளை உருவாக்கவும் இந்த திட்டம் பயன்படுத்தப்படலாம். அத்தகைய பயன்பாடுகளில், ஒரு துவக்க ஏற்றி இயங்கக்கூடிய கோப்பில் இணைக்கப்பட்டுள்ளது, மேலும் நிரல் துவக்கக்கூடிய இயக்க முறைமையாக செயல்படுகிறது.

திட்டத்தால் உருவாக்கப்பட்ட நிலையான C லைப்ரரி libc 2024 செயல்பாடுகளை வழங்குகிறது (முதல் வெளியீட்டில் சுமார் 1400 செயல்பாடுகள் இருந்தன). செயல்திறனைப் பொறுத்தவரை, காஸ்மோபாலிட்டன் glibc போல வேகமாகச் செயல்படுகிறது மற்றும் Musl மற்றும் Newlib ஐ விட குறிப்பிடத்தக்க வகையில் முன்னணியில் உள்ளது, காஸ்மோபாலிட்டன் என்பது glibc ஐ விட குறியீடு அளவில் சிறிய அளவிலும் Musl மற்றும் Newlib உடன் ஒத்ததாக இருந்தாலும். memcpy மற்றும் strlen போன்ற அடிக்கடி அழைக்கப்படும் செயல்பாடுகளை மேம்படுத்த, "ட்ரிக்கிள்-டவுன் பெர்ஃபார்மென்ஸ்" நுட்பம் கூடுதலாகப் பயன்படுத்தப்படுகிறது, இதில் ஒரு மேக்ரோ பைண்டிங் செயல்பாட்டை அழைக்க பயன்படுத்தப்படுகிறது, இதில் குறியீடு செயல்படுத்தலில் ஈடுபட்டுள்ள CPU பதிவேடுகள் பற்றி கம்பைலருக்கு தெரிவிக்கப்படுகிறது. செயல்முறை, மாற்றக்கூடிய பதிவேடுகளை மட்டுமே சேமிப்பதன் மூலம் CPU நிலையை சேமிக்கும் போது வளங்களை சேமிக்க அனுமதிக்கிறது.

புதிய வெளியீட்டில் உள்ள மாற்றங்களில்:

  • ஜிப் கோப்பிற்குள் உள் வளங்களை அணுகுவதற்கான திட்டம் மாற்றப்பட்டுள்ளது (கோப்புகளைத் திறக்கும் போது, ​​zip:.. முன்னொட்டைப் பயன்படுத்துவதற்குப் பதிலாக வழக்கமான /zip/... பாதைகள் இப்போது பயன்படுத்தப்படுகின்றன). இதேபோல், விண்டோஸில் வட்டுகளை அணுக, "C:/..." என்பதற்கு பதிலாக "/c/..." போன்ற பாதைகளைப் பயன்படுத்த முடியும்.
  • ஒரு புதிய APE (உண்மையில் போர்ட்டபிள் இயங்கக்கூடிய) ஏற்றி முன்மொழியப்பட்டது, இது உலகளாவிய இயங்கக்கூடிய கோப்புகளின் வடிவமைப்பை வரையறுக்கிறது. புதிய ஏற்றி நிரலை நினைவகத்தில் வைக்க mmap ஐப் பயன்படுத்துகிறது மேலும் பறக்கும்போது உள்ளடக்கங்களை மாற்றாது. தேவைப்பட்டால், உலகளாவிய இயங்கக்கூடிய கோப்பை தனிப்பட்ட இயங்குதளங்களுடன் இணைக்கப்பட்ட வழக்கமான இயங்கக்கூடிய கோப்புகளாக மாற்றலாம்.
  • லினக்ஸ் இயங்குதளத்தில், APE நிரல்களை இயக்க binfmt_misc கர்னல் தொகுதியைப் பயன்படுத்த முடியும். binfmt_misc ஐப் பயன்படுத்துவது வேகமான வெளியீட்டு முறையாகும் என்பது குறிப்பிடத்தக்கது.
  • லினக்ஸுக்கு, OpenBSD திட்டத்தால் உருவாக்கப்பட்ட உறுதிமொழி() மற்றும் unveil() அமைப்பு அழைப்புகளின் செயல்பாட்டின் செயலாக்கம் முன்மொழியப்பட்டது. C, C++, Python மற்றும் Redbean இல் உள்ள நிரல்களில் இந்த அழைப்புகளைப் பயன்படுத்துவதற்கு ஒரு API வழங்கப்படுகிறது, அத்துடன் தன்னிச்சையான செயல்முறைகளைத் தனிமைப்படுத்துவதற்கான pledge.com பயன்பாடும் வழங்கப்படுகிறது.
  • கட்டமைப்பானது லேண்ட்லாக் மேக் பயன்பாட்டைப் பயன்படுத்துகிறது - குனு மேக்கின் பதிப்பு மிகவும் கடுமையான சார்பு சரிபார்ப்பு மற்றும் லேண்ட்லாக் சிஸ்டம் அழைப்பைப் பயன்படுத்தி நிரலை மற்ற கணினியிலிருந்து தனிமைப்படுத்தவும், கேச்சிங் செயல்திறனை மேம்படுத்தவும் பயன்படுத்துகிறது. ஒரு விருப்பமாக, வழக்கமான குனு மேக்குடன் உருவாக்கும் திறன் தக்கவைக்கப்படுகிறது.
  • மல்டித்ரெடிங்கிற்கான செயல்பாடுகள் செயல்படுத்தப்பட்டுள்ளன - _spawn() மற்றும் _join(), இவை வெவ்வேறு இயக்க முறைமைகளுக்கு குறிப்பிட்ட APIகள் மீது உலகளாவிய பிணைப்புகளாகும். POSIX Threads ஆதரவை செயல்படுத்துவதற்கான பணியும் நடந்து வருகிறது.
  • ஒவ்வொரு தொடருக்கும் தனித்தனி சேமிப்பகத்தைப் பயன்படுத்த _Thread_local முக்கிய சொல்லைப் பயன்படுத்த முடியும் (TLS, Thread-Local Storage). இயல்பாக, C ரன்டைம் முக்கிய தொடருக்கான TLS ஐ துவக்குகிறது, இது குறைந்தபட்ச இயங்கக்கூடிய அளவு 12 KB இலிருந்து 16 KB ஆக அதிகரிக்க காரணமாகிறது.
  • அனைத்து செயல்பாட்டு அழைப்புகள் மற்றும் கணினி அழைப்புகள் பற்றிய தகவல்களை stderr க்கு வெளியிட, "--ftrace" மற்றும் "--strace" அளவுருக்களுக்கான ஆதரவு இயங்கக்கூடிய கோப்புகளில் சேர்க்கப்பட்டுள்ளது.
  • Linux 5.9+, FreeBSD 8+ மற்றும் OpenBSD ஆகியவற்றில் ஆதரிக்கப்படும் Closefrom() கணினி அழைப்புக்கான ஆதரவு சேர்க்கப்பட்டது.
  • லினக்ஸ் இயங்குதளத்தில், vDSO (விர்ச்சுவல் டைனமிக் ஷேர் ஆப்ஜெக்ட்) பொறிமுறையைப் பயன்படுத்துவதன் மூலம் clock_gettime மற்றும் gettimeofday அழைப்புகளின் செயல்திறன் 10 மடங்கு வரை அதிகரிக்கப்பட்டுள்ளது, இது கணினி அழைப்பு ஹேண்ட்லரை பயனர் இடத்திற்கு நகர்த்தவும் சூழல் சுவிட்சுகளைத் தவிர்க்கவும் உதவுகிறது.
  • சிக்கலான எண்களுடன் வேலை செய்வதற்கான கணித செயல்பாடுகள் Musl நூலகத்திலிருந்து நகர்த்தப்பட்டுள்ளன. பல கணித செயல்பாடுகளின் வேலை துரிதப்படுத்தப்பட்டுள்ளது.
  • பிணைய திறன்களை முடக்குவதற்கு noninternet() செயல்பாடு முன்மொழியப்பட்டது.
  • சரங்களை திறம்படச் சேர்ப்பதற்கான புதிய செயல்பாடுகளைச் சேர்த்தது: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf மற்றும் vappendf.
  • kprintf() குடும்பச் செயல்பாடுகளின் பாதுகாக்கப்பட்ட பதிப்பு சேர்க்கப்பட்டது, உயர்ந்த சலுகைகளுடன் வேலை செய்ய வடிவமைக்கப்பட்டுள்ளது.
  • SSL, SHA, curve25519 மற்றும் RSA செயலாக்கங்களின் குறிப்பிடத்தக்க மேம்படுத்தப்பட்ட செயல்திறன்.

ஆதாரம்: opennet.ru

கருத்தைச் சேர்