4.12. Хоёртын хэлбэрүүд

FreeBSD яагаад elf(5) хэлбэр хэрэглэдгийг ойлгохын тулд, та ачаалагдаж ажилладаг файлын төрлөөс UNIX® дээр “ноёлдог” гурван хэлбэрийг мэдэх ёстой:

FreeBSD нь хуучны “сонгодог” отгоос салбарлаж гарсан тул a.out(5) хэлбэрийг хэрэглэж байсан бөгөөд энэ хэлбэрээ 3.X салбар гарах хүртэл маш олон BSD хувилбартаа ашиглаж байжээ. Хэдийгээр FreeBSD дээр өмнө нь ELF хоёртын хэлбэрийг хөрвүүлж мөн ажиллуулж (цөм дээр ч гэсэн) болдог байсан ч, FreeBSD нь анхнаасаа ELF хэлбэрийг анхдагч хэлбэрээ болгохыг “татгалзсан” билээ. Яагаад? Учир нь, Линукс систем нь хуваалцдаг кодын сан буюу “Shared-Libraries” -д зориулсан үсэрч ажилладаг хүснэгт, мөн түүнийг хөгжүүлэгчид болон байгууллагад хүндрэлтэй байдаг шалтгаанаар a.out хэлбэрээс зайлсхийж ELF хэлбэр рүү шилжих гэж нүсэр хүнд хөдөлмөр зарсан юм. ELF хэлбэр нь хуваалцдаг кодын сан буюу “Shared-Libraries” хүндрэлийг давах боломж олгосон хэрэгслүүдийг санал болгосон бөгөөд тэгээд ч хөгжлийн явцад “нэг алхам урд нь” явж байгааг бодож мөн нэг хэлбэрээс нөгөө хэлбэрт шилжүүлэх үйл явцад гарах хүнд зардал байсан ч шилжүүлэхээр шийдсэн юм. FreeBSD-н кодын санг хуваалцах зарчим нь Sun-н SunOS™ загвартай ижил бөгөөд хэрэглэхэд тун хялбар.

Тэгэхээр, яагаад ийм олон хэлбэр байдаг юм бэ?

Энэ асуултанд хариулахын тулд хуучны, энгийн ажиллах зарчимтай төхөөрөмж хэрэглэж байсан бүүдгэр өнгөрсөн цаг уруу буцацгаая. Энэ энгийн төхөөрөмж нь энгийн жижигхэн систем дээр л ажиллахыг хүснэ. a.out нь (PDP-11) төрлийн иймэрхүү энгийн систем дээр бүгдийг нь хангаж байлаа. Хүмүүс UNIX системийг ийм энгийн системээс үүсгэсэн болохоор хуучны загвар болох Motorola 68k, VAXen зэрэг системтэй зохицохын тулд a.out хэлбэрийг үлдээсэн юм.

Тэгтэл дараа нь нэг сүрхий инженер хөвүүн, зохиогдсон төхөөрөмжийн зарим ажиллах сул талыг нөхөж процессорыг илүү хурдан ажиллуулах хөнгөхөн програм бичжээ. Энэ програм нь шинэ төрлийн архитектурт (тэр үедээ RISC гэж нэрлэгддэг байсан архитектур) зориулан ажиллахаар бичигдсэн болохоор a.out хэлбэр нь энэ төхөөрөмжид тохиромжгүй болон хангахуйц сайн биш болж ирэв. Тийм болохоор энэ шинэ төхөөрөмжтэй илүү үр дүнтэй ажиллахын тулд илүү олон хэлбэрүүд шинэ загварт зориулж зохиогдож байсан бөгөөд хуучин төрөлд бол энгийн a.out төрлийг санал болгож болох юм. COFF, ECOFF мөн өөр илүү хэд хэдэн хэлбэр нь алдаануудаа нөхөн дэс дараалан үүсгэгдсээр ELF хүртэл хөгжжээ.

Мөн цаашлаад програмын хэмжээ хэдийгээр ихэссэн ч дискний (мөн санах ойн) хэмжээ харьцангуй бага байсан болохоор хуваалцаж болдог кодын сангийн “Shared-Libraries” санаа үүссэн юм. Мөн VM системүүд сайн хөгжиж эхлэв. Хэдийгээр эдгээр сайжруулалт болгон a.out хэлбэрийг хэрэглэж байсан ч, шинэ боломжууд үүсэх тоолонд энэ хэлбэрийг хэрэглэхгүй болж ирэх нь улам ихэссэн билээ. Мөн түүнчлэн, санах ойг хэмнэх үүднээс эхлэн ачаалсны дараа өөр тийшээ үсрэх юм уу эсвэл явцын дунд код нэмэгдэж болох загваруудыг хүмүүс сонирхож эхлэв. Програмын хэлүүд улам сайжирч хүмүүс програмын үндсэн хэсгийг автоматжуулсан код хүсэх болжээ. Энэ бүх боломжуудыг биелүүлэх гэж a.out хэлбэрийг маш их олон янзаар яргалсан бөгөөд хэсэгтээ л энэ нь ажилладаг байв. Нэг мэдэхэд a.out хэлбэр нь ихсэж буй бүх хүндрэлийг зохицуулж чадахааргүй бичлэгийн төвөгтэй болон хэрэглэхэд хэцүү байдалд хүрсэн байна. Хэдийгээр энэ хүндрэлүүдийг ELF хэлбэр нь давдаг боловч шилжих явц нь маш хүндрэлтэй байдаг. Тийм болохоор ELF хэлбэр руу шилжих төвөг нь a.out хэлбэрийг хэрэглэх төвгөөс их байвал ELF хэлбэр нь хүлээгдэхээс өөр аргагүй болжээ.

Гэвч цаг хугацаа өнгөрсөөр, FreeBSD ба түүний уламжилж гарсан системийн хөрвүүлэх хэрэгсэл нь (ялангуяа ассемблер болон дуудагч буюу loader) хоёр замаар зэрэг хөгжсөөр байв. FreeBSD салаа нь кодын хуваалцдаг санг нэмж мөн зарим алдааг нь залруулсан байна. Үүнийг анх бичсэн GNU-н ард түмэн уг кодоо шинэчилж дахин бичээд янз бүрийн хэлбэрүүдийг нэмж болдог болгоод мөн хөрвүүлэгчээс хамааралгүй хөрвүүлэгддэг болгох зэрэг цааш нь хөгжүүлжээ. Хэдийгээр маш олон хүн FreeBSD дээр хөрвүүлэгчээс хамаарахгүй хөрвүүлэхийг хүссэн боловч FreeBSD-н as болон ld-д зориулсан хуучин кодноос болоод азгүйтжээ. GNU-н шинэ хэрэгслүүд нь (binutils) хөрвүүлэгчээс хамааралгүй, ELF, кодын хуваалцдаг сан, C++ өргөтгөл зэргүүдийг хөрвүүлж чаддаг болжээ. Мөн цаашлаад маш олон байгууллагууд ELF хэлбэртэй хоёртын програмуудыг гаргаж эхэлсэн тул тэдгээрийг хэрэглэхийн тулд FreeBSD уг хэлбэрийг дэмжих нь зөв гэж шийдсэн юм.

ELF хэлбэр нь a.out хэлбэрийг бодвол илүү өргөн хүрээтэй бөгөөд үндсэн системийг илүү өргөжүүлдэг. ELF хэрэгслүүд нь маш сайн зохион байгуулагдсан бөгөөд хөрвүүлэгчээс хамаардаггүй болохоор хүмүүсийн хүсэлд яг тохирдог. ELF нь a.out хэлбэрийг бодвол жаахан удаан байж болох боловч үүнийг хэмжиж тодорхойлно гэдэг нь хэцүү билээ. Мөн энэ хоёрыг санах ойд хуудас зохицуулах, эхлэн ажиллах зарчим зэргийг нь харьцуулсан маш олон шинж чанарууд байдаг. Тэдгээр шинж чанарууд нь тийм ч чухал биш бөгөөд энэ нь зөвхөн ялгаа нь билээ. Одоо бол a.out хэлбэр нь GENERIC цөмөөс хасагдсан бөгөөд a.out хэлбэрийг ажиллуулдаг байсан цөм нь хуучны цөмд тооцогдоно.

Энэ болон бусад баримтуудыг ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ хаягаас татаж авч болно.

FreeBSD-ийн талаар <questions@FreeBSD.org> хаягтай холбоо барихаасаа өмнө баримтыг уншина уу.
Энэ бичиг баримттай холбоотой асуулт байвал <doc@FreeBSD.org> хаягаар цахим захидал явуулна уу.
Энэ бичиг баримтын орчуулгатай холбоотой асуулт байвал <admin@mnbsd.org> хаягаар цахим захидал явуулна уу.