summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Korn <dave.korn@artimi.com>2009-03-03 18:22:11 +0000
committerDave Korn <dave.korn@artimi.com>2009-03-03 18:22:11 +0000
commit3efd345c3b8f1f91a1698023ac736f2648972d81 (patch)
tree4799c1fd81b722a3fdc73518103ca02a4fb1fa2b
parent6aa8e5c2ae66323abb1fb2f8b6c454305781aad2 (diff)
downloadbinutils-gdb-3efd345c3b8f1f91a1698023ac736f2648972d81.tar.gz
* 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.
-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 1d0fea9015c..ba87342d8f3 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 e4951572d80..440534ac83f 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 46c4057433e..58ec809dfe2 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 0ab913b3f1a..13180a01825 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 167df2838f9..e2a70a8b7a9 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