From a332747c1cc636f9011f91edac367db31866b727 Mon Sep 17 00:00:00 2001 From: Dave Korn Date: Tue, 3 Mar 2009 18:22:11 +0000 Subject: [PATCH] * 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. --- ld/ChangeLog | 11 +++++++++++ ld/NEWS | 4 +++- ld/emultempl/pe.em | 30 ++++++++++++++++++++++++++++++ ld/emultempl/pep.em | 30 ++++++++++++++++++++++++++++++ ld/ld.texinfo | 8 +++++++- 5 files changed, 81 insertions(+), 2 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 1d0fea901..ba87342d8 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2009-03-03 Dave Korn + + * 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 * ldgram.y: Add support for REGION_ALIAS operator. diff --git a/ld/NEWS b/ld/NEWS index e4951572d..440534ac8 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 46c405743..58ec809df 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 0ab913b3f..13180a018 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 167df2838..e2a70a8b7 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 -- 2.11.4.GIT