From 6ba2a41553ce33bc63e4ee1beef0ff1193e3ed70 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Mon, 30 Jun 2008 20:51:58 +0000 Subject: [PATCH] bfd/ * syms.c (BSF_SYNTHETIC): New flag. * elf.c (_bfd_elf_get_synthetic_symtab): Set it. * elf32-ppc.c (ppc_elf_get_synthetic_symtab): Likewise. * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Likewise. * bfd-in.h (bfd_asymbol_flavour): Return bfd_target_unknown_flavour for synthetic symbols. * bfd-in2.h: Regenerate. opcodes/ * mips-dis.c (_print_insn_mips): Use bfd_asymbol_flavour to check for ELF symbols. --- bfd/ChangeLog | 10 ++++++++++ bfd/bfd-in.h | 5 ++++- bfd/bfd-in2.h | 8 +++++++- bfd/elf.c | 1 + bfd/elf32-ppc.c | 5 +++-- bfd/elf64-ppc.c | 5 ++++- bfd/syms.c | 3 +++ opcodes/ChangeLog | 5 +++++ opcodes/mips-dis.c | 4 ++-- 9 files changed, 39 insertions(+), 7 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 3a22c3fdf4a..015a40ca43b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2008-06-30 Richard Sandiford + + * syms.c (BSF_SYNTHETIC): New flag. + * elf.c (_bfd_elf_get_synthetic_symtab): Set it. + * elf32-ppc.c (ppc_elf_get_synthetic_symtab): Likewise. + * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Likewise. + * bfd-in.h (bfd_asymbol_flavour): Return bfd_target_unknown_flavour + for synthetic symbols. + * bfd-in2.h: Regenerate. + 2008-06-30 Daniel Jacobowitz * elf32-arm.c (record_arm_to_thumb_glue, record_thumb_to_arm_glue): diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index 036612535d8..3a3fa3f934f 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -231,7 +231,10 @@ typedef const struct reloc_howto_struct reloc_howto_type; #define bfd_asymbol_name(x) ((x)->name) /*Perhaps future: #define bfd_asymbol_bfd(x) ((x)->section->owner)*/ #define bfd_asymbol_bfd(x) ((x)->the_bfd) -#define bfd_asymbol_flavour(x) (bfd_asymbol_bfd(x)->xvec->flavour) +#define bfd_asymbol_flavour(x) \ + (((x)->flags & BSF_SYNTHETIC) != 0 \ + ? bfd_target_unknown_flavour \ + : bfd_asymbol_bfd (x)->xvec->flavour) /* A canonical archive symbol. */ /* This is a type pun with struct ranlib on purpose! */ diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index f69cf078138..7ab22b55cce 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -238,7 +238,10 @@ typedef const struct reloc_howto_struct reloc_howto_type; #define bfd_asymbol_name(x) ((x)->name) /*Perhaps future: #define bfd_asymbol_bfd(x) ((x)->section->owner)*/ #define bfd_asymbol_bfd(x) ((x)->the_bfd) -#define bfd_asymbol_flavour(x) (bfd_asymbol_bfd(x)->xvec->flavour) +#define bfd_asymbol_flavour(x) \ + (((x)->flags & BSF_SYNTHETIC) != 0 \ + ? bfd_target_unknown_flavour \ + : bfd_asymbol_bfd (x)->xvec->flavour) /* A canonical archive symbol. */ /* This is a type pun with struct ranlib on purpose! */ @@ -4502,6 +4505,9 @@ typedef struct bfd_symbol with the expression tree serialized in the symbol name. */ #define BSF_SRELC 0x100000 + /* This symbol was created by bfd_get_synthetic_symtab. */ +#define BSF_SYNTHETIC 0x200000 + flagword flags; /* A pointer to the section to which this symbol is diff --git a/bfd/elf.c b/bfd/elf.c index c5da23b2885..c79c31111cd 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -8785,6 +8785,7 @@ _bfd_elf_get_synthetic_symtab (bfd *abfd, we are defining a symbol, ensure one of them is set. */ if ((s->flags & BSF_LOCAL) == 0) s->flags |= BSF_GLOBAL; + s->flags |= BSF_SYNTHETIC; s->section = plt; s->value = addr - plt->vma; s->name = names; diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 2dafde7d0d8..0ad11757909 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -2450,6 +2450,7 @@ ppc_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms, we are defining a symbol, ensure one of them is set. */ if ((s->flags & BSF_LOCAL) == 0) s->flags |= BSF_GLOBAL; + s->flags |= BSF_SYNTHETIC; s->section = glink; s->value = stub_vma - glink->vma; s->name = names; @@ -2466,7 +2467,7 @@ ppc_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms, /* Add a symbol at the start of the glink branch table. */ memset (s, 0, sizeof *s); s->the_bfd = abfd; - s->flags = BSF_GLOBAL; + s->flags = BSF_GLOBAL | BSF_SYNTHETIC; s->section = glink; s->value = glink_vma - glink->vma; s->name = names; @@ -2480,7 +2481,7 @@ ppc_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms, /* Add a symbol for the glink PLT resolver. */ memset (s, 0, sizeof *s); s->the_bfd = abfd; - s->flags = BSF_GLOBAL; + s->flags = BSF_GLOBAL | BSF_SYNTHETIC; s->section = glink; s->value = resolv_vma - glink->vma; s->name = names; diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 06b14768bb2..727b6ac2b19 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -2954,6 +2954,7 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, size_t len; *s = *syms[i]; + s->flags |= BSF_SYNTHETIC; s->section = sym->section; s->value = sym->value + r->addend; s->name = names; @@ -3124,6 +3125,7 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, if ((sec->flags & SEC_CODE) != 0) s->section = sec; } + s->flags |= BSF_SYNTHETIC; s->value = ent - s->section->vma; s->name = names; *names++ = '.'; @@ -3145,7 +3147,7 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, /* Add a symbol for the main glink trampoline. */ memset (s, 0, sizeof *s); s->the_bfd = abfd; - s->flags = BSF_GLOBAL; + s->flags = BSF_GLOBAL | BSF_SYNTHETIC; s->section = glink; s->value = resolv_vma - glink->vma; s->name = names; @@ -3181,6 +3183,7 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd, we are defining a symbol, ensure one of them is set. */ if ((s->flags & BSF_LOCAL) == 0) s->flags |= BSF_GLOBAL; + s->flags |= BSF_SYNTHETIC; s->section = glink; s->value = glink_vma - glink->vma; s->name = names; diff --git a/bfd/syms.c b/bfd/syms.c index 8831b9257c2..371916b9404 100644 --- a/bfd/syms.c +++ b/bfd/syms.c @@ -297,6 +297,9 @@ CODE_FRAGMENT . with the expression tree serialized in the symbol name. *} .#define BSF_SRELC 0x100000 . +. {* This symbol was created by bfd_get_synthetic_symtab. *} +.#define BSF_SYNTHETIC 0x200000 +. . flagword flags; . . {* A pointer to the section to which this symbol is diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index ad39ba9a0b2..4925a228670 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2008-06-30 Richard Sandiford + + * mips-dis.c (_print_insn_mips): Use bfd_asymbol_flavour to check + for ELF symbols. + 2008-06-25 Peter Bergner * ppc-dis.c (powerpc_init_dialect): Handle -M464. diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c index ada753f4f86..35a51191525 100644 --- a/opcodes/mips-dis.c +++ b/opcodes/mips-dis.c @@ -2066,8 +2066,8 @@ _print_insn_mips (bfd_vma memaddr, #if SYMTAB_AVAILABLE if (info->mach == bfd_mach_mips16 - || (info->flavour == bfd_target_elf_flavour - && info->symbols != NULL + || (info->symbols != NULL + && bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour && ((*(elf_symbol_type **) info->symbols)->internal_elf_sym.st_other == STO_MIPS16))) return print_insn_mips16 (memaddr, info); -- 2.30.2