Встраивание двоичного файла в elf с помощью objcopy может вызвать проблемы с выравниванием? - PullRequest
4 голосов
/ 11 января 2012

В стеке и в других местах было несколько публикаций, описывающих, как встраивать двоичные двоичные объекты в двоичные файлы эльфов.

Встраивание двоичных двоичных объектов с использованием gcc mingw

и

C / C ++ с GCC: Статически добавлять файлы ресурсов в исполняемый файл / библиотеку

является наиболее полным ответом.

Но есть возможная проблема, о которой никто не упоминает. Вот быстрый foo.txt, прикрытый к foo.o:

$ objdump -x foo.o 
foo.o:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .data         0000000d  00000000  00000000  00000034  2**0
                  CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
00000000 l    d  .data  00000000 .data
0000000d g       .data  00000000 _binary_foo_txt_end
0000000d g       *ABS*  00000000 _binary_foo_txt_size
00000000 g       .data  00000000 _binary_foo_txt_start

Так вот, я на самом деле не хожу на все эти выводы - есть ли документация для этого материала ??? Я думаю, что большинство из них достаточно очевидно, «g» является глобальным, а «l» локальным и т. Д.

Что выделяет выравнивание для сегмента .data, установленного на 0. Означает ли это, что я думаю, что это значит? То есть: когда дело доходит до линковки, компоновщик будет идти "ах да, где угодно ..."

Если вы встраиваете данные char или работаете на x86, вы никогда этого не заметите. Но если вы встраиваете int-данные или, как я делаю, 16- и 32-битные данные в ARM, вы можете получить ловушку выравнивания в любой точке.

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

Ответы [ 2 ]

4 голосов
/ 10 февраля 2015

Создайте сценарий компоновщика "lscript.ld"

MEMORY
{
   memory : ORIGIN = 0x00000000, LENGTH = 0x80000000
}

SECTIONS
{
.data (ALIGN(4)) : {
   *(.data)
   *(.data.*)
   __data_end = .;
} > memory

.text (ALIGN(4)) : {
   *(.text)
   *(.text.*)
   __text_end = .;
} > memory

_end = .;
}

Свяжите свой файл:

gcc  -Wl,-T -Wl,lscript.ld -o linked_foo.elf foo.o

Найдите все посторонние материалы, добавленные в ссылки:

objdump -x linked_foo.elf

Objcopy еще раз, чтобы удалить лишние вещи:

objcopy --remove-section ".init_array" (repeat as necessary) --strip-all --keep-symbol "_binary_foo_txt_start" --keep-symbol "_binary_foo_txt_end" --keep-symbol "_binary_foo_txt_size" linked_foo.elf final_foo.elf

Это дает вам файл эльфа с выравниванием 2 ** 2.

4 голосов
/ 14 января 2012

Чтобы ответить на мой собственный вопрос, я бы сказал, что в этом случае objcopy не работает.Я считаю, что использование ассемблера, вероятно, лучший способ использовать Gnu as.К сожалению, теперь я без машин Linux, поэтому не могу проверить это должным образом, но я поставлю этот ответ здесь, если кто-то найдет его или захочет проверить:

.section ".rodata"
.align 4 # which either means 4 or 2**4 depending on arch!

.global _binary_file_bin_start
.type _binary_file_bin_start, @object
_binary_file_bin_start:
.incbin file.bin

.align 4
.global _binary_file_bin_end
_binary_file_bin_end:

Подчеркивание - традиционный способраздражать себя совместимостью C / asm.Другими словами, они исчезают с компиляторами MS / Borland под Windows.

...