LINUX.ORG.RU

Вот пример патча для древних телефонов Siemens с использованием GCC и секций кода в ELF и превращения их в ELF => BIN после. Вычлени нужное.

patch.c:

#define func1 ((int (*)(void)) (0xA096FE9F))
#define func2 ((void (*)(int)) (0xA0092A94))

const unsigned char arr[] = {
	0xDE, 0xAD, 0x92, 0x6E
};

__attribute__((target("thumb")))
__attribute__((section(".text.entry1")))
int _entry1(void *csm, void *p1, int p2) {
	func1();
	func2(0);
	return arr[0];
}

__attribute__((target("thumb")))
__attribute__((section(".text.entry2")))
int _entry2(void *csm, void *p1, int p2) {
	func1();
	func2(0);
	return arr[0];
}

patch.ld:

SECTIONS {
	.patch1 0xA1000000 : {
		KEEP(*(.text.entry1*))
		KEEP(*(.rodata*))
	}

	.patch2 0xA2000000 : {
		KEEP(*(.text.entry2*))
	}
}

Makefile:

all:
	arm-none-eabi-gcc -mcpu=arm926ej-s -std=c11 -Os -mthumb-interwork -msoft-float -mlittle-endian -c patch.c -o patch.o
	arm-none-eabi-ld -zmax-page-size=1 patch.o -o patch.elf -T patch.ld
	arm-none-eabi-objcopy -O binary -j .patch1 patch.elf patch1.bin
	arm-none-eabi-objcopy -O binary -j .patch2 patch.elf patch2.bin
	arm-none-eabi-objdump -D patch.elf
	cat patch1.bin | xxd -ps -c 200
	cat patch2.bin | xxd -ps -c 200
clean:
	rm -f patch.o patch.elf patch*.bin
EXL ★★★★★
()

-ffunction-sections сделает каждую функцию в отдельной секции. Про атрибут __attribute__((section(".text.my_section"))) уже сказали. А, вот ещё способ:

void text_function1() { asm("nop\n"); }

asm(".pushsection .code1, \"ax\"\n");
void code1_function() { asm("nop\n"); }
asm(".popsection\n");

void text_function2() { asm("nop\n"); }

Так можно сделать даже чтобы секция была writable) https://sourceware.org/binutils/docs/as/Section.html

anonymous
()