Check for changed section attributes.
This commit is contained in:
parent
b209c575e3
commit
742f45cf3a
2 changed files with 60 additions and 37 deletions
|
@ -1,5 +1,8 @@
|
|||
2000-04-19 Alan Modra <alan@linuxcare.com.au>
|
||||
|
||||
* config/obj-elf.c (obj_elf_change_section): Check for changed
|
||||
section attributes.
|
||||
|
||||
* Makefile.am: (CPU_MULTI_VALID): Remove.
|
||||
(MULTI_CPU_TYPES): Define.
|
||||
(MULTI_CPU_OBJ_VALID): Define.
|
||||
|
@ -11,7 +14,7 @@
|
|||
|
||||
2000-04-19 Michael Sokolov <msokolov@ivan.Harhan.ORG>
|
||||
|
||||
* Makefile.am (FLEX, LEX): Get them from configure.
|
||||
* Makefile.am (YACC, LEX): Get them from configure.
|
||||
|
||||
2000-04-18 H.J. Lu (hjl@gnu.org)
|
||||
|
||||
|
|
|
@ -617,8 +617,10 @@ obj_elf_change_section (name, type, attr, push)
|
|||
char *name;
|
||||
int type, attr, push;
|
||||
{
|
||||
int new_sec;
|
||||
asection *old_sec;
|
||||
segT sec;
|
||||
flagword flags;
|
||||
int i;
|
||||
|
||||
#ifdef md_flush_pending_output
|
||||
md_flush_pending_output ();
|
||||
|
@ -639,49 +641,57 @@ obj_elf_change_section (name, type, attr, push)
|
|||
previous_section = now_seg;
|
||||
previous_subsection = now_subseg;
|
||||
|
||||
new_sec = bfd_get_section_by_name (stdoutput, name) == NULL;
|
||||
old_sec = bfd_get_section_by_name (stdoutput, name);
|
||||
sec = subseg_new (name, 0);
|
||||
|
||||
if (new_sec)
|
||||
{
|
||||
flagword flags;
|
||||
symbolS *secsym;
|
||||
int i;
|
||||
|
||||
/* See if this is one of the special sections. */
|
||||
for (i = 0; special_sections[i].name != NULL; i++)
|
||||
if (strcmp (name, special_sections[i].name) == 0)
|
||||
{
|
||||
if (type == SHT_NULL)
|
||||
type = special_sections[i].type;
|
||||
else if (type != special_sections[i].type)
|
||||
as_warn (_("Setting incorrect section type for %s"), name);
|
||||
|
||||
if ((attr &~ special_sections[i].attributes) != 0)
|
||||
/* See if this is one of the special sections. */
|
||||
for (i = 0; special_sections[i].name != NULL; i++)
|
||||
if (strcmp (name, special_sections[i].name) == 0)
|
||||
{
|
||||
if (type == SHT_NULL)
|
||||
type = special_sections[i].type;
|
||||
else if (type != special_sections[i].type)
|
||||
{
|
||||
if (old_sec == NULL)
|
||||
{
|
||||
/* As a GNU extension, we permit a .note section to be
|
||||
allocatable. If the linker sees an allocateable .note
|
||||
section, it will create a PT_NOTE segment in the output
|
||||
file. */
|
||||
if (strcmp (name, ".note") != 0
|
||||
|| attr != SHF_ALLOC)
|
||||
as_warn (_("Setting incorrect section attributes for %s"),
|
||||
name);
|
||||
as_warn (_("Setting incorrect section type for %s"), name);
|
||||
}
|
||||
else
|
||||
{
|
||||
as_warn (_("Ignoring incorrect section type for %s"), name);
|
||||
type = special_sections[i].type;
|
||||
}
|
||||
attr |= special_sections[i].attributes;
|
||||
break;
|
||||
}
|
||||
if ((attr &~ special_sections[i].attributes) != 0
|
||||
&& old_sec == NULL)
|
||||
{
|
||||
/* As a GNU extension, we permit a .note section to be
|
||||
allocatable. If the linker sees an allocateable .note
|
||||
section, it will create a PT_NOTE segment in the output
|
||||
file. */
|
||||
if (strcmp (name, ".note") != 0
|
||||
|| attr != SHF_ALLOC)
|
||||
as_warn (_("Setting incorrect section attributes for %s"),
|
||||
name);
|
||||
}
|
||||
attr |= special_sections[i].attributes;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Convert ELF type and flags to BFD flags. */
|
||||
flags = (SEC_RELOC
|
||||
| ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
|
||||
| ((attr & SHF_ALLOC) ? SEC_ALLOC : 0)
|
||||
| (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0)
|
||||
| ((attr & SHF_EXECINSTR) ? SEC_CODE : 0));
|
||||
/* Convert ELF type and flags to BFD flags. */
|
||||
flags = (SEC_RELOC
|
||||
| ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
|
||||
| ((attr & SHF_ALLOC) ? SEC_ALLOC : 0)
|
||||
| (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0)
|
||||
| ((attr & SHF_EXECINSTR) ? SEC_CODE : 0));
|
||||
#ifdef md_elf_section_flags
|
||||
flags = md_elf_section_flags (flags, attr, type);
|
||||
flags = md_elf_section_flags (flags, attr, type);
|
||||
#endif
|
||||
|
||||
if (old_sec == NULL)
|
||||
{
|
||||
symbolS *secsym;
|
||||
|
||||
/* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
|
||||
if (type == SHT_NOBITS)
|
||||
seg_info (sec)->bss = 1;
|
||||
|
@ -695,9 +705,19 @@ obj_elf_change_section (name, type, attr, push)
|
|||
else
|
||||
symbol_table_insert (section_symbol (sec));
|
||||
}
|
||||
else if (attr != 0)
|
||||
{
|
||||
/* If section attributes are specified the second time we see a
|
||||
particular section, then check that they are the same as we
|
||||
saw the first time. */
|
||||
if ((old_sec->flags ^ flags)
|
||||
& (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
|
||||
| SEC_EXCLUDE | SEC_SORT_ENTRIES))
|
||||
as_warn (_("Ignoring changed section attributes for %s"), name);
|
||||
}
|
||||
|
||||
#ifdef md_elf_section_change_hook
|
||||
md_elf_section_change_hook ();
|
||||
md_elf_section_change_hook ();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue