diff options
author | Alan Modra <amodra@gmail.com> | 2014-07-01 19:32:25 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2014-07-01 20:28:20 +0930 |
commit | 7341d5e22f1061016411734ba162d362ac5928db (patch) | |
tree | 36cec79187a6e05bf2e6fa095168347669fbb11e /ld | |
parent | 2dc0e7b400e46f105960c0dfcd431013f0013c6a (diff) | |
download | gdb-7341d5e22f1061016411734ba162d362ac5928db.zip gdb-7341d5e22f1061016411734ba162d362ac5928db.tar.gz gdb-7341d5e22f1061016411734ba162d362ac5928db.tar.bz2 |
Add symbols for global entry stub, and report stats
The undefined function symbols (with non-zero value) on global entry
stubs are discarded by objdump when disassembling, so give objdump
another symbol to mark the stubs.
Also fixes a couple of bugs:
- entry_section was set to .opd for ELFv2, which meant a hard error
rather than a warning when _start wasn't defined.
- global entry stubs were not built if they were the only type of
stub in an executable.
bfd/
* elf64-ppc.c (ppc_stub_type): Add ppc_stub_global_entry.
(struct ppc_link_hash_table): Increase size of stub_count array.
(build_global_entry_stubs): Emit symbol on global entry stub.
(ppc64_elf_build_stubs): NULL check htab->brlt. Add global entry
stub stats.
ld/
* emultempl/ppc64elf.em (stub_added): Delete.
(gld${EMULATION_NAME}_finish): Call ppc64_elf_build_stubs even when
none of the usual stubs have been added. Only change entry_section
for ELFv1.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 7 | ||||
-rw-r--r-- | ld/emultempl/ppc64elf.em | 47 |
2 files changed, 30 insertions, 24 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index fd14305..bfddd80 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,12 @@ 2014-07-01 Alan Modra <amodra@gmail.com> + * emultempl/ppc64elf.em (stub_added): Delete. + (gld${EMULATION_NAME}_finish): Call ppc64_elf_build_stubs even when + none of the usual stubs have been added. Only change entry_section + for ELFv1. + +2014-07-01 Alan Modra <amodra@gmail.com> + * sysdep.h: Don't include limits.h and sys/param.h. Don't include unistd.h twice. (LD_PATHMAX): Don't define. diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em index 78faf68..d45fdac 100644 --- a/ld/emultempl/ppc64elf.em +++ b/ld/emultempl/ppc64elf.em @@ -29,6 +29,7 @@ fragment <<EOF #include "elf-bfd.h" #include "elf64-ppc.h" #include "ldlex.h" +#include "elf/ppc64.h" static asection *ppc_add_stub_section (const char *, asection *); static void ppc_layout_sections_again (void); @@ -42,7 +43,6 @@ static struct ppc64_elf_params params = { NULL, /* Fake input file for stubs. */ static lang_input_statement_type *stub_file; -static int stub_added = 0; /* Whether we need to call ppc_layout_sections_again. */ static int need_laying_out = 0; @@ -390,7 +390,6 @@ ppc_add_stub_section (const char *stub_sec_name, asection *input_section) if (info.add.head == NULL) goto err_ret; - stub_added = 1; if (hook_in_stub (&info, &os->children.head)) return stub_sec; @@ -518,33 +517,33 @@ gld${EMULATION_NAME}_after_allocation (void) static void gld${EMULATION_NAME}_finish (void) { + char *msg = NULL; + char *line, *endline; + /* e_entry on PowerPC64 points to the function descriptor for _start. If _start is missing, default to the first function descriptor in the .opd section. */ - entry_section = ".opd"; - - if (stub_added) + if ((elf_elfheader (link_info.output_bfd)->e_flags & EF_PPC64_ABI) == 1) + entry_section = ".opd"; + + if (params.emit_stub_syms < 0) + params.emit_stub_syms = 1; + if (stub_file != NULL + && !link_info.relocatable + && !ppc64_elf_build_stubs (&link_info, config.stats ? &msg : NULL)) + einfo ("%X%P: can not build stubs: %E\n"); + + fflush (stdout); + for (line = msg; line != NULL; line = endline) { - char *msg = NULL; - char *line, *endline; - - if (params.emit_stub_syms < 0) - params.emit_stub_syms = 1; - if (!ppc64_elf_build_stubs (&link_info, config.stats ? &msg : NULL)) - einfo ("%X%P: can not build stubs: %E\n"); - - fflush (stdout); - for (line = msg; line != NULL; line = endline) - { - endline = strchr (line, '\n'); - if (endline != NULL) - *endline++ = '\0'; - fprintf (stderr, "%s: %s\n", program_name, line); - } - fflush (stderr); - if (msg != NULL) - free (msg); + endline = strchr (line, '\n'); + if (endline != NULL) + *endline++ = '\0'; + fprintf (stderr, "%s: %s\n", program_name, line); } + fflush (stderr); + if (msg != NULL) + free (msg); ppc64_elf_restore_symbols (&link_info); finish_default (); |