bfd/
* elf-bfd.h (_bfd_generic_match_sections_by_type): Don't define. * libbfd-in.h (_bfd_generic_match_sections_by_type): Delete. * libbfd.c (_bfd_generic_match_sections_by_type): Delete. * targets.c (bfd_match_sections_by_type): Don't define. (BFD_JUMP_TABLE_LINK): Remove _bfd_generic_match_sections_by_type. * coff-rs6000.c (rs6000coff_vec, pmac_xcoff_vec): Likewise. * coff64-rs6000.c (rs6000coff64_vec, aix5coff64_vec): Likewise. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate. ld/ * ldlang.c (lang_output_section_find_by_flags): Add match_type param. Run two passes, first using match_type, second without. * ldlang.h (lang_match_sec_type_func): New typedef. (lang_output_section_find_by_flags): Update prototype. bfd_match_sections_by_type and lang_output_section_find_by_flags. * emultempl/pe.em (place_orphan): Likewise.
This commit is contained in:
parent
be5291325d
commit
390fbbf109
14 changed files with 67 additions and 80 deletions
76
ld/ldlang.c
76
ld/ldlang.c
|
@ -1147,7 +1147,8 @@ lang_output_section_statement_lookup (const char *const name)
|
|||
|
||||
lang_output_section_statement_type *
|
||||
lang_output_section_find_by_flags (const asection *sec,
|
||||
lang_output_section_statement_type **exact)
|
||||
lang_output_section_statement_type **exact,
|
||||
lang_match_sec_type_func match_type)
|
||||
{
|
||||
lang_output_section_statement_type *first, *look, *found;
|
||||
flagword flags;
|
||||
|
@ -1165,9 +1166,8 @@ lang_output_section_find_by_flags (const asection *sec,
|
|||
if (look->bfd_section != NULL)
|
||||
{
|
||||
flags = look->bfd_section->flags;
|
||||
if (!bfd_match_sections_by_type (output_bfd,
|
||||
look->bfd_section,
|
||||
sec->owner, sec))
|
||||
if (match_type && !match_type (output_bfd, look->bfd_section,
|
||||
sec->owner, sec))
|
||||
continue;
|
||||
}
|
||||
flags ^= sec->flags;
|
||||
|
@ -1177,7 +1177,8 @@ lang_output_section_find_by_flags (const asection *sec,
|
|||
}
|
||||
if (found != NULL)
|
||||
{
|
||||
*exact = found;
|
||||
if (exact != NULL)
|
||||
*exact = found;
|
||||
return found;
|
||||
}
|
||||
|
||||
|
@ -1190,9 +1191,8 @@ lang_output_section_find_by_flags (const asection *sec,
|
|||
if (look->bfd_section != NULL)
|
||||
{
|
||||
flags = look->bfd_section->flags;
|
||||
if (!bfd_match_sections_by_type (output_bfd,
|
||||
look->bfd_section,
|
||||
sec->owner, sec))
|
||||
if (match_type && !match_type (output_bfd, look->bfd_section,
|
||||
sec->owner, sec))
|
||||
continue;
|
||||
}
|
||||
flags ^= sec->flags;
|
||||
|
@ -1200,10 +1200,8 @@ lang_output_section_find_by_flags (const asection *sec,
|
|||
| SEC_CODE | SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
|
||||
found = look;
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
if (sec->flags & (SEC_READONLY | SEC_THREAD_LOCAL))
|
||||
else if (sec->flags & (SEC_READONLY | SEC_THREAD_LOCAL))
|
||||
{
|
||||
/* .rodata can go after .text, .sdata2 after .rodata. */
|
||||
for (look = first; look; look = look->next)
|
||||
|
@ -1212,9 +1210,8 @@ lang_output_section_find_by_flags (const asection *sec,
|
|||
if (look->bfd_section != NULL)
|
||||
{
|
||||
flags = look->bfd_section->flags;
|
||||
if (!bfd_match_sections_by_type (output_bfd,
|
||||
look->bfd_section,
|
||||
sec->owner, sec))
|
||||
if (match_type && !match_type (output_bfd, look->bfd_section,
|
||||
sec->owner, sec))
|
||||
continue;
|
||||
}
|
||||
flags ^= sec->flags;
|
||||
|
@ -1223,10 +1220,8 @@ lang_output_section_find_by_flags (const asection *sec,
|
|||
&& !(look->flags & (SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
|
||||
found = look;
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
if (sec->flags & SEC_SMALL_DATA)
|
||||
else if (sec->flags & SEC_SMALL_DATA)
|
||||
{
|
||||
/* .sdata goes after .data, .sbss after .sdata. */
|
||||
for (look = first; look; look = look->next)
|
||||
|
@ -1235,9 +1230,8 @@ lang_output_section_find_by_flags (const asection *sec,
|
|||
if (look->bfd_section != NULL)
|
||||
{
|
||||
flags = look->bfd_section->flags;
|
||||
if (!bfd_match_sections_by_type (output_bfd,
|
||||
look->bfd_section,
|
||||
sec->owner, sec))
|
||||
if (match_type && !match_type (output_bfd, look->bfd_section,
|
||||
sec->owner, sec))
|
||||
continue;
|
||||
}
|
||||
flags ^= sec->flags;
|
||||
|
@ -1247,10 +1241,8 @@ lang_output_section_find_by_flags (const asection *sec,
|
|||
&& !(sec->flags & SEC_HAS_CONTENTS)))
|
||||
found = look;
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
if (sec->flags & SEC_HAS_CONTENTS)
|
||||
else if (sec->flags & SEC_HAS_CONTENTS)
|
||||
{
|
||||
/* .data goes after .rodata. */
|
||||
for (look = first; look; look = look->next)
|
||||
|
@ -1259,9 +1251,8 @@ lang_output_section_find_by_flags (const asection *sec,
|
|||
if (look->bfd_section != NULL)
|
||||
{
|
||||
flags = look->bfd_section->flags;
|
||||
if (!bfd_match_sections_by_type (output_bfd,
|
||||
look->bfd_section,
|
||||
sec->owner, sec))
|
||||
if (match_type && !match_type (output_bfd, look->bfd_section,
|
||||
sec->owner, sec))
|
||||
continue;
|
||||
}
|
||||
flags ^= sec->flags;
|
||||
|
@ -1269,27 +1260,30 @@ lang_output_section_find_by_flags (const asection *sec,
|
|||
| SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
|
||||
found = look;
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
/* .bss goes last. */
|
||||
for (look = first; look; look = look->next)
|
||||
else
|
||||
{
|
||||
flags = look->flags;
|
||||
if (look->bfd_section != NULL)
|
||||
/* .bss goes last. */
|
||||
for (look = first; look; look = look->next)
|
||||
{
|
||||
flags = look->bfd_section->flags;
|
||||
if (!bfd_match_sections_by_type (output_bfd,
|
||||
look->bfd_section,
|
||||
sec->owner, sec))
|
||||
continue;
|
||||
flags = look->flags;
|
||||
if (look->bfd_section != NULL)
|
||||
{
|
||||
flags = look->bfd_section->flags;
|
||||
if (match_type && !match_type (output_bfd, look->bfd_section,
|
||||
sec->owner, sec))
|
||||
continue;
|
||||
}
|
||||
flags ^= sec->flags;
|
||||
if (!(flags & SEC_ALLOC))
|
||||
found = look;
|
||||
}
|
||||
flags ^= sec->flags;
|
||||
if (!(flags & SEC_ALLOC))
|
||||
found = look;
|
||||
}
|
||||
|
||||
return found;
|
||||
if (found || !match_type)
|
||||
return found;
|
||||
|
||||
return lang_output_section_find_by_flags (sec, NULL, NULL);
|
||||
}
|
||||
|
||||
/* Find the last output section before given output statement.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue