* 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.
This commit is contained in:
Alan Modra 2003-09-23 00:41:14 +00:00
parent 7dcb9820ee
commit f61e80195b
2 changed files with 31 additions and 16 deletions

View File

@ -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

View File

@ -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)