Мистецтво сучасного комп'ютерного програмування - це поєднання особливої людської індивідуальності з набором спеціальних інструментів, що породжує досить примарний продукт - програмне забезпечення, - який інші люди знаходять корисним. Програмісти - це терплячі люди, яким не лінь розбиратися у всіх заморочках комп'ютерів. Комп'ютери дуже педантичні в своїх потребах і зовсім не терплять відхилень від цих потреб. Який би не був склад вашого характеру, програмувати комп'ютери досить складно, і для спрощення цього завдання було створено безліч інструментів.
В операційних системах UNIX® і Linux® головне - це файли. Можна сказати, що суть програмування в UNIX і Linux - це написання коду, що працює з файлами. В системі існує безліч типів файлів. Об'єктні файли мають особливу конструкцію, що забезпечує їх гнучке багатоцільове використання.
Інструменти ремісника
У світі комп'ютерного програмування використовується безліч форматів об'єктних файлів. У середовищі DOS застосовуються формати COM. OBJ і EXE. В UNIX і Linux використовуються a.out. COFF і ELF. У Microsoft® Windows® використовується формат переноситься виконуваного файлу (portable executable, PE), а в Macintosh - PEF. Mach-O та інші.
Спочатку для кожного типу комп'ютерів існував власний формат об'єктних файлів, однак з приходом UNIX та інших операційних систем, які можуть бути перенесені з однієї апаратної платформи на іншу, виник ряд загальних форматів файлів, які піднялися на рівень загального стандарту. Серед останніх - формати a.out. COFF і ELF.
Щоб зрозуміти пристрій об'єктного файлу, необхідні інструменти, які можуть прочитати різні частини об'єктного файлу і відобразити їх у більш зручному для сприйняття форматі. У цій статті обговорюються деякі найбільш важливі аспекти, що стосуються цих інструментів. Але для початку необхідно створити робоче місце і покласти на нього жертву. немає, пацієнта.
Робоче місце
Запустіть сеанс xterm. Давайте приступимо до вивчення об'єктних файлів зі створення чистого робочого місця Наведені нижче команди дозволять створити зручне місце для роботи з об'єктними файлами:
Лістинг 1. Програма hw.c
Це проста програма "Hello World", яка буде служити пацієнтом при вивченні різних інструментів, наявних в арсеналі UNIX. Замість того щоб використовувати короткі шляхи до створення виконуваного файлу (а таких шляхів існує безліч), ми займемося побудовою і вивченням об'єктного файлу як такого.
формати файлів
Зазвичай результатом роботи компілятора C є асемблерний код для зазначеного вами процесора. Асемблерний код передається в програму асемблера, яка за замовчуванням створює дідуся всіх об'єктних файлів - файл a.out. Сама назва означає Assembler Output (Вихід асемблера). Щоб створити файл a.out, введіть у вікні xterm наступну команду:
Ця команда створила новий файл, hw.s, який містить текст, який потрапляє на вхід асемблера. Зазвичай ви його не бачите, оскільки за замовчуванням компілятор створює файл a.out. Як і очікувалося, програма асемблера UNIX може обробити вхідний файл такого типу і створити файл a.out.
Інструменти UNIX
Припускаючи, що компіляція пройшла вдало і в вашій папці з'явився файл a.out, давайте вивчимо його. Серед інших інструментів, корисних при вивченні об'єктних файлів, є наступні:
- nm: Виводить перелік символів об'єктного файлу.
- objdump: Виводить докладну інформацію, що міститься в об'єктних файлах.
- readelf: Виводить інформацію про об'єктних файлах ELF.
Перший інструмент в списку - це nm, який виводить перелік символів об'єктного файлу. Якщо ви введете команду nm. ви помітите, що за замовчуванням вона шукає файл з назвою a.out Якщо такого файлу немає, утиліта висловить своє невдоволення. Як би там не було, якщо інструмент знаходить файл a.out, створений компілятором, він виводить лістинг, подібний лістингу 2.
Лістинг 2. Висновок команди nm
Розділи, що містять виконуваний код, називаються текстовими розділами або сегментами. Також існують сегменти або розділи даних, які містять не виконує, той інформацію або дані. Ще один тип розділів, що позначається BSS. містить блоки, які починаються з символьних даних.
Перед кожним символом, виведеним командою nm. вказується відповідне йому значення в шістнадцятковому (за замовчуванням) форматі, а також символьний код, відповідний типу символу. Деякі найбільш поширені коди: A (абсолютне значення) - значення, які не будуть змінюватися при подальшому Лінкування; B - символи з розділу BSS; C - загальні символи, що вказують на неініціалізовані дані.
Об'єктні файли містять безліч різних частин, розділених на розділи. Розділи можуть містити виконуваний код, символьні імена, значення ініціалізованих даних, а також безліч інших типів даних. Детальну інформацію про ці типах даних можна знайти на сторінках довідника man UNIX по темі nm. де кожен тип описаний під символьними значеннями, які виводяться на виході команди.
Подробиці, подробиці.
Навіть проста програма "Hello World", доходячи до стану об'єктного файлу, містить величезний масив подробиць. Програма nm хороша для виведення списку символів, а також їх типів і значень, проте для більш докладного вивчення вмісту згаданих вище розділів необхідні більш потужні інструменти.
Два з таких інструментів - це програми objdump і readelf. Ввівши наступну команду, ви побачите асемблерний лістинг кожного з розділів об'єктного файлу, що містить виконуваний код. Дивно, чи не так, як багато коду фактично генерує компілятор для такої маленької програмки?
Для програміста, зачарованого низькорівневими подробицями програмування, це чудовий інструмент для вивчення вихідної інформації компіляторів і ассемблеров. Детальна інформація на кшталт тієї, що представлена в цьому коді, дуже багато говорить про природу процесора, на якому працює система. Вивчаючи цю інформацію разом з технологічною документацією, наданою виробником процесора, ви можете отримати дуже цінні знання про те, як все працює, завдяки розумінню вихідної інформації працюючих програм.
Програма readelf також може вивести вміст об'єктного файлу з такою самою прозорістю. Ви можете переконатися в цьому, ввівши таку команду:
Ця команда формує дані, показані в лістингу 4. У заголовку ELF представлена коротка інформація про всі розділи файлу. Перш ніж перераховувати вміст цих заголовків, зверніть увагу, скільки їх. Ця інформація може бути корисна при вивченні великих об'єктних файлів.
Як можна бачити з цього лістингу, в простому файлі a.out програми "Hello World" міститься величезний обсяг корисних подробиць - інформація про версії, гістограми, кілька таблиць різних типів символів і т.п. Уже декількох представлених тут інструментів досить, щоб провести масу часу, дізнаючись нову інформацію про виконуваних файлах шляхом вивчення об'єктних файлів.
На додаток до всіх цих розділах компілятор може помістити в об'єктний файл зневадження, і вона також буде відображена тут. Введіть наступну команду і приділіть трохи часу вивченню того, що скаже вам ваш компілятор (як ніби ви виконуєте налагодження):
Виконувані файли - це теж об'єктні файли
У світі UNIX виконувані файли є об'єктними файлами, і ви можете вивчити їх так само, як тільки що зробили з файлом a.out. Дуже корисна вправа - перейти в каталог / bin або / local / bin і застосувати nm. objdump і readelf до будь-яких командам, які ви використовуєте найчастіше, наприклад, pwd. ps. cat або rm. Часто при написанні програм, в яких потрібні функції, які вже реалізовані в одному із стандартних інструментів, корисно подивитися, як насправді працює цей інструмент, застосувавши до нього команду objdump -d
Якщо ви збираєтеся працювати з компіляторами і іншими мовними інструментами, ви зрозумієте, що час, витрачений на вивчення різних об'єктних файлів, що складають систему вашого комп'ютера, витрачено не дарма. В операційній системі UNIX є безліч рівнів, і рівні, які відкривають інструменти, які вивчають об'єктні файли, розташовуються близько до апаратного забезпечення. Це дозволяє вам по-справжньому відчути систему.
висновок
Вивчення об'єктних файлів може значно поглибити ваші знання про операційну систему UNIX і дозволяє краще зрозуміти, як насправді формується програмне забезпечення з вихідного коду. Я пропоную вам вивчити висновок інструментів, описаних в цій статті, для об'єктних файлів програм, розташованих в каталогах / bin або / local / bin вашої системи, і ознайомитися з документацією по системі Вашого постачальника обладнання.
Ресурси для скачування
Схожі теми
- Оригінал статті: UNIX tools for exploring object files
- Формати файлів, що виконуються. Більш детальну інформацію про форматах виконуваних файлів можна знайти у Вікіпедії.
- Формат виконуваного і компонований модуля (Executable and Linking Format, ELF). Додаткову інформацію можна знайти на сайті університету Каліфорнія-Девіс.
- Статті по AIX і UNIX. Знайти інші статті Вільяма Ціммерлі. (EN)
- Ознайомчі версії програмного забезпечення IBM. Використовуйте у вашому наступному проекті по розробці програми, які можна завантажити безпосередньо з developerWorks.
- Wiki по AIX 5L. Середовище для підтримки колективної роботи, яка містить технічну інформацію, що відноситься до AIX.