diff --git a/bfd/elf.c b/bfd/elf.c index 74236a658fd..1414c973532 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -5443,6 +5443,14 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, } else if (info != NULL && info->separate_code + && info->rodata_in_code + && executable != ((hdr->flags & (SEC_CODE | SEC_READONLY)) != 0)) + { + new_segment = true; + } + else if (info != NULL + && info->separate_code + && ! info->rodata_in_code && executable != ((hdr->flags & SEC_CODE) != 0)) { new_segment = true; diff --git a/include/bfdlink.h b/include/bfdlink.h index eac07d78364..2411b53485f 100644 --- a/include/bfdlink.h +++ b/include/bfdlink.h @@ -420,9 +420,12 @@ struct bfd_link_info relocations. */ unsigned int enable_dt_relr: 1; - /* TRUE if separate code segment should be created. */ + /* TRUE if a separate code segment should be created. */ unsigned int separate_code: 1; + /* TRUE if a read-only data is allowed in the code segment. */ + unsigned int rodata_in_code: 1; + /* Nonzero if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment should be created. 1 for DWARF2 tables, 2 for compact tables. */ unsigned int eh_frame_hdr_type: 2; diff --git a/ld/emultempl/elf.em b/ld/emultempl/elf.em index 55a870f7d2d..617581308ad 100644 --- a/ld/emultempl/elf.em +++ b/ld/emultempl/elf.em @@ -852,6 +852,10 @@ fragment <