다시 빌드하지 않고 vmlinux.bin(내장 initramfs)에서 파일 시스템 이미지를 다시 패키지하시겠습니까?

다시 빌드하지 않고 vmlinux.bin(내장 initramfs)에서 파일 시스템 이미지를 다시 패키지하시겠습니까?

존재하다vmlinux.bin에서 파일 시스템 이미지를 추출하는 방법은 무엇입니까?그리고https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging커널 이미지에 포함된 내장 initramfs/initrd를 얻고 압축을 푸는 방법을 제공합니다.

cpio이제 수정된 파일 시스템( +예: 패키징 사용 가능 lzma)을 다시 컴파일하지 않고 커널 실행 파일에 삽입하고 싶습니다 . 이런 방식으로 커널의 ELF 이미지를 수정할 수 있습니까? 그렇다면 어떨까요? 단순히 바이트를 바꾸는 경우(어쩌면 해싱으로?) 뭔가를 보존해야 합니까?


objdump-h산출:
vmlinux.64.orig:     file format elf64-big

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         004162b8  ffffffff80100000  ffffffff80100000  00010000  2**7
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 __ex_table    000063a0  ffffffff805162c0  ffffffff805162c0  004262c0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .notes        00000024  ffffffff8051c660  ffffffff8051c660  0042c660  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .rodata       0041f700  ffffffff8051d000  ffffffff8051d000  0042d000  2**8
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .pci_fixup    00000d40  ffffffff8093c700  ffffffff8093c700  0084c700  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 __ksymtab     0000a430  ffffffff8093d440  ffffffff8093d440  0084d440  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 __ksymtab_gpl 00004ff0  ffffffff80947870  ffffffff80947870  00857870  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 __ksymtab_strings 00010f14  ffffffff8094c860  ffffffff8094c860  0085c860  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 __init_rodata 00000500  ffffffff8095d778  ffffffff8095d778  0086d778  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 __param       00001388  ffffffff8095dc78  ffffffff8095dc78  0086dc78  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 10 .data         000508c0  ffffffff80960000  ffffffff80960000  00870000  2**14
                  CONTENTS, ALLOC, LOAD, DATA
 11 .init.text    0002b084  ffffffff809b1000  ffffffff809b1000  008c1000  2**5
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 12 .init.data    00bc6d78  ffffffff809dc088  ffffffff809dc088  008ec088  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 13 .exit.text    000019e0  ffffffff815a2e00  ffffffff815a2e00  014b2e00  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 14 .data.percpu  00003680  ffffffff815a5000  ffffffff815a5000  014b5000  2**7
                  CONTENTS, ALLOC, LOAD, DATA
 15 .bss          00068fb0  ffffffff815b0000  ffffffff815b0000  014b8680  2**16
                  ALLOC
 16 .mdebug.abi64 00000000  ffffffff81618fb0  ffffffff81618fb0  014b8680  2**0
                  CONTENTS, READONLY
 17 .comment      0000cd74  0000000000000000  0000000000000000  014b8680  2**0
                  CONTENTS, READONLY
 18 .gnu.attributes 00000010  0000000000000000  0000000000000000  014c53f4  2**0

답변1

예, 가능합니다. 하지만 커널의 ELF 실행 파일이 가상 주소와 정적으로 연결되어 있으므로 .init.ramfs 섹션 크기와 주소를 변경하는 것만으로는 충분하지 않습니다.시작과 끝initramfs 섹션.

Linux 소스 코드에서 관련 코드는 iniramfs.c 소스 파일에 있습니다.

void __init populate_rootfs(void)
{
  char *err = unpack_to_rootfs(__initramfs_start, __initramfs_end - __initramfs_start, 0); 
...
}

따라서 .init.text 섹션에 있는 unpack_to_rootfs() 함수를 호출하는 기계어 코드에서도 이 두 오프셋을 변경해야 합니다. (재배치 테이블에 관련 항목이 있는지 확인하세요! ...있는 경우)

또한 Icarus의 답변을 참조하면 initramfs 섹션 크기, 파일 오프셋 및 시작 가상 주소에 대한 작업과 위의 두 오프셋(unpack_to_rootfs() 함수의 매개변수)을 통해 사용자 정의를 직접 추가할 수 있습니다.더 큰initramfs 섹션은 ELF 파일의 최대 가상 주소 위에 로드됩니다. 프로그램 헤더(PHeader)의 "메모리 크기" 필드도 이전 가상 주소 공간 끝에 추가된 더 큰 initramfs 섹션을 반영하도록 수정되어야 합니다.

폴리스티렌 원래 init.ramfs 섹션을 새로운 높은 시작 가상 주소로 이동한 후 커널 가상 주소 공간에 남아 있는 "구멍"은 아무런 해를 끼치지 않습니다. 연결된 메모리는 나중에 init에 정의된 free_initmem(void) 함수에 의해 해제되기 때문입니다. .c 소스 파일.

답변2

답변에서 언급했듯이reverseengineering.se에서 논의된 ELF 부품 교체에 대한 비슷한 질문dd어떤 경우에는 단순히

관련 정보