Index: bfd/elf32-m68k.c |
diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c |
index bd660e9849e7380c556409abf28984a8feea284f..6946841e4458934fa8f032b60017717ade9b796d 100644 |
--- a/bfd/elf32-m68k.c |
+++ b/bfd/elf32-m68k.c |
@@ -1,6 +1,6 @@ |
/* Motorola 68k series support for 32-bit ELF |
Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, |
- 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 |
+ 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 |
Free Software Foundation, Inc. |
This file is part of BFD, the Binary File Descriptor library. |
@@ -28,42 +28,11 @@ |
#include "elf/m68k.h" |
#include "opcode/m68k.h" |
-static reloc_howto_type *reloc_type_lookup |
- PARAMS ((bfd *, bfd_reloc_code_real_type)); |
-static void rtype_to_howto |
- PARAMS ((bfd *, arelent *, Elf_Internal_Rela *)); |
-static struct bfd_hash_entry *elf_m68k_link_hash_newfunc |
- PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); |
-static struct bfd_link_hash_table *elf_m68k_link_hash_table_create |
- PARAMS ((bfd *)); |
-static bfd_boolean elf_m68k_check_relocs |
- PARAMS ((bfd *, struct bfd_link_info *, asection *, |
- const Elf_Internal_Rela *)); |
-static bfd_boolean elf_m68k_adjust_dynamic_symbol |
- PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); |
-static bfd_boolean elf_m68k_size_dynamic_sections |
- PARAMS ((bfd *, struct bfd_link_info *)); |
-static bfd_boolean elf_m68k_discard_copies |
- PARAMS ((struct elf_link_hash_entry *, PTR)); |
-static bfd_boolean elf_m68k_relocate_section |
- PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, |
- Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)); |
-static bfd_boolean elf_m68k_finish_dynamic_symbol |
- PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, |
- Elf_Internal_Sym *)); |
-static bfd_boolean elf_m68k_finish_dynamic_sections |
- PARAMS ((bfd *, struct bfd_link_info *)); |
- |
-static bfd_boolean elf32_m68k_set_private_flags |
- PARAMS ((bfd *, flagword)); |
-static bfd_boolean elf32_m68k_merge_private_bfd_data |
- PARAMS ((bfd *, bfd *)); |
-static bfd_boolean elf32_m68k_print_private_bfd_data |
- PARAMS ((bfd *, PTR)); |
-static enum elf_reloc_type_class elf32_m68k_reloc_type_class |
- PARAMS ((const Elf_Internal_Rela *)); |
- |
-static reloc_howto_type howto_table[] = { |
+static bfd_boolean |
+elf_m68k_discard_copies (struct elf_link_hash_entry *, void *); |
+ |
+static reloc_howto_type howto_table[] = |
+{ |
HOWTO(R_68K_NONE, 0, 0, 0, FALSE,0, complain_overflow_dont, bfd_elf_generic_reloc, "R_68K_NONE", FALSE, 0, 0x00000000,FALSE), |
HOWTO(R_68K_32, 0, 2,32, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_32", FALSE, 0, 0xffffffff,FALSE), |
HOWTO(R_68K_16, 0, 1,16, FALSE,0, complain_overflow_bitfield, bfd_elf_generic_reloc, "R_68K_16", FALSE, 0, 0x0000ffff,FALSE), |
@@ -441,9 +410,8 @@ static const struct |
}; |
static reloc_howto_type * |
-reloc_type_lookup (abfd, code) |
- bfd *abfd ATTRIBUTE_UNUSED; |
- bfd_reloc_code_real_type code; |
+reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, |
+ bfd_reloc_code_real_type code) |
{ |
unsigned int i; |
for (i = 0; i < sizeof (reloc_map) / sizeof (reloc_map[0]); i++) |
@@ -1145,9 +1113,7 @@ elf_m68k_final_write_processing (bfd *abfd, |
/* Keep m68k-specific flags in the ELF header. */ |
static bfd_boolean |
-elf32_m68k_set_private_flags (abfd, flags) |
- bfd *abfd; |
- flagword flags; |
+elf32_m68k_set_private_flags (bfd *abfd, flagword flags) |
{ |
elf_elfheader (abfd)->e_flags = flags; |
elf_flags_init (abfd) = TRUE; |
@@ -1157,9 +1123,7 @@ elf32_m68k_set_private_flags (abfd, flags) |
/* Merge backend specific data from an object file to the output |
object file when linking. */ |
static bfd_boolean |
-elf32_m68k_merge_private_bfd_data (ibfd, obfd) |
- bfd *ibfd; |
- bfd *obfd; |
+elf32_m68k_merge_private_bfd_data (bfd *ibfd, bfd *obfd) |
{ |
flagword out_flags; |
flagword in_flags; |
@@ -2468,7 +2432,7 @@ elf_m68k_partition_multi_got (struct bfd_link_info *info) |
{ |
asection *s; |
- s = bfd_get_section_by_name (elf_hash_table (info)->dynobj, ".got"); |
+ s = bfd_get_linker_section (elf_hash_table (info)->dynobj, ".got"); |
if (s != NULL) |
s->size = arg_.offset; |
else |
@@ -2477,7 +2441,7 @@ elf_m68k_partition_multi_got (struct bfd_link_info *info) |
BFD_ASSERT (arg_.slots_relas_diff <= arg_.n_slots); |
arg_.n_slots -= arg_.slots_relas_diff; |
- s = bfd_get_section_by_name (elf_hash_table (info)->dynobj, ".rela.got"); |
+ s = bfd_get_linker_section (elf_hash_table (info)->dynobj, ".rela.got"); |
if (s != NULL) |
s->size = arg_.n_slots * sizeof (Elf32_External_Rela); |
else |
@@ -2581,11 +2545,10 @@ elf_m68k_copy_indirect_symbol (struct bfd_link_info *info, |
table. */ |
static bfd_boolean |
-elf_m68k_check_relocs (abfd, info, sec, relocs) |
- bfd *abfd; |
- struct bfd_link_info *info; |
- asection *sec; |
- const Elf_Internal_Rela *relocs; |
+elf_m68k_check_relocs (bfd *abfd, |
+ struct bfd_link_info *info, |
+ asection *sec, |
+ const Elf_Internal_Rela *relocs) |
{ |
bfd *dynobj; |
Elf_Internal_Shdr *symtab_hdr; |
@@ -2675,24 +2638,22 @@ elf_m68k_check_relocs (abfd, info, sec, relocs) |
if (sgot == NULL) |
{ |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
BFD_ASSERT (sgot != NULL); |
} |
if (srelgot == NULL |
&& (h != NULL || info->shared)) |
{ |
- srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ srelgot = bfd_get_linker_section (dynobj, ".rela.got"); |
if (srelgot == NULL) |
{ |
- srelgot = bfd_make_section_with_flags (dynobj, |
- ".rela.got", |
- (SEC_ALLOC |
- | SEC_LOAD |
- | SEC_HAS_CONTENTS |
- | SEC_IN_MEMORY |
- | SEC_LINKER_CREATED |
- | SEC_READONLY)); |
+ flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS |
+ | SEC_IN_MEMORY | SEC_LINKER_CREATED |
+ | SEC_READONLY); |
+ srelgot = bfd_make_section_anyway_with_flags (dynobj, |
+ ".rela.got", |
+ flags); |
if (srelgot == NULL |
|| !bfd_set_section_alignment (dynobj, srelgot, 2)) |
return FALSE; |
@@ -2827,7 +2788,7 @@ elf_m68k_check_relocs (abfd, info, sec, relocs) |
turns out to be a function defined by a dynamic object. */ |
h->plt.refcount++; |
- if (!info->shared) |
+ if (info->executable) |
/* This symbol needs a non-GOT reference. */ |
h->non_got_ref = 1; |
} |
@@ -3130,9 +3091,8 @@ elf_m68k_always_size_sections (bfd *output_bfd, struct bfd_link_info *info) |
understand. */ |
static bfd_boolean |
-elf_m68k_adjust_dynamic_symbol (info, h) |
- struct bfd_link_info *info; |
- struct elf_link_hash_entry *h; |
+elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info, |
+ struct elf_link_hash_entry *h) |
{ |
struct elf_m68k_link_hash_table *htab; |
bfd *dynobj; |
@@ -3182,7 +3142,7 @@ elf_m68k_adjust_dynamic_symbol (info, h) |
return FALSE; |
} |
- s = bfd_get_section_by_name (dynobj, ".plt"); |
+ s = bfd_get_linker_section (dynobj, ".plt"); |
BFD_ASSERT (s != NULL); |
/* If this is the first .plt entry, make room for the special |
@@ -3209,12 +3169,12 @@ elf_m68k_adjust_dynamic_symbol (info, h) |
/* We also need to make an entry in the .got.plt section, which |
will be placed in the .got section by the linker script. */ |
- s = bfd_get_section_by_name (dynobj, ".got.plt"); |
+ s = bfd_get_linker_section (dynobj, ".got.plt"); |
BFD_ASSERT (s != NULL); |
s->size += 4; |
/* We also need to make an entry in the .rela.plt section. */ |
- s = bfd_get_section_by_name (dynobj, ".rela.plt"); |
+ s = bfd_get_linker_section (dynobj, ".rela.plt"); |
BFD_ASSERT (s != NULL); |
s->size += sizeof (Elf32_External_Rela); |
@@ -3252,13 +3212,6 @@ elf_m68k_adjust_dynamic_symbol (info, h) |
if (!h->non_got_ref) |
return TRUE; |
- if (h->size == 0) |
- { |
- (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"), |
- h->root.root.string); |
- return TRUE; |
- } |
- |
/* We must allocate the symbol in our .dynbss section, which will |
become part of the .bss section of the executable. There will be |
an entry for this symbol in the .dynsym section. The dynamic |
@@ -3269,18 +3222,18 @@ elf_m68k_adjust_dynamic_symbol (info, h) |
both the dynamic object and the regular object will refer to the |
same memory location for the variable. */ |
- s = bfd_get_section_by_name (dynobj, ".dynbss"); |
+ s = bfd_get_linker_section (dynobj, ".dynbss"); |
BFD_ASSERT (s != NULL); |
/* We must generate a R_68K_COPY reloc to tell the dynamic linker to |
copy the initial value out of the dynamic object and into the |
runtime process image. We need to remember the offset into the |
.rela.bss section we are going to use. */ |
- if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) |
+ if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) |
{ |
asection *srel; |
- srel = bfd_get_section_by_name (dynobj, ".rela.bss"); |
+ srel = bfd_get_linker_section (dynobj, ".rela.bss"); |
BFD_ASSERT (srel != NULL); |
srel->size += sizeof (Elf32_External_Rela); |
h->needs_copy = 1; |
@@ -3292,9 +3245,8 @@ elf_m68k_adjust_dynamic_symbol (info, h) |
/* Set the sizes of the dynamic sections. */ |
static bfd_boolean |
-elf_m68k_size_dynamic_sections (output_bfd, info) |
- bfd *output_bfd ATTRIBUTE_UNUSED; |
- struct bfd_link_info *info; |
+elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, |
+ struct bfd_link_info *info) |
{ |
bfd *dynobj; |
asection *s; |
@@ -3309,7 +3261,7 @@ elf_m68k_size_dynamic_sections (output_bfd, info) |
/* Set the contents of the .interp section to the interpreter. */ |
if (info->executable) |
{ |
- s = bfd_get_section_by_name (dynobj, ".interp"); |
+ s = bfd_get_linker_section (dynobj, ".interp"); |
BFD_ASSERT (s != NULL); |
s->size = sizeof ELF_DYNAMIC_INTERPRETER; |
s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; |
@@ -3322,7 +3274,7 @@ elf_m68k_size_dynamic_sections (output_bfd, info) |
not actually use these entries. Reset the size of .rela.got, |
which will cause it to get stripped from the output file |
below. */ |
- s = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ s = bfd_get_linker_section (dynobj, ".rela.got"); |
if (s != NULL) |
s->size = 0; |
} |
@@ -3336,7 +3288,7 @@ elf_m68k_size_dynamic_sections (output_bfd, info) |
if (info->shared) |
elf_link_hash_traverse (elf_hash_table (info), |
elf_m68k_discard_copies, |
- (PTR) info); |
+ info); |
/* The check_relocs and adjust_dynamic_symbol entry points have |
determined the sizes of the various dynamic sections. Allocate |
@@ -3464,9 +3416,8 @@ elf_m68k_size_dynamic_sections (output_bfd, info) |
case. */ |
static bfd_boolean |
-elf_m68k_discard_copies (h, inf) |
- struct elf_link_hash_entry *h; |
- PTR inf; |
+elf_m68k_discard_copies (struct elf_link_hash_entry *h, |
+ void * inf) |
{ |
struct bfd_link_info *info = (struct bfd_link_info *) inf; |
struct elf_m68k_pcrel_relocs_copied *s; |
@@ -3486,6 +3437,18 @@ elf_m68k_discard_copies (h, inf) |
} |
} |
+ /* Make sure undefined weak symbols are output as a dynamic symbol |
+ in PIEs. */ |
+ if (h->non_got_ref |
+ && h->root.type == bfd_link_hash_undefweak |
+ && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT |
+ && h->dynindx == -1 |
+ && !h->forced_local) |
+ { |
+ if (! bfd_elf_link_record_dynamic_symbol (info, h)) |
+ return FALSE; |
+ } |
+ |
return TRUE; |
} |
@@ -3639,16 +3602,14 @@ elf_m68k_init_got_entry_local_shared (struct bfd_link_info *info, |
/* Relocate an M68K ELF section. */ |
static bfd_boolean |
-elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section, |
- contents, relocs, local_syms, local_sections) |
- bfd *output_bfd; |
- struct bfd_link_info *info; |
- bfd *input_bfd; |
- asection *input_section; |
- bfd_byte *contents; |
- Elf_Internal_Rela *relocs; |
- Elf_Internal_Sym *local_syms; |
- asection **local_sections; |
+elf_m68k_relocate_section (bfd *output_bfd, |
+ struct bfd_link_info *info, |
+ bfd *input_bfd, |
+ asection *input_section, |
+ bfd_byte *contents, |
+ Elf_Internal_Rela *relocs, |
+ Elf_Internal_Sym *local_syms, |
+ asection **local_sections) |
{ |
bfd *dynobj; |
Elf_Internal_Shdr *symtab_hdr; |
@@ -3717,9 +3678,9 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section, |
unresolved_reloc, warned); |
} |
- if (sec != NULL && elf_discarded_section (sec)) |
+ if (sec != NULL && discarded_section (sec)) |
RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, |
- rel, relend, howto, contents); |
+ rel, 1, relend, howto, 0, contents); |
if (info->relocatable) |
continue; |
@@ -3741,7 +3702,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section, |
if (sgot == NULL) |
{ |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
if (sgot != NULL) |
sgot_output_offset = sgot->output_offset; |
@@ -3816,7 +3777,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section, |
if (sgot == NULL) |
{ |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
BFD_ASSERT (sgot != NULL); |
} |
@@ -3887,7 +3848,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section, |
{ |
if (srela == NULL) |
{ |
- srela = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ srela = bfd_get_linker_section (dynobj, ".rela.got"); |
BFD_ASSERT (srela != NULL); |
} |
@@ -3955,7 +3916,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section, |
case R_68K_TLS_LE32: |
case R_68K_TLS_LE16: |
case R_68K_TLS_LE8: |
- if (info->shared) |
+ if (info->shared && !info->pie) |
{ |
(*_bfd_error_handler) |
(_("%B(%A+0x%lx): R_68K_TLS_LE32 relocation not permitted " |
@@ -3991,7 +3952,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section, |
if (splt == NULL) |
{ |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
BFD_ASSERT (splt != NULL); |
} |
@@ -4010,7 +3971,7 @@ elf_m68k_relocate_section (output_bfd, info, input_bfd, input_section, |
if (splt == NULL) |
{ |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
BFD_ASSERT (splt != NULL); |
} |
@@ -4264,11 +4225,10 @@ elf_m68k_install_pc32 (asection *sec, bfd_vma offset, bfd_vma value) |
dynamic sections here. */ |
static bfd_boolean |
-elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym) |
- bfd *output_bfd; |
- struct bfd_link_info *info; |
- struct elf_link_hash_entry *h; |
- Elf_Internal_Sym *sym; |
+elf_m68k_finish_dynamic_symbol (bfd *output_bfd, |
+ struct bfd_link_info *info, |
+ struct elf_link_hash_entry *h, |
+ Elf_Internal_Sym *sym) |
{ |
bfd *dynobj; |
@@ -4291,9 +4251,9 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym) |
BFD_ASSERT (h->dynindx != -1); |
plt_info = elf_m68k_hash_table (info)->plt_info; |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
- sgot = bfd_get_section_by_name (dynobj, ".got.plt"); |
- srela = bfd_get_section_by_name (dynobj, ".rela.plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
+ sgot = bfd_get_linker_section (dynobj, ".got.plt"); |
+ srela = bfd_get_linker_section (dynobj, ".rela.plt"); |
BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL); |
/* Get the index in the procedure linkage table which |
@@ -4358,8 +4318,8 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym) |
/* This symbol has an entry in the global offset table. Set it |
up. */ |
- sgot = bfd_get_section_by_name (dynobj, ".got"); |
- srela = bfd_get_section_by_name (dynobj, ".rela.got"); |
+ sgot = bfd_get_linker_section (dynobj, ".got"); |
+ srela = bfd_get_linker_section (dynobj, ".rela.got"); |
BFD_ASSERT (sgot != NULL && srela != NULL); |
got_entry = elf_m68k_hash_entry (h)->glist; |
@@ -4482,8 +4442,7 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym) |
&& (h->root.type == bfd_link_hash_defined |
|| h->root.type == bfd_link_hash_defweak)); |
- s = bfd_get_section_by_name (h->root.u.def.section->owner, |
- ".rela.bss"); |
+ s = bfd_get_linker_section (dynobj, ".rela.bss"); |
BFD_ASSERT (s != NULL); |
rela.r_offset = (h->root.u.def.value |
@@ -4495,20 +4454,13 @@ elf_m68k_finish_dynamic_symbol (output_bfd, info, h, sym) |
bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); |
} |
- /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ |
- if (strcmp (h->root.root.string, "_DYNAMIC") == 0 |
- || h == elf_hash_table (info)->hgot) |
- sym->st_shndx = SHN_ABS; |
- |
return TRUE; |
} |
/* Finish up the dynamic sections. */ |
static bfd_boolean |
-elf_m68k_finish_dynamic_sections (output_bfd, info) |
- bfd *output_bfd; |
- struct bfd_link_info *info; |
+elf_m68k_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) |
{ |
bfd *dynobj; |
asection *sgot; |
@@ -4516,16 +4468,16 @@ elf_m68k_finish_dynamic_sections (output_bfd, info) |
dynobj = elf_hash_table (info)->dynobj; |
- sgot = bfd_get_section_by_name (dynobj, ".got.plt"); |
+ sgot = bfd_get_linker_section (dynobj, ".got.plt"); |
BFD_ASSERT (sgot != NULL); |
- sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); |
+ sdyn = bfd_get_linker_section (dynobj, ".dynamic"); |
if (elf_hash_table (info)->dynamic_sections_created) |
{ |
asection *splt; |
Elf32_External_Dyn *dyncon, *dynconend; |
- splt = bfd_get_section_by_name (dynobj, ".plt"); |
+ splt = bfd_get_linker_section (dynobj, ".plt"); |
BFD_ASSERT (splt != NULL && sdyn != NULL); |
dyncon = (Elf32_External_Dyn *) sdyn->contents; |
@@ -4652,7 +4604,7 @@ bfd_m68k_elf32_create_embedded_relocs (abfd, info, datasec, relsec, errmsg) |
/* Get a copy of the native relocations. */ |
internal_relocs = (_bfd_elf_link_read_relocs |
- (abfd, datasec, (PTR) NULL, (Elf_Internal_Rela *) NULL, |
+ (abfd, datasec, NULL, (Elf_Internal_Rela *) NULL, |
info->keep_memory)); |
if (internal_relocs == NULL) |
goto error_return; |
@@ -4790,8 +4742,7 @@ bfd_elf_m68k_set_target_options (struct bfd_link_info *info, int got_handling) |
} |
static enum elf_reloc_type_class |
-elf32_m68k_reloc_type_class (rela) |
- const Elf_Internal_Rela *rela; |
+elf32_m68k_reloc_type_class (const Elf_Internal_Rela *rela) |
{ |
switch ((int) ELF32_R_TYPE (rela->r_info)) |
{ |
@@ -4816,6 +4767,69 @@ elf_m68k_plt_sym_val (bfd_vma i, const asection *plt, |
return plt->vma + (i + 1) * elf_m68k_get_plt_info (plt->owner)->size; |
} |
+/* Support for core dump NOTE sections. */ |
+ |
+static bfd_boolean |
+elf_m68k_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) |
+{ |
+ int offset; |
+ size_t size; |
+ |
+ switch (note->descsz) |
+ { |
+ default: |
+ return FALSE; |
+ |
+ case 154: /* Linux/m68k */ |
+ /* pr_cursig */ |
+ elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12); |
+ |
+ /* pr_pid */ |
+ elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 22); |
+ |
+ /* pr_reg */ |
+ offset = 70; |
+ size = 80; |
+ |
+ break; |
+ } |
+ |
+ /* Make a ".reg/999" section. */ |
+ return _bfd_elfcore_make_pseudosection (abfd, ".reg", |
+ size, note->descpos + offset); |
+} |
+ |
+static bfd_boolean |
+elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) |
+{ |
+ switch (note->descsz) |
+ { |
+ default: |
+ return FALSE; |
+ |
+ case 124: /* Linux/m68k elf_prpsinfo. */ |
+ elf_tdata (abfd)->core_pid |
+ = bfd_get_32 (abfd, note->descdata + 12); |
+ elf_tdata (abfd)->core_program |
+ = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16); |
+ elf_tdata (abfd)->core_command |
+ = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80); |
+ } |
+ |
+ /* Note that for some reason, a spurious space is tacked |
+ onto the end of the args in some (at least one anyway) |
+ implementations, so strip it off if it exists. */ |
+ { |
+ char *command = elf_tdata (abfd)->core_command; |
+ int n = strlen (command); |
+ |
+ if (n > 0 && command[n - 1] == ' ') |
+ command[n - 1] = '\0'; |
+ } |
+ |
+ return TRUE; |
+} |
+ |
#define TARGET_BIG_SYM bfd_elf32_m68k_vec |
#define TARGET_BIG_NAME "elf32-m68k" |
#define ELF_MACHINE_CODE EM_68K |
@@ -4855,6 +4869,8 @@ elf_m68k_plt_sym_val (bfd_vma i, const asection *plt, |
#define elf_backend_reloc_type_class elf32_m68k_reloc_type_class |
#define elf_backend_plt_sym_val elf_m68k_plt_sym_val |
#define elf_backend_object_p elf32_m68k_object_p |
+#define elf_backend_grok_prstatus elf_m68k_grok_prstatus |
+#define elf_backend_grok_psinfo elf_m68k_grok_psinfo |
#define elf_backend_can_gc_sections 1 |
#define elf_backend_can_refcount 1 |