* 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.
This commit is contained in:
Dave Korn 2009-03-03 18:22:11 +00:00
parent 6aa8e5c2ae
commit 3efd345c3b
5 changed files with 81 additions and 2 deletions

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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