aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ld/ChangeLog11
-rw-r--r--ld/NEWS4
-rw-r--r--ld/emultempl/pe.em30
-rw-r--r--ld/emultempl/pep.em30
-rw-r--r--ld/ld.texinfo8
5 files changed, 81 insertions, 2 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 1d0fea9..ba87342 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,14 @@
+2009-03-03 Dave Korn <dave.korn.cygwin@gmail.com>
+
+ * emultempl/pe.em (debug_section_p): New bfd_map_over_sections hook.
+ (gld_${EMULATION_NAME}_after_open): Use it to iterate all sections
+ of all input BFDs, looking for debug info. Enable long section names
+ if any found.
+ * emultempl/pe.em (debug_section_p): Likewise.
+ (gld_${EMULATION_NAME}_after_open): Likewise.
+ * NEWS: Retrospectively adjust news announcement.
+ * ld.texinfo: Update documentation to mention new behaviour.
+
2009-03-02 Sebastian Huber <sebastian.huber@embedded-brains.de>
* ldgram.y: Add support for REGION_ALIAS operator.
diff --git a/ld/NEWS b/ld/NEWS
index e495157..440534a 100644
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -5,7 +5,9 @@
* PE targets no longer make use of the long section names PE extension to
the COFF format when generating executable images, by default. The old
(slightly non-conformant) behaviour can still be invoked by using the
- new '--enable-long-section-names' command-line option.
+ new '--enable-long-section-names' command-line option. It is also enabled
+ automatically in the presence of un-stripped debug information, as GDB
+ needs to be able to find the debug info sections by their full names.
* --as-needed now links in a dynamic library if it satisfies undefined
symbols in regular objects, or in other dynamic libraries. In the
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index 46c4057..58ec809 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -1043,6 +1043,13 @@ pr_sym (struct bfd_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
}
#endif /* DLL_SUPPORT */
+static void
+debug_section_p (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj)
+{
+ int *found = (int *) obj;
+ if (strncmp (".debug_", sect->name, sizeof (".debug_") - 1) == 0)
+ *found = 1;
+}
static void
gld_${EMULATION_NAME}_after_open (void)
@@ -1076,6 +1083,29 @@ gld_${EMULATION_NAME}_after_open (void)
pe_data (link_info.output_bfd)->pe_opthdr = pe;
pe_data (link_info.output_bfd)->dll = init[DLLOFF].value;
pe_data (link_info.output_bfd)->real_flags |= real_flags;
+
+ /* At this point we must decide whether to use long section names
+ in the output or not. If the user hasn't explicitly specified
+ on the command line, we leave it to the default for the format
+ (object files yes, image files no), except if there is debug
+ information present; GDB relies on the long section names to
+ find it, so enable it in that case. */
+ if (pe_use_coff_long_section_names < 0 && link_info.strip == strip_none)
+ {
+ /* Iterate over all sections of all input BFDs, checking
+ for any that begin 'debug_' and are long names. */
+ LANG_FOR_EACH_INPUT_STATEMENT (is)
+ {
+ int found_debug = 0;
+ bfd_map_over_sections (is->the_bfd, debug_section_p, &found_debug);
+ if (found_debug)
+ {
+ pe_use_coff_long_section_names = 1;
+ break;
+ }
+ }
+ }
+
pe_output_file_set_long_section_names (link_info.output_bfd);
#ifdef DLL_SUPPORT
diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em
index 0ab913b..13180a0 100644
--- a/ld/emultempl/pep.em
+++ b/ld/emultempl/pep.em
@@ -1020,6 +1020,13 @@ pr_sym (struct bfd_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
}
#endif /* DLL_SUPPORT */
+static void
+debug_section_p (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj)
+{
+ int *found = (int *) obj;
+ if (strncmp (".debug_", sect->name, sizeof (".debug_") - 1) == 0)
+ *found = 1;
+}
static void
gld_${EMULATION_NAME}_after_open (void)
@@ -1053,6 +1060,29 @@ gld_${EMULATION_NAME}_after_open (void)
pe_data (link_info.output_bfd)->pe_opthdr = pep;
pe_data (link_info.output_bfd)->dll = init[DLLOFF].value;
pe_data (link_info.output_bfd)->real_flags |= real_flags;
+
+ /* At this point we must decide whether to use long section names
+ in the output or not. If the user hasn't explicitly specified
+ on the command line, we leave it to the default for the format
+ (object files yes, image files no), except if there is debug
+ information present; GDB relies on the long section names to
+ find it, so enable it in that case. */
+ if (pep_use_coff_long_section_names < 0 && link_info.strip == strip_none)
+ {
+ /* Iterate over all sections of all input BFDs, checking
+ for any that begin 'debug_' and are long names. */
+ LANG_FOR_EACH_INPUT_STATEMENT (is)
+ {
+ int found_debug = 0;
+ bfd_map_over_sections (is->the_bfd, debug_section_p, &found_debug);
+ if (found_debug)
+ {
+ pep_use_coff_long_section_names = 1;
+ break;
+ }
+ }
+ }
+
pep_output_file_set_long_section_names (link_info.output_bfd);
#ifdef DLL_SUPPORT
diff --git a/ld/ld.texinfo b/ld/ld.texinfo
index 167df28..e2a70a8 100644
--- a/ld/ld.texinfo
+++ b/ld/ld.texinfo
@@ -2124,7 +2124,13 @@ allow their use in executable images as well, or to (probably pointlessly!)
disallow it in object files, by using these two options. Executable images
generated with these long section names are slightly non-standard, carrying
as they do a string table, and may generate confusing output when examined
-with non-GNU PE-aware tools, such as file viewers and dumpers.
+with non-GNU PE-aware tools, such as file viewers and dumpers. However,
+GDB relies on the use of PE long section names to find Dwarf-2 debug
+information sections in an executable image at runtime, and so if neither
+option is specified on the command-line, @command{ld} will enable long
+section names, overriding the default and technically correct behaviour,
+when it finds the presence of debug information while linking an executable
+image and not stripping symbols.
[This option is valid for all PE targeted ports of the linker]
@kindex --enable-stdcall-fixup