| #include <stdint.h> | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include <sys/mman.h> | |
| #include <unistd.h> | |
| extern uint8_t __start_target_section[]; | |
| extern uint8_t __stop_target_section[]; | |
| __attribute__((used, section("target_section"))) int target_function(void) { | |
| return 42; | |
| } | |
| typedef int (*target_function_t)(void); | |
| int main(void) { | |
| size_t target_function_size = __stop_target_section - __start_target_section; | |
| size_t page_size = sysconf(_SC_PAGESIZE); | |
| size_t page_aligned_size = | |
| (target_function_size + page_size - 1) & ~(page_size - 1); | |
| void *executable_memory = | |
| mmap(NULL, page_aligned_size, PROT_READ | PROT_WRITE | PROT_EXEC, | |
| MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); | |
| if (executable_memory == MAP_FAILED) { | |
| perror("mmap"); | |
| return 1; | |
| } | |
| memcpy(executable_memory, __start_target_section, target_function_size); | |
| target_function_t func = (target_function_t)executable_memory; | |
| int result = func(); // Break here | |
| printf("Result from target function: %d\n", result); | |
| return 0; | |
| } |