aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1998-07-03 21:52:43 +0000
committerIan Lance Taylor <ian@airs.com>1998-07-03 21:52:43 +0000
commit6ccce8e82b4b18e5008f94808ddaf554bdd6c040 (patch)
tree9be4e4b344b9f8f18e2b24ed1b39dad8d73fac10
parent4d315b86605a2b13ecf4dbd6287406bde3deb3b0 (diff)
downloadgdb-6ccce8e82b4b18e5008f94808ddaf554bdd6c040.zip
gdb-6ccce8e82b4b18e5008f94808ddaf554bdd6c040.tar.gz
gdb-6ccce8e82b4b18e5008f94808ddaf554bdd6c040.tar.bz2
* ldlang.c (wild_sort): When sorting by file name, sort by archive
name first.
-rw-r--r--ld/ChangeLog16
-rw-r--r--ld/ldlang.c47
2 files changed, 62 insertions, 1 deletions
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 <ian@cygnus.com>
+ * 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