diff options
author | Alan Modra <amodra@gmail.com> | 2003-09-23 00:41:14 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2003-09-23 00:41:14 +0000 |
commit | f61e80195b619d438789619b6bd9479a335ce223 (patch) | |
tree | 6b7bb74f7d3a4136a66691ff82c0f1f43aa1c27a /gas | |
parent | 7dcb9820ee9e265f0696fc5aa65e71fde8faed03 (diff) | |
download | fsf-binutils-gdb-f61e80195b619d438789619b6bd9479a335ce223.zip fsf-binutils-gdb-f61e80195b619d438789619b6bd9479a335ce223.tar.gz fsf-binutils-gdb-f61e80195b619d438789619b6bd9479a335ce223.tar.bz2 |
* 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.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/obj-elf.c | 40 |
2 files changed, 31 insertions, 16 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 53942b7..56c6fae 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2003-09-23 Alan Modra <alan@modra.org> + + * 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 <seufer@csv.ica.uni-stuttgart.de> * 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 ec63baa..f0182a2 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) |