Почему заголовок программы исполняемый? - PullRequest
6 голосов
/ 31 мая 2011

Я использовал readelf на нескольких двоичных файлах на моем Linux-компьютере и увидел что-то, что удивило меня в заголовках программы.Этот пример взят из утилиты 'ld', но также встречается со всем, что я компилирую с помощью gcc.

PHDR 0x000034 0x08048034 0x08048034 0x00120 0x00120 RE 0x4

Этот сегмент охватывает все заголовки программы,Почему помечен как исполняемый?Он не содержит машинный код.Но также, почему даже это присутствует в заголовках?Я не хочу этого в образе моей программы.

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

PHDR, указывающий на PHDR, сообщает загрузчику, что сами PHDR должны быть сопоставлены с адресным пространством процесса, чтобы сделать их доступными для самой программы.

Это полезно в основном для динамического связывания.

Причина, по которой память помечена как исполняемая, заключается в том, что PHDR имеют размер менее одной страницы и находятся непосредственно рядом с началом исполняемого кода.Если бы разрешения для PHDR отличались от разрешений для текста программы, компоновщик должен был бы вставить отступ между ними.

0 голосов
/ 31 мая 2011

Основные заголовки файлов ELF находятся там, чтобы легко найти смещение в файле, где хранятся другие разделы.Затем каждый подзаголовок описывает данные в своем разделе.

Основной заголовок ELF выглядит следующим образом:

/* ELF File Header */
typedef struct
{
  unsigned char e_ident[EI_NIDENT];     /* Magic number and other info */
  Elf32_Half    e_type;                 /* Object file type */
  Elf32_Half    e_machine;              /* Architecture */
  Elf32_Word    e_version;              /* Object file version */
  Elf32_Addr    e_entry;                /* Entry point virtual address */
  Elf32_Off     e_phoff;                /* Program header table file offset */
  Elf32_Off     e_shoff;                /* Section header table file offset */
  Elf32_Word    e_flags;                /* Processor-specific flags */
  Elf32_Half    e_ehsize;               /* ELF header size in bytes */
  Elf32_Half    e_phentsize;            /* Program header table entry size */
  Elf32_Half    e_phnum;                /* Program header table entry count */
  Elf32_Half    e_shentsize;            /* Section header table entry size */
  Elf32_Half    e_shnum;                /* Section header table entry count */
  Elf32_Half    e_shstrndx;             /* Section header string table index */
} Elf32_Ehdr;

Заголовки программ присутствуют, поскольку они описывают исполняемые части исполняемого файла ELF..

Следующая часть программы - это заголовки программы ELF.Они описывают разделы программы, которые содержат исполняемый программный код для отображения в адресное пространство программы при загрузке.

/* Program segment header.  */

typedef struct
{
  Elf32_Word    p_type;                 /* Segment type */
  Elf32_Off     p_offset;               /* Segment file offset */
  Elf32_Addr    p_vaddr;                /* Segment virtual address */
  Elf32_Addr    p_paddr;                /* Segment physical address */
  Elf32_Word    p_filesz;               /* Segment size in file */
  Elf32_Word    p_memsz;                /* Segment size in memory */
  Elf32_Word    p_flags;                /* Segment flags */
  Elf32_Word    p_align;                /* Segment alignment */
} Elf32_Phdr;

Это взято из здесь

...