LINUX.ORG.RU

Загрузка исполняемого кода, статически слинкованного с glibc в mmap-нутую rwx память

 , , , ,


2

3

Допустим, есть программа, который полностью загружает файл в rwx область и запускает его на выполнение, например таким образом

int main(void)
{
  struct stat st;
  stat("somefile.bin", &st);
  void* ptr = mmap(0, st.st_size,
                   PROT_READ | PROT_WRITE | PROT_EXEC,
                   MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
  int fd = open("somefile.bin", O_RDONLY);
  read(fd, ptr, st.st_size);
  void (*foo)(void) = ptr;
  foo();
}
Какой надо составить скрипт для линкера, чтобы можно было статически скомпилировать обычный C код с необходимыми мне библиотеками в этот somefile.bin? Очевидно что надо все секции собрать в одну и чтобы это было все базонезависимо.

Я натыкаюсь на какие-то дурацкие ошибки линкера, вот например если пытаюсь с таким ld-скриптом сделать:

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)


SECTIONS
{
  .text 0x0 : AT ( 0 ) {
    *(.text)
    *(.text*)
    *(.init)
    *(.fini)
    *(.rodata)
    *(.data)
    *(.bss)
    *(.ARM.exidx*)
    *(.gnu.linkonce.armexidx.*)
    *(COMMON)
  }
}
Получаю выхлоп:
$ arm-linux-gnueabihf-gcc-4.8 -static -nostartfiles -Wl,--strip-all,-T ldscript main.c  -O3 -fPIC -o main
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/ld: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf.c:4214
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/ld: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf.c:4214
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/ld: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf.c:4214
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/ld: section .note.gnu.build-id loaded at [0000000000000000,0000000000000023] overlaps section .text loaded at [0000000000000000,00000000000559f7]
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/ld: main: section __libc_freeres_ptrs lma 0x5639c adjusted to 0x563b4
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/ld: .text has both ordered [`.ARM.exidx' in /usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib/libc.a(mmap.o)] and unordered [`.bss' in /usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/libgcc_eh.a(unwind-c.o)] sections
/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
Зачем мне вообще этот .note.gnu.build-id и как его вырубить нафиг? Что значит has both ordered ... and unordered ... ? Какой тут нужен ld-скрипт? Как заставить это работать?

★★★★★

Последнее исправление: SZT (всего исправлений: 1)

Ответ на: комментарий от exception13

Не, хочу шеллкод таким образом сделать

SZT ★★★★★
() автор топика
Ответ на: комментарий от exception13

Мне не .so-шка нужна, а просто кусок опкодов с данными, и чтобы точка входа была в самом начале файла, а данные где-нибудь сзади плелись, например

SZT ★★★★★
() автор топика
Ответ на: комментарий от exception13

Только вот мне эльф файл нафиг не нужен. Так что я просто воспользуюсь objcopy и выдерну им эту единственную секцию. Где обычно хранятся ld-скрипты для линковки .so файла?

SZT ★★★★★
() автор топика

Я в кросскомпиляции и скриптах линкера никогда не копался, но ты, кажется, хочешь скомпилировать твой код в формат flat binary (делал такое nasm-ом), и тут что-то похожее есть: http://wiki.osdev.org/Linker_Scripts#OUTPUT_FORMAT

devsdc ★★
()

Директорию ldscripts я нашел, осталось только видоизменить ldscript для .so нужным мне образом

SZT ★★★★★
() автор топика

библиотека glibc статически линковаться в .so не хочет

SZT ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.