tccasm.c: Make .init and .fini sections executable

GAS selects default attributes for a section based on its name and makes
the sections .text, .init, .fini executable. The crti.s and crtn.s files
of musl rely on these defaults and don't set the "x" flag for the .init
and .fini sections. Unfortunately TCC does not care for .init and .fini
section defaults in assembler or C code. Fix this for assembler code.
This commit is contained in:
Stefan
2025-09-21 14:06:59 +02:00
parent 2f88764100
commit ba0899d909

View File

@@ -907,6 +907,10 @@ static void asm_parse_directive(TCCState *s1, int global)
sets alignment to PTR_SIZE. The assembler behaves different. */ sets alignment to PTR_SIZE. The assembler behaves different. */
if (old_nb_section != s1->nb_sections) { if (old_nb_section != s1->nb_sections) {
cur_text_section->sh_addralign = 1; cur_text_section->sh_addralign = 1;
/* Make .init and .fini sections executable by default.
GAS does so, too, and musl relies on it. */
if (!strcmp(sname, ".init") || !strcmp(sname, ".fini"))
flags |= SHF_EXECINSTR;
cur_text_section->sh_flags = flags; cur_text_section->sh_flags = flags;
} }
} }