Вернуться   W&PBBS > Software > Unix/Linux/BSD > BSD
Имя
Пароль
FAQ Пометить все разделы прочитанными



Ответ
Опции темы
Старый 28-01-2007, 15:09 Ссылка на пост    #1
cyberb
Продвинутый серфер
Продвинутый серфер


Сообщений: 2,405
На форуме с: 05.07.05
Провел: 3нед. 1д. 11ч. 52мин.

ABI ин да FreeBSD

На самом деле это кусочек незаконченной статьи на тему ABI. Хотелось рассмотреть тонкое управление Linux приложений(подргузка библиотек и тд - то чего особо не описано). Сделал давно, но потом сменил хард и все как-то похерилось. Но Мастер, отчасти, "вынудил" меня седня отпинать старый hdd и вытащить сертификат на vip1, который, за неимением времени, Мастер все никак мне не восстанавливал . Короче part 1 и надеюсь я не стухну все дописать. Вперед:

Посмотрим на структуру типичного Elf32 файла
Код:
typedef struct {
	unsigned char	e_ident[EI_NIDENT];	/* File identification. */
	Elf32_Half	e_type;		/* File type. */
	Elf32_Half	e_machine;	/* Machine architecture. */
	Elf32_Word	e_version;	/* ELF format version. */
	Elf32_Addr	e_entry;	/* Entry point. */
	Elf32_Off	e_phoff;	/* Program header file offset. */
	Elf32_Off	e_shoff;	/* Section header file offset. */
	Elf32_Word	e_flags;	/* Architecture-specific flags. */
	Elf32_Half	e_ehsize;	/* Size of ELF header in bytes. */
	Elf32_Half	e_phentsize;	/* Size of program header entry. */
	Elf32_Half	e_phnum;	/* Number of program header entries. */
	Elf32_Half	e_shentsize;	/* Size of section header entry. */
	Elf32_Half	e_shnum;	/* Number of section header entries. */
	Elf32_Half	e_shstrndx;	/* Section name strings section. */
} Elf32_Ehdr;

Я вырезал кусочек, так как остальное для рассмотрения не является существенным. В данном контексте нас интересует поле e_ident и может быть еще e_machine. Они указывают нашему ABI на какой платформе и в каком "режиме" будет выполняться данный Elf. Обратившись к следующему куску кода, можно легко понять какие ident бывают
Код:
 * $FreeBSD: src/sys/sys/elf_common.h,v 1.15 2004/05/05 02:38:54 marcel Exp $
......
/* Indexes into the e_ident array.  Keep synced with 
   [url]http://www.sco.com/developer/gabi/ch4.eheader.html[/url] */
   Легко видеть из прошлого куска что ident является массивом, здесь описываются элементы данного массива, а далее возможные значения
#define EI_MAG0		0	/* Magic number, byte 0. */
#define EI_MAG1		1	/* Magic number, byte 1. */
#define EI_MAG2		2	/* Magic number, byte 2. */
#define EI_MAG3		3	/* Magic number, byte 3. */
#define EI_CLASS	4	/* Class of machine. */
#define EI_DATA		5	/* Data format. */
#define EI_VERSION	6	/* ELF format version. */
#define EI_OSABI	7	/* Operating system / ABI identification */
#define EI_ABIVERSION	8	/* ABI version */
#define OLD_EI_BRAND	8	/* Start of architecture identification. */
#define EI_PAD		9	/* Start of padding (per SVR4 ABI). */
#define EI_NIDENT	16	/* Size of e_ident array. */
......
/* Values for e_ident[EI_OSABI]. */
#define ELFOSABI_SYSV		0	/* UNIX System V ABI */
#define ELFOSABI_NONE		ELFOSABI_SYSV	/* symbol used in old spec */
#define ELFOSABI_HPUX		1	/* HP-UX operating system */
#define ELFOSABI_NETBSD		2	/* NetBSD */
#define ELFOSABI_LINUX		3	/* GNU/Linux */
#define ELFOSABI_HURD		4	/* GNU/Hurd */
#define ELFOSABI_86OPEN		5	/* 86Open common IA32 ABI */
#define ELFOSABI_SOLARIS	6	/* Solaris */
#define ELFOSABI_MONTEREY	7	/* Monterey */
#define ELFOSABI_IRIX		8	/* IRIX */
#define ELFOSABI_FREEBSD	9	/* FreeBSD */
#define ELFOSABI_TRU64		10	/* TRU64 UNIX */
#define ELFOSABI_MODESTO	11	/* Novell Modesto */
#define ELFOSABI_OPENBSD	12	/* OpenBSD */
#define ELFOSABI_ARM		97	/* ARM */
#define ELFOSABI_STANDALONE	255	/* Standalone (embedded) application */
......
/* Values for e_machine. */
#define EM_NONE		0	/* Unknown machine. */
#define EM_M32		1	/* AT&T WE32100. */ 
#define EM_SPARC	2	/* Sun SPARC. */
#define EM_386		3	/* Intel i386. */
#define EM_68K		4	/* Motorola 68000. */
#define EM_88K		5	/* Motorola 88000. */
#define EM_486		6	/* Intel i486. */
#define EM_860		7	/* Intel i860. */
#define EM_MIPS		8	/* MIPS R3000 Big-Endian only */
......
Что интересного можно извлечь из этих строк? Описание отдельных полей Elf?... нет это на самом деле список гипотетических OS продукты которых вы можете попробывать запустить под вашей FreeBSD
Поля уже скомпелированных Elf файлов можно смотреть так
Код:
#readelf -h /bin/ls
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 09 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - FreeBSD
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0x80492bc
  Start of program headers:          52 (bytes into file)
  Start of section headers:          22288 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         5
  Size of section headers:           40 (bytes)
  Number of section headers:         22
  Section header string table index: 21
Достаточно просто и весьма информативно рассказывает о бинарнике(на случай если у вас он не запускается из-за нехватки библиотек, можно посмотреть какому ABI он относится и грамотно добавить туда их). По поводу версии ABI, сырец говорит тчо их бывает 2: 0 - ноне, 1 - куррент.

links:
http://www.freebsd.org/doc/ru/books...u-advanced.html
http://www.sco.com/developers/gabi/...h4.eheader.html
http://fxr.watson.org/
cyberb вне форума   Вставить выделенное      Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра Оценка этой теме
Оценка этой теме:

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

vB коды Вкл.
[IMG] код Вкл.
Быстрый переход





Предупреждение: Никакого детского порно в запросах и ссылках.
Любое упоминание детского порно в контексте будет пресекаться.


Часовой пояс GMT +4, серверное время: 13:49.