From 6ccce8e82b4b18e5008f94808ddaf554bdd6c040 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 3 Jul 1998 21:52:43 +0000 Subject: * ldlang.c (wild_sort): When sorting by file name, sort by archive name first. --- ld/ChangeLog | 16 ++++++++++++++++ ld/ldlang.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 7d85d50..66eaa2f 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,21 @@ Fri Jul 3 14:19:06 1998 Ian Lance Taylor + * scripttempl/pe.sc: Use SORT to sort sections appropriately. + * emultempl/pe.em (sort_by_file_name): Remove. + (sort_by_section_name): Remove. + (sort_sections_1, sort_sections): Remove. + (gld_${EMULATION_NAME}_before_allocation): Don't call + sort_sections. + (hold_section, hold_section_name): New static variables. + (hold_use, hold_text, hold_rdata, hold_data, hold_bss): Likewise. + (gld_${EMULATION_NAME}_place_orphan): Rewrite. Look for a good + place to put the section. Align the section. Sort the input + sections by name. + (gld_${EMULATION_NAME}_place_section): New static function. + + * ldlang.c (wild_sort): When sorting by file name, sort by archive + name first. + * emultempl/pe.em (set_pe_subsystem): Don't call ldlang_add_undef. (gld_${EMULATION_NAME}_after_parse): New static function. diff --git a/ld/ldlang.c b/ld/ldlang.c index 56b4294..4194614 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -993,13 +993,58 @@ wild_sort (wild, file, section) if (wild->filenames_sorted) { + const char *fn, *ln; + boolean fa, la; int i; - i = strcmp (file->filename, ls->ifile->filename); + /* The PE support for the .idata section as generated by + dlltool assumes that files will be sorted by the name of + the archive and then the name of the file within the + archive. */ + + if (file->the_bfd != NULL + && bfd_my_archive (file->the_bfd) != NULL) + { + fn = bfd_get_filename (bfd_my_archive (file->the_bfd)); + fa = true; + } + else + { + fn = file->filename; + fa = false; + } + + if (ls->ifile->the_bfd != NULL + && bfd_my_archive (ls->ifile->the_bfd) != NULL) + { + ln = bfd_get_filename (bfd_my_archive (ls->ifile->the_bfd)); + la = true; + } + else + { + ln = ls->ifile->filename; + la = false; + } + + i = strcmp (fn, ln); if (i > 0) continue; else if (i < 0) break; + + if (fa || la) + { + if (fa) + fn = file->filename; + if (la) + ln = ls->ifile->filename; + + i = strcmp (fn, ln); + if (i > 0) + continue; + else if (i < 0) + break; + } } /* Here either the files are not sorted by name, or we are -- cgit v1.1