mirror of
https://github.com/TinyCC/tinycc.git
synced 2025-11-16 12:34:45 +00:00
fix: code in non-executable ELF sections
This commit is contained in:
28
tests/exec_section_in_asm.c
Normal file
28
tests/exec_section_in_asm.c
Normal file
@@ -0,0 +1,28 @@
|
||||
/* Previously in TinyCC, ELF sections defined in assembly would always have the
|
||||
execute bit not set, so you would get segmentation faults when code in these
|
||||
sections was exectuted. This file is a minimal example of a file that will put
|
||||
the resulting code in a non-executable section (and invoke it) prior to the fix.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
|
||||
void *memset(void *dst, int c, int len);
|
||||
|
||||
__asm__ (
|
||||
".section .text.nolibc_memset\n"
|
||||
".weak memset\n"
|
||||
"memset:\n"
|
||||
"xchgl %eax, %esi\n\t"
|
||||
"movq %rdx, %rcx\n\t"
|
||||
"pushq %rdi\n\t"
|
||||
"rep stosb\n\t"
|
||||
"popq %rax\n\t"
|
||||
"retq\n"
|
||||
);
|
||||
|
||||
int main () {
|
||||
char buf[10];
|
||||
memset(&buf[0], 'A', 9);
|
||||
buf[9] = 0;
|
||||
puts(buf);
|
||||
return 0;
|
||||
}
|
||||
13
tests/exec_section_in_c.c
Normal file
13
tests/exec_section_in_c.c
Normal file
@@ -0,0 +1,13 @@
|
||||
/* Previously in TinyCC, ELF sections defined in attributes would always have
|
||||
the execute bit not set, so you would get segmentation faults when code in these
|
||||
sections was exectuted. This file is a minimal example of a file that will put
|
||||
the resulting code in a non-executable section (and invoke it) prior to the fix.
|
||||
*/
|
||||
__attribute__((section(".text.wumbo")))
|
||||
int wumbo (int arg) {
|
||||
return arg * 2;
|
||||
}
|
||||
|
||||
int main () {
|
||||
return wumbo(2);
|
||||
}
|
||||
Reference in New Issue
Block a user