Чи переносять бінарні файли в різних архітектурах процесора?


16

Моя мета - мати можливість розробляти для вбудованого Linux. Я маю досвід роботи з вбудованими голими металами в системах ARM.

У мене є загальні питання щодо розробки різних цілей процесора. Мої запитання:

  1. Якщо у мене є програма, скомпільована для запуску на ' x86 target, linux OS xyz ', чи можу я просто запустити той самий скомпільований двійковий файл на іншій системі ' ARM target, Linux OS Xyz '?

  2. Якщо вище не відповідає дійсності, єдиний спосіб - отримати вихідний код програми для відновлення / перекомпіляції, використовуючи відповідну ланцюжок інструментів «наприклад, arm-linux-gnueabi»?

  3. Так само, якщо я маю завантажуваний модуль ядра (драйвер пристрою), який працює на ' x86 target, linux OS версії xyz ', чи можу я просто завантажити / використовувати те саме, що складено .ko в іншій системі ' ARM target, linux OS version xyz ' ?

  4. Якщо вище не відповідає дійсності, єдиний спосіб - отримати вихідний код драйвера для відновлення / перекомпіляції, використовуючи відповідну ланцюжок інструментів «наприклад, arm-linux-gnueabi»?


27
ні, так, ні, так.
варення

7
Це допомагає зрозуміти, що у нас немає цілі AMD та Intel, а лише однієї цілі x86 для обох. Це тому, що Intel та AMD достатньо сумісні. Потім стає очевидним, що ціль ARM існує з певної причини, а саме тому, що процесори ARM не сумісні з Intel / AMD / x86.
MSalters

1
Ні, якщо тільки це не байт-код, призначений для роботи в таких портативних середовищах виконання, як Java Runtime. Якщо ви пишете код для вбудованого використання, ваш код, ймовірно, буде покладатися на низькорівневі оптимізації процесора або функції, і його буде важко переносити, вимагаючи більше, ніж просто компіляція для цільової платформи (наприклад, зміни коду складання, можливо перезапис кілька модулів або всієї програми).
bwDraco

1
@MSalters: Насправді ми маємо ціль AMD: amd64, яку часто позначають x86-64 (в той час як x86 зазвичай є повторним маркуванням i386). На щастя, Intel скопіювала (і пізніше розширила) архітектуру AMD, тому будь-який 64-бітний x86 може запускати бінарні файли amd64.
slebetman

Відповіді:


42

Ні. Бінарні файли повинні бути (повторно) складені для цільової архітектури, і Linux не пропонує нічого, як жирові бінарні файли поза коробкою. Причина полягає в тому, що код компілюється в машинний код для певної архітектури, а машинний код сильно відрізняється між більшістю сімейств процесорів (наприклад, ARM та x86 дуже різні).

EDIT: варто відзначити, що деякі архітектури пропонують рівні сумісності назад (і навіть рідше, сумісність з іншими архітектурами); У 64-розрядних процесорах звичайно є зворотна сумісність із 32-розрядними виданнями (але пам’ятайте: ваші залежні бібліотеки також повинні бути 32-бітними, включаючи стандартну бібліотеку С, якщо ви статично не посилаєтесь ). Також варто згадати Itanium , де можна було запускати код x86 (лише 32-бітний), хоча і дуже повільно; низька швидкість виконання коду x86 була принаймні частиною причини того, що він не був дуже успішним на ринку.

Майте на увазі, що ви все ще не можете використовувати бінарні файли, складені з новішими інструкціями щодо старих процесорів, навіть у режимах сумісності (наприклад, ви не можете використовувати AVX у 32-бітному бінарному процесорі Nehalem x86 ; процесор просто не підтримує його.

Зауважте, що модулі ядра повинні бути складені для відповідної архітектури; крім того, 32-бітні модулі ядра не працюватимуть на 64-бітних ядрах або навпаки.

Для отримання інформації про крос-компіляції бінарних файлів (тому вам не потрібно мати ланцюжок інструментів на цільовому пристрої ARM), див. Вичерпну відповідь grochmal нижче.


1
Можливо, варто уточнити будь-яку сумісність (або її відсутність) між x86 та x64, враховуючи, що деякі бінарні файли x86 можуть працювати на платформах x64. (Я не впевнений, що це так у Linux, але це, наприклад, у Windows.)
jpmc26

4
@ jpmc26 це можливо в Linux; але вам може знадобитися спочатку встановити бібліотеки сумісності Підтримка x86 - необов'язкова частина встановлення Win64. У Linux це необов’язково; і тому, що Linux у світі набагато далі за створенням 64-бітових версій всього доступного, деякі дистрибутиви не за замовчуванням встановлюють (усі?) 32-бітні бібліотеки. (Я не впевнений, наскільки це часто; але раніше я бачив кілька запитів у людей, які працюють з дистрибутивом mainstreamish.)
Dan is Fiddling by Firelight

@ jpmc26 Я оновив свою відповідь вашими замітками; Я думав про те, щоб згадати це, але не хотів ускладнювати відповідь.
Елізафокс

16

Елізабет Майєрс правильно, кожна архітектура вимагає складеного двійкового файлу для відповідної архітектури. Щоб створити бінарні файли для іншої архітектури, ніж ваша система працює, вам потрібно cross-compiler.


У більшості випадків потрібно скласти перехресний компілятор. У мене є лише досвід gcc(але я вважаю, що llvmі інші компілятори мають подібні параметри). gccКрос-компілятор досягається шляхом додавання --targetдо конфігурації:

./configure --build=i686-arch-linux-gnu --target=arm-none-linux-gnueabi

Вам потрібно зібрати gcc, glibcі binutilsз цими параметрами (і забезпечують заголовки ядра ядра на цільовій машині).

На практиці це значно складніше, і в різних системах виникають різні помилки побудови.

Існує кілька посібників про те, як скласти інструментальну мережу GNU, але я рекомендую Linux From Scratch , який постійно підтримується і робить дуже хорошу роботу при поясненні того, що роблять представлені команди.

Інший варіант - компіляція перехресного компілятора для завантаження. Завдяки боротьбі компіляції крос-компіляторів до різних архітектур crosstool-ngбуло створено різні архітектури . Це дає завантажувальний інструмент над ланцюжком інструментів, необхідним для складання перехресного компілятора.

crosstool-ngпідтримує декілька цільових триплетів в різних архітектурах, в основному це завантажувальна програма, де люди присвячують свій час, щоб розібратися в проблемах, що виникають під час компіляції інструментів крос-компілятора.


Кілька дистрибутивів надають крос-компілятори як пакети:

Іншими словами, перевірте, що ваш дистрибутив доступний щодо перехресних компіляторів. Якщо у вашому дистрибутиві немає крос-компілятора для ваших потреб, ви завжди можете його скласти самостійно.

Список літератури:


Примітка модулів ядра

Якщо ви збираєте крос-компілятор вручну, у вас є все необхідне для складання модулів ядра. Це тому, що вам потрібні заголовки ядра для компіляції glibc.

Але якщо ви використовуєте крос-компілятор, наданий вашим дистрибутивом, вам знадобляться заголовки ядра ядра, яке працює на цільовій машині.


FWIW Fedora також включає крос-компілятори.
mattdm

@mattdm - дякую, відповідь налаштовано, я вважаю, що я отримав пов'язану правильну частину вікі Fedora.
grochmal

2
Простіший спосіб, ніж Linux From Scratch, отримати Linux та ланцюжок інструментів для іншої архітектури crosstool-ng. Ви можете додати це до списку. Крім того, вручну налаштовувати та компілювати перехресний ланцюжок інструментів GNU для будь-якої заданої архітектури неймовірно задіяно та набагато стомливіше, ніж лише --targetпрапори. Я підозрюю, що це частина, чому LLVM набирає популярності; Він сконструйований таким чином, що для націлювання на іншу архітектуру вам не потрібна перебудова - натомість ви можете орієнтуватися на декілька програмних серверів, використовуючи однакові бібліотеки інтерфейсу та оптимізатора.
Iwillnotexist Idonotexist

@IwillnotexistIdonotexist - спасибі, я ще більше змінив відповідь. Я ніколи раніше не чув про crosstool-ng, і це виглядає дуже корисно. Ваш коментар насправді був для мене досить корисним.
grochmal

9

Зауважте, що в крайньому випадку (тобто, коли у вас немає вихідного коду), ви можете запускати бінарні файли в іншій архітектурі, використовуючи емулятори типу qemu, dosboxабо exagear. Деякі емулятори розроблені для емуляції інших систем, ніж Linux (наприклад dosbox, призначені для запуску програм MS-DOS, і для популярних ігрових консолей є багато емуляторів). Емуляція має значну ефективність роботи: емульовані програми працюють у 2-10 разів повільніше, ніж їх рідні аналоги.

Якщо вам потрібно запустити модулі ядра в неродньому процесорі, вам доведеться емулювати всю ОС, включаючи ядро ​​для тієї ж архітектури. AFAIK неможливо запустити іноземний код всередині ядра Linux.


3
Штраф швидкості для емуляції часто навіть перевищує 10 разів, але якщо хтось намагається запустити код, записаний для машини 16 МГц на машині 4 ГГц (різниця швидкості 250: 1), емулятор, який має покарання швидкості 50: 1, все ж може запустити код набагато швидше, ніж це було б на оригінальній платформі.
supercat

7

Бінарні файли не тільки переносяться між x86 та ARM, але й різні аромати ARM .

Той, з яким ви, мабуть, зіткнетесь на практиці - це ARMv6 проти ARMv7. Raspberry Pi 1 - це ARMv6, пізніші версії - ARMv7. Таким чином, можна скласти код на пізніші, які не працюють на Pi 1.

На щастя, однією з переваг відкритого та вільного програмного забезпечення є джерело, щоб ви могли відновити його на будь-якій архітектурі. Хоча це може зажадати певної роботи.

(Версія ARM є заплутаною, але якщо перед номером є V, це говорить про архітектуру набору інструкцій (ISA). Якщо цього немає, це номер моделі типу "Cortex M0" або "ARM926EJS". Номери моделей нічого не мають робити з номерами ISA.)


2
... а потім є навіть різні підсмаги для одного і того ж аромату ARM, і навіть різні ABI для точно такого ж обладнання (я думаю про весь ARM soft / softfp / hard безладно з плаваючою точкою).
Matteo Italia

1
@MatteoItalia Цьфу. Багаторазові ІПС були спринцюванням, ліком від чогось, що було гірше від хвороби. Деякі ARM взагалі не мали регістрів VFP або NEON, деякі мали 16, деякі 32. На Cortex-A8 і раніше двигун NEON запускав десяток CCs за рештою основної частини ядра, тому перенесення векторного виводу на GPR коштувало дорого багато. ARM зробила правильну справу - вимагаючи великого загального набору функцій.
Iwillnotexist Idonotexist

7

Завжди потрібно орієнтуватися на платформу. У найпростішому випадку цільовий процесор безпосередньо запускає код, складений у двійковій системі (це приблизно відповідає COM-файлам MS DOS COM). Розглянемо дві різні платформи, які я щойно винайшов - Armistice та Intellio. В обох випадках у нас буде проста привіт світова програма, яка виводить 42 на екран. Я також припускаю, що ви використовуєте багатоплатформенну мову платформо-агностично, тому вихідний код є однаковим для обох:

Print(42)

На Armistice у вас є простий драйвер пристрою, який піклується про друк номерів, тому все, що вам потрібно зробити, це вивести на порт. У нашій переносній мові збірки це відповідатиме приблизно такому:

out 1234h, 42

Однак або в системі Intellio такого немає, тому вона має пройти інші шари:

mov a, 10h
mov c, 42
int 13h

На жаль, у нас вже є значна різниця між ними, перш ніж ми навіть перейдемо до машинного коду! Це приблизно відповідатиме різниці між Linux та MS DOS або IBM PC та X-Box (навіть якщо обидва можуть використовувати один і той же процесор).

Але саме для цього потрібні ОС. Припустимо, у нас є HAL, який гарантує, що всі різні апаратні конфігурації керуються однаковим чином на рівні програми - в основному, ми будемо використовувати підхід Intellio навіть у Armistice, і наш код «портативної збірки» закінчується тим самим. Це використовується як сучасними системами, схожими на Unix, так і Windows, часто навіть у вбудованих сценаріях. Добре - тепер ми можемо мати однаковий по-справжньому переносний код складання і на Перемир'я, і ​​на Інтелліо. А як щодо бінарних файлів?

Як ми припустили, ЦП повинен виконувати бінарне безпосередньо. Давайте подивимось на перший рядок нашого коду mov a, 10hна Intellio:

20 10

Ой. Виявляється, mov a, constantнастільки популярний, що має власну інструкцію із власним кодом. Як це вирішує питання перемир'я?

36 01 00 10

Хм. Там є опкод mov.reg.imm, тому нам потрібен ще один аргумент для вибору реєстру, який ми призначаємо. І константа - це завжди 2-байтне слово в позначеннях big-endian - саме так було розроблено перемир'я, насправді всі вказівки в Armistice - це 4 байти, не виняток.

Тепер уявіть, що бінарні файли від Intellio від Armistice: процесор починає розшифровувати інструкцію, знаходить опкод 20h. Що стосується перемир'я, це відповідає, скажімо, and.imm.regінструкції. Він намагається прочитати 2-байтне слово константа (яке читає 10XX, вже є проблема), а потім номер регістра (інший XX). Ми виконуємо неправильну інструкцію, неправильні аргументи. І що ще гірше, наступна інструкція буде цілковитою, бо ми насправді їли ще одну інструкцію, думаючи, що це дані.

У додатку немає шансів працювати, і він, швидше за все, вийде з ладу або зависне майже відразу.

Тепер це не означає, що виконуваному файлу завжди потрібно говорити, що він працює на Intellio або Armistice. Вам просто потрібно визначити платформу, незалежну від процесора (як, наприклад, bashна Unix) або обох процесорів і ОС (наприклад, Java або .NET, а нині навіть JavaScript). У цьому випадку програма може використовувати один виконуваний файл для всіх різних процесорів та ОС, хоча в цільовій системі є якийсь додаток чи послуга (яка спрямована на правильний процесор та / або ОС безпосередньо), яка перетворює незалежний від платформи код у щось Процесор може насправді виконувати. Це може бути, а може і не спричинити удар за продуктивністю, вартістю чи можливостями.

Процесори зазвичай бувають у сім'ях. Наприклад, всі процесори з сім'ї x86 мають загальний набір інструкцій, кодованих точно однаково, тому кожен процесор x86 може запускати кожну програму x86, доки він не намагається використовувати будь-які розширення (наприклад, операції з плаваючою комою або операції з вектором). На x86, найпоширеніші приклади сьогодні, звичайно, Intel та AMD. Atmel - відома компанія, що розробляє процесори в сім'ї ARM, досить популярна для вбудованих пристроїв. Наприклад, Apple має власні ARM-процесори.

Але ARM абсолютно несумісний з x86 - вони мають дуже різні вимоги до дизайну і мають дуже мало спільного. Інструкції мають абсолютно різні коди, вони розшифровуються по-різному, адреси пам'яті трактуються по-різному ... Можливо, можливо зробити бінарний, що працює як на процесорі x86, так і на ARM-процесорі, використовуючи деякі безпечні операції, щоб розрізняйте два і переходьте до двох абсолютно різних наборів інструкцій, але це все ще означає, що у вас є окремі інструкції для обох версій, просто завантажувач, який підбирає правильний набір під час виконання.


3

Це питання можна повторно поставити в оточення, яке може бути більш звичним. За аналогією:

"У мене є програма Ruby, яку я хочу запустити, але на моїй платформі є лише інтерпретатор Python. Чи можу я використовувати інтерпретатор Python для запуску своєї програми Ruby, чи потрібно переписати свою програму в Python?"

Архітектура набору інструкцій ("target") - це мова - "машинна мова" - і різні ЦП реалізують різні мови. Тому просити процесор ARM для запуску бінарного процесора Intel дуже схожий на спробу запустити програму Ruby за допомогою інтерпретатора Python.


2

gcc використовує терміни "архітектура" для позначення "набору інструкцій" певного процесора, а "target" охоплює комбінацію CPU та архітектури, а також інші змінні, такі як ABI, libc, endian-ness та багато іншого (можливо, включаючи "голий метал"). Типовий компілятор має обмежений набір цільових комбінацій (ймовірно, один ABI, одне сімейство процесорів, але можливо, як 32-, так і 64-розрядні). Перехресний компілятор зазвичай означає або компілятор з ціллю, відмінною від системи, на якій він працює, або такий, що має декілька цілей, або ABI (див. Також це ).

Чи переносять бінарні файли в різних архітектурах процесора?

Загалом, ні. Двійковий код у звичайних термінах - це власний об'єктний код для певної сім'ї процесора чи процесора. Але є декілька випадків, коли вони можуть бути помірно-надто портативними:

  • одна архітектура є сукупністю іншої (зазвичай бінарні файли x86 націлені на i386 або i686, а не на останній і найбільший x86, наприклад -march=core2)
  • одна архітектура забезпечує вроджену емуляцію чи переклад іншої (можливо, ви чули про Crusoe ) або надає сумісні спільні процесори (наприклад, PS2 )
  • ОС і підтримка часу виконання мультиархів (наприклад, можливість запускати 32-бітні x86 бінарні файли на x86_64), або зробити VM / JIT безпроблемним (Android за допомогою Dalvik або ART )
  • є підтримка "жирних" двійкових файлів, які по суті містять дублікат коду для кожної підтримуваної архітектури

Якщо вам якимось чином вдасться вирішити цю проблему, то інша портативна бінарна проблема з безлічі версій бібліотеки (glibc, на яку я дивлюсь) представить себе. (Більшість вбудованих систем позбавляють вас від конкретної проблеми хоча б.)

Якщо ви ще цього не зробили, зараз прийшов час побігти gcc -dumpspecsі gcc --target-helpподивитися, що ви проти.

Жирні бінарні продукти мають різні недоліки , але все ще мають потенційне використання ( EFI ).

Однак в інших відповідях відсутня ще два міркування: ELF та інтерпретатор ELF, а також підтримка ядра Linux для довільних бінарних форматів . Я не буду вникати в деталі про двійкові файли або байт-код для нереальних процесорів тут, хоча можна трактувати їх як "рідні" та виконувати Java або компільовані бінарні файли байт-коду Python , такі бінарні файли не залежать від апаратної архітектури (але залежать замість цього про відповідну версію VM, яка в кінцевому рахунку працює нативним бінарним файлом).

Будь-яка сучасна система Linux використовує бінарні файли ELF (технічні деталі в цьому PDF ), у випадку динамічних бінарних файлів ELF ядро ​​відповідає за завантаження зображення в пам'ять, але це завдання '' інтерпретатора '', встановленого в ELF заголовки, щоб зробити важкий підйом. Зазвичай це передбачає наявність усіх залежних динамічних бібліотек (за допомогою розділу "Динамічна", в якому перераховані бібліотеки та деякі інші структури, в яких перераховуються необхідні символи), - але це майже загальний рівень опосередкованого шару.

$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses \
shared libs), stripped
$ readelf -p .interp /bin/ls
    String dump of section '.interp':
      [     0]  /lib/ld-linux.so.2

( /lib/ld-linux.so.2це також двійковий код ELF; він не має інтерпретатора і є нативним двійковим кодом.)

Проблема ELF полягає в тому, що заголовок у двійковій ( readelf -h /bin/ls) позначає його для конкретної архітектури, класу (32- або 64-бітового), ендіанства та ABI ("універсальні" бінарні файли Apple використовують альтернативний бінарний формат Mach-O замість того, що вирішує цю проблему, вона виникла на NextSTEP). Це означає, що виконуваний файл ELF повинен відповідати системі, на якій він повинен працювати. Один випускний люк - це інтерпретатор, це може бути будь-який виконуваний файл (включаючи той, який витягує або відображає конкретні підрозділи архітектури спочатку бінарних файлів і викликає їх), але ви все ще обмежені типом (іми) ELF, який ваша система дозволить запускати . (У FreeBSD є цікавий спосіб обробки файлів ELF Linux , він brandelfзмінює поле ELI ABI.)

Існує (використовуючи binfmt_misc) підтримку Mach-O на Linux , там є приклад, який показує вам, як створювати та запускати жировий (32- та 64-бітний) двійковий файл. Форки ресурсів / ADS , як це було зроблено на Mac, може бути вирішенням, але жодна рідна файлова система Linux це не підтримує.

Більш-менш те ж саме стосується модулів ядра, .koфайли також ELF (хоча вони не мають інтерпретатора). У цьому випадку є додатковий шар, який використовує версію ядра ( uname -r) в шляху пошуку, те, що теоретично можна зробити замість цього в ELF з версією, але я певно підозрюю.

Як було зазначено в іншому місці, Linux не підтримує жирові файли, але існує активний жирово -бінарний проект: FatELF . Це вже багато років , воно ніколи не було інтегровано у стандартне ядро, частково через проблеми, пов'язані з патентом. У цей час йому потрібна підтримка ядра та ланцюжка інструментів. Він не використовує binfmt_miscпідхід, цей побічний крок видає заголовок ELF і дозволяє також використовувати модулі жирового ядра.

  1. Якщо у мене складено додаток для запуску на 'x86 target, linux OS xyz', чи можу я просто запустити той самий скомпільований бінарний файл на іншій системі 'ARM target, Linux OS Xyz'?

Не з ELF, це не дозволить вам це зробити.

  1. Якщо вище не відповідає дійсності, єдиний спосіб - отримати вихідний код програми для відновлення / перекомпіляції, використовуючи відповідну ланцюжок інструментів «наприклад, arm-linux-gnueabi»?

Проста відповідь - так. (Складні відповіді включають емуляцію, проміжні подання, перекладачі та JIT; за винятком випадків "пониження" бінарного файлу i686 для використання лише коду i386, вони, мабуть, тут не цікаві, а корекції ABI потенційно такі ж важкі, як і переклад рідного коду. )

  1. Так само, якщо я маю завантажуваний модуль ядра (драйвер пристрою), який працює на 'x86 target, linux OS версії xyz', чи можу я просто завантажувати / використовувати те саме, що складено .ko на іншій системі 'ARM target, linux OS version xyz' ?

Ні, ELF не дозволить вам це зробити.

  1. Якщо вище не відповідає дійсності, єдиний спосіб - отримати вихідний код драйвера для відновлення / перекомпіляції, використовуючи відповідну ланцюжок інструментів «наприклад, arm-linux-gnueabi»?

Проста відповідь - так. Я вважаю, що FatELF дозволяє створити .koбагатопрофільну архітектуру, але в якийсь момент має бути створена бінарна версія для кожної підтримуваної архітектури. Речі, для яких потрібні модулі ядра, часто поставляються з джерелом і будуються за необхідності, наприклад, це робить VirtualBox.

Це вже довга бурхлива відповідь, є лише ще один об’їзд. У ядрі вже вбудована віртуальна машина, хоч і спеціальна: BPM VM, яка використовується для узгодження пакетів. Людський читаний фільтр "хост foo, а не порт 22") компілюється в байт-код, і фільтр пакета ядра виконує його . Новий eBPF призначений не лише для пакетів, але теоретично, що VM-код є портативним у будь-якому сучасному Linux і llvm підтримує його, але з міркувань безпеки він, ймовірно, не підходить ні для чого, крім адміністративних правил.


Тепер, залежно від того, наскільки ви щедрий для визначення бінарного виконуваного файлу, ви можете (ab) використовувати binfmt_miscдля реалізації жирової бінарної підтримки зі скриптом оболонки та ZIP-файлами у форматі контейнера:

#!/bin/bash

name=$1
prog=${1/*\//}      # basename
prog=${prog/.woz/}  # remove extension
root=/mnt/tmpfs
root=$(TMPDIR= mktemp -d -p ${root} woz.XXXXXX)
shift               # drop argv[0], keep other args

arch=$(uname -m)                  # i686
uname_s=$(uname -s)               # Linux
glibc=$(getconf GNU_LIBC_VERSION) # glibc 2.17
glibc=${glibc// /-}               # s/ /-/g

# test that "foo.woz" can unzip, and test "foo" is executable
unzip -tqq "$1" && {
  unzip -q -o -j -d ${root} "$1"  "${arch}/${uname_s}/${glibc}/*" 
  test -x ${root}/$prog && ( 
    export LD_LIBRARY_PATH="${root}:${LD_LIBRARY_PATH}"
    #readlink -f "${root}/${prog}"   # for the curious
    exec -a "${name}" "${root}/${prog}" "$@" 
  )
  rc=$?
  #rm -rf -- "${root}/${prog}"       # for the brave
  exit $rc
}

Назвіть це "wobbin" і налаштуйте його на кшталт:

mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
printf ":%s:%s:%s:%s:%s:%s:%s" \
  "woz" "E" "" "woz" "" "/path/to/wozbin" ""  > /proc/sys/fs/binfmt_misc/register

Це реєструє .wozфайли з ядром, wozbinзамість цього викликається скрипт з його першим аргументом, встановленим на шлях викликаного .wozфайлу.

Щоб отримати портативний (жирний) .woz файл, просто створіть test.wozZIP-файл із ієрархією каталогів так:

i686/ 
    \- Linux/
            \- glibc-2.12/
armv6l/
    \- Linux/
            \- glibc-2.17/

У кожному каталозі arch / OS / libc (довільний вибір) розмістіть специфічні для архітектури testбінарні та компоненти, такі як .soфайли. Коли ви викликаєте його, необхідний підкаталог витягується до файлової системи пам'яті tmpfs ( /mnt/tmpfsтут) і викликається.


0

завантаження Беррі, вирішіть деякі ваші проблеми .. але це не вирішує проблему, як запустити на hf arm, normaall / regullAr linux distro для x86-32 / 64bit.

Я думаю, він повинен бути вбудований в isolinux (linuxloader linux на usb), якийсь живий конвертер, що міг би розпізнати регіональний дистрибутив і в їзді / наживо перетворювати на hf.

Чому? Тому що, якщо кожен Linux може бути перетворений завантаженням Berry на роботу над arm-hf, то він міг би створити механізм bery boot для isolinux, що ми завантажимо, використовуючи для запущеного диска убуту або вбудований в стартовий диск для створення ubuntu.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.