From f61e80195b619d438789619b6bd9479a335ce223 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 23 Sep 2003 00:41:14 +0000 Subject: [PATCH] * config/obj-elf.c (obj_elf_change_section): Adjust for _bfd_elf_get_sec_type_attr changes. Allow SHF_MERGE and SHF_STRINGS to be set when defaults are not. Don't set attr from defaults if old_sec. --- gas/ChangeLog | 7 +++++++ gas/config/obj-elf.c | 40 ++++++++++++++++++++++++---------------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 53942b7c3f6..56c6faec907 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2003-09-23 Alan Modra + + * config/obj-elf.c (obj_elf_change_section): Adjust for + _bfd_elf_get_sec_type_attr changes. Allow SHF_MERGE and SHF_STRINGS + to be set when defaults are not. Don't set attr from defaults if + old_sec. + 2003-09-18 Thiemo Seufer * config/tc-mips.c (macro_build_ldst_constoffset): Don't silently diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index ec63baa0823..f0182a2cdf4 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -614,8 +614,7 @@ obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push) asection *old_sec; segT sec; flagword flags; - int def_type; - int def_attr; + const struct bfd_elf_special_section *ssect; #ifdef md_flush_pending_output md_flush_pending_output (); @@ -638,13 +637,13 @@ obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push) old_sec = bfd_get_section_by_name (stdoutput, name); sec = subseg_new (name, 0); + ssect = _bfd_elf_get_sec_type_attr (stdoutput, name); - if (_bfd_elf_get_sec_type_attr (stdoutput, name, &def_type, - &def_attr)) + if (ssect != NULL) { if (type == SHT_NULL) - type = def_type; - else if (type != def_type) + type = ssect->type; + else if (type != ssect->type) { if (old_sec == NULL /* FIXME: gcc, as of 2002-10-22, will emit @@ -653,12 +652,12 @@ obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push) for __attribute__ ((section (".init_array"))). "@progbits" is incorrect. */ - && def_type != SHT_INIT_ARRAY - && def_type != SHT_FINI_ARRAY - && def_type != SHT_PREINIT_ARRAY) + && ssect->type != SHT_INIT_ARRAY + && ssect->type != SHT_FINI_ARRAY + && ssect->type != SHT_PREINIT_ARRAY) { /* We allow to specify any type for a .note section. */ - if (def_type != SHT_NOTE) + if (ssect->type != SHT_NOTE) as_warn (_("setting incorrect section type for %s"), name); } @@ -666,22 +665,31 @@ obj_elf_change_section (name, type, attr, entsize, group_name, linkonce, push) { as_warn (_("ignoring incorrect section type for %s"), name); - type = def_type; + type = ssect->type; } } - if (old_sec == NULL && (attr &~ def_attr) != 0) + if (old_sec == NULL && (attr &~ ssect->attr) != 0) { /* As a GNU extension, we permit a .note section to be - allocatable. If the linker sees an allocateable .note + allocatable. If the linker sees an allocatable .note section, it will create a PT_NOTE segment in the output file. We also allow "x" for .note.GNU-stack. */ - if (!(def_type == SHT_NOTE - && (attr == SHF_ALLOC || attr == SHF_EXECINSTR))) + if (ssect->type == SHT_NOTE + && (attr == SHF_ALLOC || attr == SHF_EXECINSTR)) + ; + /* Allow different SHF_MERGE and SHF_STRINGS if we have + something like .rodata.str. */ + else if (ssect->suffix_length == -2 + && name[ssect->prefix_length] == '.' + && (attr &~ ssect->attr &~ SHF_MERGE &~ SHF_STRINGS) == 0) + ; + else as_warn (_("setting incorrect section attributes for %s"), name); } - attr |= def_attr; + if (old_sec == NULL) + attr |= ssect->attr; } if (type != SHT_NULL) -- 2.30.2