binutils-gdb/bfd/nlm32-ppc.c

987 lines
30 KiB
C
Raw Normal View History

1999-05-03 09:29:11 +02:00
/* Support for 32-bit PowerPC NLM (NetWare Loadable Module)
2005-04-21 09:45:39 +02:00
Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004,
2005 Free Software Foundation, Inc.
1999-05-03 09:29:11 +02:00
2005-04-21 09:45:39 +02:00
This file is part of BFD, the Binary File Descriptor library.
1999-05-03 09:29:11 +02:00
2005-04-21 09:45:39 +02:00
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
1999-05-03 09:29:11 +02:00
2005-04-21 09:45:39 +02:00
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
1999-05-03 09:29:11 +02:00
2005-04-21 09:45:39 +02:00
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
1999-05-03 09:29:11 +02:00
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
/* The format of a PowerPC NLM changed. Define OLDFORMAT to get the
old format. */
#define ARCH_SIZE 32
#include "nlm/ppc-ext.h"
#define Nlm_External_Fixed_Header Nlm32_powerpc_External_Fixed_Header
#include "libnlm.h"
#ifdef OLDFORMAT
/* The prefix header is only used in the old format. */
/* PowerPC NLM's have a prefix header before the standard NLM. This
function reads it in, verifies the version, and seeks the bfd to
the location before the regular NLM header. */
static bfd_boolean
2005-04-21 09:45:39 +02:00
nlm_powerpc_backend_object_p (bfd *abfd)
1999-05-03 09:29:11 +02:00
{
struct nlm32_powerpc_external_prefix_header s;
2005-04-21 09:45:39 +02:00
if (bfd_bread (& s, (bfd_size_type) sizeof s, abfd) != sizeof s)
return FALSE;
1999-05-03 09:29:11 +02:00
if (memcmp (s.signature, NLM32_POWERPC_SIGNATURE, sizeof s.signature) != 0
|| H_GET_32 (abfd, s.headerVersion) != NLM32_POWERPC_HEADER_VERSION)
return FALSE;
1999-05-03 09:29:11 +02:00
return TRUE;
1999-05-03 09:29:11 +02:00
}
/* Write out the prefix. */
static bfd_boolean
2005-04-21 09:45:39 +02:00
nlm_powerpc_write_prefix (bfd *abfd)
1999-05-03 09:29:11 +02:00
{
struct nlm32_powerpc_external_prefix_header s;
memset (&s, 0, sizeof s);
memcpy (s.signature, NLM32_POWERPC_SIGNATURE, sizeof s.signature);
H_PUT_32 (abfd, NLM32_POWERPC_HEADER_VERSION, s.headerVersion);
H_PUT_32 (abfd, 0, s.origins);
1999-05-03 09:29:11 +02:00
/* FIXME: What should we do about the date? */
2005-04-21 09:45:39 +02:00
if (bfd_bwrite (& s, (bfd_size_type) sizeof s, abfd) != sizeof s)
return FALSE;
1999-05-03 09:29:11 +02:00
return TRUE;
1999-05-03 09:29:11 +02:00
}
/* This reloc handling is only applicable to the old format. */
/* How to process the various reloc types. PowerPC NLMs use XCOFF
reloc types, and I have just copied the XCOFF reloc table here. */
static reloc_howto_type nlm_powerpc_howto_table[] =
{
/* Standard 32 bit relocation. */
2005-04-21 09:45:39 +02:00
HOWTO (0, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
32, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_POS", /* Name. */
TRUE, /* Partial_inplace. */
0xffffffff, /* Source mask. */
0xffffffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* 32 bit relocation, but store negative value. */
2005-04-21 09:45:39 +02:00
HOWTO (1, /* Type. */
0, /* Rightshift. */
-2, /* Size (0 = byte, 1 = short, 2 = long). */
32, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_NEG", /* Name. */
TRUE, /* Partial_inplace. */
0xffffffff, /* Source mask. */
0xffffffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* 32 bit PC relative relocation. */
2005-04-21 09:45:39 +02:00
HOWTO (2, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
32, /* Bitsize. */
TRUE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_signed, /* Complain_on_overflow. */
0, /* Special_function. */
"R_REL", /* Name. */
TRUE, /* Partial_inplace. */
0xffffffff, /* Source mask. */
0xffffffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* 16 bit TOC relative relocation. */
2005-04-21 09:45:39 +02:00
HOWTO (3, /* Type. */
0, /* Rightshift. */
1, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_signed, /* Complain_on_overflow. */
0, /* Special_function. */
"R_TOC", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* I don't really know what this is. */
2005-04-21 09:45:39 +02:00
HOWTO (4, /* Type. */
1, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
32, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_RTB", /* Name. */
TRUE, /* Partial_inplace. */
0xffffffff, /* Source mask. */
0xffffffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* External TOC relative symbol. */
2005-04-21 09:45:39 +02:00
HOWTO (5, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_GL", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* Local TOC relative symbol. */
2005-04-21 09:45:39 +02:00
HOWTO (6, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_TCL", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
{ 7 },
1999-05-03 09:29:11 +02:00
/* Non modifiable absolute branch. */
2005-04-21 09:45:39 +02:00
HOWTO (8, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
26, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_BA", /* Name. */
TRUE, /* Partial_inplace. */
0x3fffffc, /* Source mask. */
0x3fffffc, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
{ 9 },
/* Non modifiable relative branch. */
2005-04-21 09:45:39 +02:00
HOWTO (0xa, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
26, /* Bitsize. */
TRUE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_signed, /* Complain_on_overflow. */
0, /* Special_function. */
"R_BR", /* Name. */
TRUE, /* Partial_inplace. */
0x3fffffc, /* Source mask. */
0x3fffffc, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
{ 0xb },
/* Indirect load. */
2005-04-21 09:45:39 +02:00
HOWTO (0xc, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_RL", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* Load address. */
2005-04-21 09:45:39 +02:00
HOWTO (0xd, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_RLA", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
{ 0xe },
1999-05-03 09:29:11 +02:00
/* Non-relocating reference. */
2005-04-21 09:45:39 +02:00
HOWTO (0xf, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
32, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_REF", /* Name. */
FALSE, /* Partial_inplace. */
0, /* Source mask. */
0, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
{ 0x10 },
{ 0x11 },
1999-05-03 09:29:11 +02:00
/* TOC relative indirect load. */
2005-04-21 09:45:39 +02:00
HOWTO (0x12, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_TRL", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* TOC relative load address. */
2005-04-21 09:45:39 +02:00
HOWTO (0x13, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_TRLA", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* Modifiable relative branch. */
2005-04-21 09:45:39 +02:00
HOWTO (0x14, /* Type. */
1, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
32, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_RRTBI", /* Name. */
TRUE, /* Partial_inplace. */
0xffffffff, /* Source mask. */
0xffffffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* Modifiable absolute branch. */
2005-04-21 09:45:39 +02:00
HOWTO (0x15, /* Type. */
1, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
32, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_RRTBA", /* Name. */
TRUE, /* Partial_inplace. */
0xffffffff, /* Source mask. */
0xffffffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* Modifiable call absolute indirect. */
2005-04-21 09:45:39 +02:00
HOWTO (0x16, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_CAI", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* Modifiable call relative. */
2005-04-21 09:45:39 +02:00
HOWTO (0x17, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_REL", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* Modifiable branch absolute. */
2005-04-21 09:45:39 +02:00
HOWTO (0x18, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_RBA", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* Modifiable branch absolute. */
2005-04-21 09:45:39 +02:00
HOWTO (0x19, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_RBAC", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* Modifiable branch relative. */
2005-04-21 09:45:39 +02:00
HOWTO (0x1a, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
26, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_signed, /* Complain_on_overflow. */
0, /* Special_function. */
"R_REL", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE), /* PC rel offset. */
1999-05-03 09:29:11 +02:00
/* Modifiable branch absolute. */
2005-04-21 09:45:39 +02:00
HOWTO (0x1b, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
16, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"R_REL", /* Name. */
TRUE, /* Partial_inplace. */
0xffff, /* Source mask. */
0xffff, /* Dest mask. */
FALSE) /* PC rel offset. */
1999-05-03 09:29:11 +02:00
};
#define HOWTO_COUNT (sizeof nlm_powerpc_howto_table \
/ sizeof nlm_powerpc_howto_table[0])
/* Read a PowerPC NLM reloc. */
static bfd_boolean
2005-04-21 09:45:39 +02:00
nlm_powerpc_read_reloc (bfd *abfd,
nlmNAME (symbol_type) *sym,
asection **secp,
arelent *rel)
1999-05-03 09:29:11 +02:00
{
struct nlm32_powerpc_external_reloc ext;
bfd_vma l_vaddr;
unsigned long l_symndx;
int l_rtype;
int l_rsecnm;
asection *code_sec, *data_sec, *bss_sec;
/* Read the reloc from the file. */
if (bfd_bread (&ext, (bfd_size_type) sizeof ext, abfd) != sizeof ext)
return FALSE;
1999-05-03 09:29:11 +02:00
/* Swap in the fields. */
l_vaddr = H_GET_32 (abfd, ext.l_vaddr);
l_symndx = H_GET_32 (abfd, ext.l_symndx);
l_rtype = H_GET_16 (abfd, ext.l_rtype);
l_rsecnm = H_GET_16 (abfd, ext.l_rsecnm);
1999-05-03 09:29:11 +02:00
/* Get the sections now, for convenience. */
code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME);
data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME);
bss_sec = bfd_get_section_by_name (abfd, NLM_UNINITIALIZED_DATA_NAME);
/* Work out the arelent fields. */
if (sym != NULL)
2005-04-21 09:45:39 +02:00
/* This is an import. sym_ptr_ptr is filled in by
nlm_canonicalize_reloc. */
rel->sym_ptr_ptr = NULL;
1999-05-03 09:29:11 +02:00
else
{
asection *sec;
if (l_symndx == 0)
sec = code_sec;
else if (l_symndx == 1)
sec = data_sec;
else if (l_symndx == 2)
sec = bss_sec;
else
{
bfd_set_error (bfd_error_bad_value);
return FALSE;
1999-05-03 09:29:11 +02:00
}
rel->sym_ptr_ptr = sec->symbol_ptr_ptr;
}
rel->addend = 0;
BFD_ASSERT ((l_rtype & 0xff) < HOWTO_COUNT);
rel->howto = nlm_powerpc_howto_table + (l_rtype & 0xff);
BFD_ASSERT (rel->howto->name != NULL
&& ((l_rtype & 0x8000) != 0
? (rel->howto->complain_on_overflow
== complain_overflow_signed)
: (rel->howto->complain_on_overflow
== complain_overflow_bitfield))
&& ((l_rtype >> 8) & 0x1f) == rel->howto->bitsize - 1);
if (l_rsecnm == 0)
*secp = code_sec;
else if (l_rsecnm == 1)
{
*secp = data_sec;
bfd/ * section.c (struct sec): Rename "_cooked_size" to "size". Rename "_raw_size" to "rawsize". (STD_SECTION): Adjust comments. (bfd_set_section_size, bfd_get_section_contents): Use size. (bfd_malloc_and_get_section): New function. * bfd-in.h (bfd_section_size, bfd_get_section_size): Use size. * coff-sh.c (sh_relax_section): Alloc coff_section_data struct early. Correctly free reloc and contents memory. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Delete FIXME and fake CIE now that we can shink section size to zero. (_bfd_elf_write_section_eh_frame): Likewise.. * elf32-ppc.c (ppc_elf_relax_section): Delay reading section contents. * elf-m10300.c (mn10300_elf_final_link_relocate): Don't use _bfd_stab_section_offset. Use _bfd_elf_section_offset. * stabs.c (_bfd_stab_section_offset_): Remove unused args and unneeded indirection. * elf.c (_bfd_elf_section_offset): .. and update call. * libbfd-in.h (_bfd_stab_section_offset): Update prototype. * libbfd.h: Regenerate. * bfd-in2.h: Regenerate. Replace occurrences of "_raw_size" and "_cooked_size" in most places with "size". Set new "rawsize" for stabs, eh_frame, and SEC_MERGE sections. Use "rawsize", if non-zero, for bfd_get_section_contents calls if the section might be a stabs, eh_frame, or SEC_MERGE section. Similarly use "rawsize", if non-zero, in reloc functions to validate reloc addresses. Use new bfd_malloc_and_get_section in most places where bfd_get_section_contents was called. Expand all occurrences of bfd_section_size and bfd_get_section_size. Rename "raw_size" var in grok_prstatus and similar functions to "size". * aix386-core.c (aix386_core_file_p): .. * aix5ppc-core.c (xcoff64_core_p): .. * aout-adobe.c (aout_adobe_callback, aout_adobe_write_object_contents, aout_adobe_set_section_contents): .. * aout-target.h (callback): .. * aout-tic30.c (tic30_aout_callback, tic30_aout_final_link_relocate, MY_bfd_final_link): .. * aoutf1.h (sunos4_core_file_p): .. * aoutx.h (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, translate_from_native_sym_flags, final_link, aout_link_input_section): .. * binary.c (binary_object_p, binary_canonicalize_symtab, binary_set_section_contents): .. * bout.c (b_out_callback, b_out_write_object_contents, b_out_set_section_contents, b_out_bfd_relax_section, b_out_bfd_get_relocated_section_contents): .. * cisco-core.c (cisco_core_file_validate): .. * coff-alpha.c (alpha_ecoff_object_p, alpha_ecoff_get_relocated_section_conten, alpha_relocate_section): .. * coff-arm.c (coff_arm_relocate_section, bfd_arm_allocate_interworking_sections): .. * coff-h8300.c (h8300_reloc16_extra_cases, h8300_bfd_link_add_symbols): .. * coff-mips.c (mips_refhi_reloc, mips_gprel_reloc): .. * coff-ppc.c (coff_ppc_relocate_section, ppc_allocate_toc_section, ppc_bfd_coff_final_link): .. * coff-rs6000.c (xcoff_reloc_type_br, xcoff_ppc_relocate_section): .. * coff-sh.c (sh_relax_section, sh_relax_delete_bytes, sh_align_loads, sh_coff_get_relocated_section_contents): .. * coff64-rs6000.c (xcoff64_write_object_contents, xcoff64_reloc_type_br, xcoff64_ppc_relocate_section): .. * coffcode.h (coff_compute_section_file_positions, coff_write_object_contents): .. * coffgen.c (make_a_section_from_file, coff_write_symbols, coff_section_symbol, build_debug_section): .. * cofflink.c (coff_link_add_symbols, _bfd_coff_final_link, process_embedded_commands, _bfd_coff_link_input_bfd, _bfd_coff_write_global_sym): .. * cpu-arm.c (bfd_arm_update_notes, bfd_arm_get_mach_from_notes): .. * cpu-ns32k.c (do_ns32k_reloc, _bfd_ns32k_final_link_relocate): .. * dwarf1.c (parse_line_table, _bfd_dwarf1_find_nearest_line): .. * dwarf2.c (read_indirect_string, read_abbrevs, decode_line_info, _bfd_dwarf2_find_nearest_line): .. * ecoff.c (bfd_debug_section, ecoff_set_symbol_info, ecoff_compute_section_file_positions, _bfd_ecoff_write_object_contents, ecoff_indirect_link_order): .. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame, _bfd_elf_discard_section_eh_frame_hdr, _bfd_elf_maybe_strip_eh_frame_hdr, _bfd_elf_eh_frame_section_offset, _bfd_elf_write_section_eh_frame, _bfd_elf_write_section_eh_frame_hdr): .. * elf-hppa.h (elf_hppa_sort_unwind): .. * elf-m10200.c (mn10200_elf_relax_section, mn10200_elf_relax_delete_bytes, mn10200_elf_get_relocated_section_contents): .. * elf-m10300.c (_bfd_mn10300_elf_create_got_section, mn10300_elf_check_relocs, mn10300_elf_relax_section, mn10300_elf_relax_delete_bytes, mn10300_elf_get_relocated_section_contents, _bfd_mn10300_elf_adjust_dynamic_symbol, _bfd_mn10300_elf_discard_copies, _bfd_mn10300_elf_size_dynamic_sections, _bfd_mn10300_elf_finish_dynamic_sections): .. * elf.c (_bfd_elf_print_private_bfd_data, bfd_elf_get_bfd_needed_list, _bfd_elf_make_section_from_phdr, elf_fake_sections, bfd_elf_set_group_contents, map_sections_to_segments, elf_sort_sections, assign_file_positions_for_segments, SECTION_SIZE, copy_private_bfd_data, _bfd_elf_get_dynamic_reloc_upper_bound, _bfd_elf_canonicalize_dynamic_reloc, elfcore_maybe_make_sect, _bfd_elfcore_make_pseudosection, elfcore_grok_prstatus, elfcore_grok_lwpstatus, elfcore_grok_win32pstatus, elfcore_grok_note, elfcore_grok_nto_status, elfcore_grok_nto_gregs, _bfd_elf_rel_local_sym, _bfd_elf_get_synthetic_symtab): .. * elf32-arm.h (bfd_elf32_arm_allocate_interworking_sect, bfd_elf32_arm_process_before_allocation, elf32_arm_adjust_dynamic_symbol, allocate_dynrelocs, elf32_arm_size_dynamic_sections, elf32_arm_finish_dynamic_sections, elf32_arm_write_section): .. * elf32-cris.c (cris_elf_grok_prstatus, elf_cris_finish_dynamic_sections, cris_elf_gc_sweep_hook, elf_cris_adjust_gotplt_to_got, elf_cris_adjust_dynamic_symbol, cris_elf_check_relocs, elf_cris_size_dynamic_sections, elf_cris_discard_excess_dso_dynamics, elf_cris_discard_excess_program_dynamics): .. * elf32-d30v.c (bfd_elf_d30v_reloc, bfd_elf_d30v_reloc_21): .. * elf32-dlx.c (_bfd_dlx_elf_hi16_reloc): .. * elf32-frv.c (_frvfdpic_add_dyn_reloc, _frvfdpic_add_rofixup, _frv_create_got_section, _frvfdpic_assign_plt_entries, elf32_frvfdpic_size_dynamic_sections, elf32_frvfdpic_modify_segment_map, elf32_frvfdpic_finish_dynamic_sections): .. * elf32-h8300.c (elf32_h8_relax_section, elf32_h8_relax_delete_bytes, elf32_h8_get_relocated_section_contents): .. * elf32-hppa.c (hppa_build_one_stub, hppa_size_one_stub, elf32_hppa_adjust_dynamic_symbol, allocate_plt_static, allocate_dynrelocs, elf32_hppa_size_dynamic_sections, group_sections, elf32_hppa_size_stubs, elf32_hppa_set_gp, elf32_hppa_build_stubs, elf32_hppa_finish_dynamic_sections): .. * elf32-i370.c (i370_elf_adjust_dynamic_symbol, i370_elf_size_dynamic_sections, i370_elf_check_relocs, i370_elf_finish_dynamic_sections): .. * elf32-i386.c (elf_i386_grok_prstatus, elf_i386_adjust_dynamic_symbol, allocate_dynrelocs, elf_i386_size_dynamic_sections, elf_i386_relocate_section, elf_i386_finish_dynamic_sections): .. * elf32-i860.c (i860_howto_pc26_reloc, i860_howto_pc16_reloc, i860_howto_highadj_reloc, i860_howto_splitn_reloc): .. * elf32-ip2k.c (ip2k_is_switch_table_128, ip2k_relax_switch_table_128, ip2k_is_switch_table_256, ip2k_relax_switch_table_256, ip2k_elf_relax_section, adjust_all_relocations, ip2k_elf_relax_delete_bytes): .. * elf32-m32r.c (m32r_elf_do_10_pcrel_reloc, m32r_elf_hi16_reloc, m32r_elf_generic_reloc, m32r_elf_adjust_dynamic_symbol, allocate_dynrelocs, m32r_elf_size_dynamic_sections, m32r_elf_relocate_section, m32r_elf_finish_dynamic_sections, m32r_elf_relax_section, m32r_elf_relax_delete_bytes, m32r_elf_get_relocated_section_contents): .. * elf32-m68hc11.c (m68hc11_elf_build_one_stub, m68hc11_elf_size_one_stub, m68hc11_elf_relax_section, m68hc11_elf_relax_delete_bytes): .. * elf32-m68hc12.c (m68hc12_elf_build_one_stub, m68hc12_elf_size_one_stub): .. * elf32-m68hc1x.c (elf32_m68hc11_size_stubs, elf32_m68hc11_build_stubs, m68hc11_elf_special_reloc): .. * elf32-m68k.c (elf_m68k_check_relocs, elf_m68k_gc_sweep_hook, elf_m68k_adjust_dynamic_symbol, elf_m68k_size_dynamic_sections, elf_m68k_discard_copies, elf_m68k_finish_dynamic_sections): .. * elf32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elf32-or32.c (or32_elf_consth_reloc): .. * elf32-ppc.c (ppc_elf_relax_section, ppc_elf_addr16_ha_reloc, elf_create_pointer_linker_section, ppc_elf_create_linker_section, ppc_elf_additional_program_headers, ppc_elf_adjust_dynamic_symbol, allocate_dynrelocs, ppc_elf_size_dynamic_sections, ppc_elf_finish_dynamic_sections, ppc_elf_grok_prstatus, ppc_elf_final_write_processing): .. * elf32-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections, elf_s390_grok_prstatus): .. * elf32-sh.c (sh_elf_reloc_loop, sh_elf_relax_section, sh_elf_relax_delete_bytes, sh_elf_align_loads, sh_elf_adjust_dynamic_symbol, allocate_dynrelocs, sh_elf_size_dynamic_sections, sh_elf_get_relocated_section_contents, sh_elf_finish_dynamic_sections, elf32_shlin_grok_prstatus): .. * elf32-sh64-com.c (sh64_address_in_cranges, sh64_get_contents_type): .. * elf32-sh64.c (sh64_find_section_for_address, sh64_elf_final_write_processing): .. * elf32-sparc.c (sparc_elf_wdisp16_reloc, sparc_elf_hix22_reloc, sparc_elf_lox10_reloc, elf32_sparc_adjust_dynamic_symbol, allocate_dynrelocs, elf32_sparc_size_dynamic_sections, elf32_sparc_relocate_section, elf32_sparc_finish_dynamic_sections): .. * elf32-v850.c (v850_elf_reloc, v850_elf_relax_section): .. * elf32-vax.c (elf_vax_check_relocs, elf_vax_adjust_dynamic_symbol, elf_vax_size_dynamic_sections, elf_vax_discard_copies, elf_vax_instantiate_got_entries, elf_vax_relocate_section, elf_vax_finish_dynamic_sections): .. * elf32-xstormy16.c (xstormy16_elf_24_reloc, xstormy16_elf_check_relocs, xstormy16_relax_plt_check, xstormy16_elf_relax_section, xstormy16_elf_always_size_sections, xstormy16_elf_finish_dynamic_sections): .. * elf32-xtensa.c (xtensa_read_table_entries, elf_xtensa_allocate_got_size, elf_xtensa_allocate_local_got_size, elf_xtensa_size_dynamic_sections, elf_xtensa_do_reloc, bfd_elf_xtensa_reloc, elf_xtensa_relocate_section, elf_xtensa_combine_prop_entries, elf_xtensa_finish_dynamic_sections, elf_xtensa_discard_info_for_section, elf_xtensa_grok_prstatus, get_relocation_opcode, retrieve_contents, find_relaxable_sections, collect_source_relocs, is_resolvable_asm_expansion, remove_literals, relax_section, shrink_dynamic_reloc_sections, relax_property_section, xtensa_callback_required_dependence): .. * elf64-alpha.c (elf64_alpha_reloc_gpdisp, elf64_alpha_relax_section, elf64_alpha_check_relocs, elf64_alpha_adjust_dynamic_symbol, elf64_alpha_calc_got_offsets_for_symbol, elf64_alpha_calc_got_offsets, elf64_alpha_size_plt_section, elf64_alpha_size_plt_section_1, elf64_alpha_always_size_sections, elf64_alpha_calc_dynrel_sizes, elf64_alpha_size_rela_got_section, elf64_alpha_size_rela_got_1, elf64_alpha_size_dynamic_sections, elf64_alpha_emit_dynrel, elf64_alpha_finish_dynamic_sections, elf64_alpha_final_link): .. * elf64-hppa.c (allocate_dynrel_entries, elf64_hppa_size_dynamic_sections, elf64_hppa_finish_dynamic_sections): .. * elf64-mips.c (mips_elf64_gprel32_reloc, mips16_gprel_reloc, mips_elf64_canonicalize_dynamic_reloc, mips_elf64_slurp_reloc_table, elf64_mips_grok_prstatus): .. * elf64-mmix.c (mmix_elf_perform_relocation, mmix_elf_reloc, mmix_elf_relocate_section, mmix_elf_final_link, mmix_set_relaxable_size, _bfd_mmix_after_linker_allocation, mmix_elf_relax_section, mmix_elf_get_section_contents): .. * elf64-ppc.c (ppc64_elf_object_p, ppc64_elf_grok_prstatus, ppc64_elf_check_relocs, ppc64_elf_func_desc_adjust, ppc64_elf_adjust_dynamic_symbol, ppc64_elf_edit_opd, allocate_dynrelocs, ppc64_elf_size_dynamic_sections, ppc_build_one_stub, ppc_size_one_stub, ppc64_elf_next_toc_section, toc_adjusting_stub_needed, group_sections, ppc64_elf_size_stubs, ppc64_elf_build_stubs, ppc64_elf_relocate_section, ppc64_elf_finish_dynamic_sections): .. * elf64-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections): .. * elf64-sh64.c (sh_elf64_get_relocated_section_contents, sh_elf64_check_relocs, sh64_elf64_adjust_dynamic_symbol, sh64_elf64_discard_copies, sh64_elf64_size_dynamic_sections, sh64_elf64_finish_dynamic_sections): .. * elf64-sparc.c (sparc64_elf_slurp_reloc_table, init_insn_reloc, sparc64_elf_check_relocs, sparc64_elf_adjust_dynamic_symbol, sparc64_elf_size_dynamic_sections, sparc64_elf_relocate_section, sparc64_elf_finish_dynamic_symbol, sparc64_elf_finish_dynamic_sections): .. * elf64-x86-64.c (elf64_x86_64_grok_prstatus, elf64_x86_64_adjust_dynamic_symbol, allocate_dynrelocs, elf64_x86_64_size_dynamic_sections, elf64_x86_64_relocate_section, elf64_x86_64_finish_dynamic_sections): .. * elfarm-nabi.c (elf32_arm_nabi_grok_prstatus): .. * elfcode.h (elf_slurp_reloc_table): .. * elflink.c (_bfd_elf_create_got_section, elf_add_dt_needed_tag, elf_finalize_dynstr, elf_link_add_object_symbols, bfd_elf_size_dynamic_sections, elf_link_sort_relocs, elf_link_input_bfd, bfd_elf_final_link, bfd_elf_discard_info): .. * elfn32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elfxx-ia64.c (elfNN_ia64_relax_section, allocate_dynrel_entries, elfNN_ia64_size_dynamic_sections, elfNN_ia64_install_dyn_reloc, elfNN_ia64_choose_gp, elfNN_ia64_final_link, elfNN_ia64_finish_dynamic_sections): .. * elfxx-mips.c (mips_elf_create_procedure_table, mips_elf_check_mips16_stubs, _bfd_mips_elf_gprel16_with_gp, _bfd_mips_elf_hi16_reloc, _bfd_mips_elf_generic_reloc, mips_elf_global_got_index, mips_elf_multi_got, mips_elf_create_compact_rel_section, mips_elf_calculate_relocation, mips_elf_allocate_dynamic_relocations, mips_elf_create_dynamic_relocation, _bfd_mips_elf_fake_sections, _bfd_mips_relax_section, _bfd_mips_elf_adjust_dynamic_symbol, _bfd_mips_elf_always_size_sections, _bfd_mips_elf_size_dynamic_sections, _bfd_mips_elf_finish_dynamic_symbol, _bfd_mips_elf_finish_dynamic_sections, _bfd_mips_elf_modify_segment_map, _bfd_mips_elf_discard_info, _bfd_mips_elf_write_section, _bfd_mips_elf_set_section_contents, _bfd_elf_mips_get_relocated_section_contents, _bfd_mips_elf_final_link, _bfd_mips_elf_merge_private_bfd_data): .. * hp300hpux.c (callback): .. * hppabsd-core.c (make_bfd_asection): .. * hpux-core.c (make_bfd_asection): .. * i386linux.c (linux_link_create_dynamic_sections, bfd_i386linux_size_dynamic_sections, linux_finish_dynamic_link): .. * i386msdos.c (msdos_write_object_contents): .. * i386os9k.c (os9k_callback, os9k_write_object_contents, os9k_set_section_contents): .. * ieee.c (parse_expression, ieee_slurp_external_symbols, ieee_slurp_sections, ieee_slurp_debug, ieee_slurp_section_data, ieee_write_section_part, do_with_relocs, do_as_repeat, do_without_relocs, ieee_write_debug_part, init_for_output, ieee_set_section_contents): .. * ihex.c (ihex_scan, ihex_read_section, ihex_get_section_contents): .. * irix-core.c (do_sections, make_bfd_asection): .. * libaout.h (aout_section_merge_with_text_p): .. * libbfd.c (_bfd_generic_get_section_contents, _bfd_generic_get_section_contents_in_window): .. * linker.c (default_indirect_link_order): .. * lynx-core.c (make_bfd_asection): .. * m68klinux.c (linux_link_create_dynamic_sections, bfd_m68klinux_size_dynamic_sections, linux_finish_dynamic_link): .. * mach-o.c (bfd_mach_o_make_bfd_section, bfd_mach_o_scan_read_dylinker, bfd_mach_o_scan_read_dylib, bfd_mach_o_scan_read_thread, bfd_mach_o_scan_read_symtab, bfd_mach_o_scan_read_segment): .. * merge.c (_bfd_add_merge_section, record_section, merge_strings, _bfd_merge_sections): .. * mmo.c (mmo_find_sec_w_addr, mmo_get_spec_section, mmo_get_loc, mmo_map_set_sizes, mmo_canonicalize_symtab, mmo_internal_write_section, mmo_write_object_contents): .. * netbsd-core.c (netbsd_core_file_p): .. * nlm32-alpha.c (nlm_alpha_read_reloc, nlm_alpha_write_import, nlm_alpha_set_public_section): .. * nlm32-ppc.c (nlm_powerpc_read_reloc, nlm_powerpc_write_reloc): .. * nlm32-sparc.c (nlm_sparc_write_import): .. * nlmcode.h (add_bfd_section, nlm_swap_auxiliary_headers_in, nlm_compute_section_file_positions): .. * oasys.c (oasys_object_p, oasys_slurp_section_data, oasys_write_sections, oasys_write_data, oasys_set_section_contents): .. * opncls.c (get_debug_link_info): .. * osf-core.c (make_bfd_asection): .. * pdp11.c (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, squirt_out_relocs, final_link, aout_link_input_section): .. * peXXigen.c (_bfd_XXi_swap_sym_in, _bfd_XXi_swap_aouthdr_out, pe_print_idata, pe_print_edata, pe_print_pdata, pe_print_reloc): .. * pef.c (bfd_pef_make_bfd_section, bfd_pef_print_loader_section, bfd_pef_scan_start_address, bfd_pef_parse_symbols): .. * ppcboot.c (ppcboot_object_p, ppcboot_canonicalize_symtab): .. * ptrace-core.c (ptrace_unix_core_file_p): .. * reloc.c (bfd_perform_relocation, bfd_install_relocation, _bfd_final_link_relocate, bfd_generic_relax_section, bfd_generic_get_relocated_section_contents): .. * reloc16.c (bfd_coff_reloc16_relax_section, bfd_coff_reloc16_get_relocated_section_c): .. * riscix.c (riscix_some_aout_object_p): .. * rs6000-core.c (read_hdr, make_bfd_asection): .. * sco5-core.c (make_bfd_asection): .. * simple.c (bfd_simple_get_relocated_section_contents): .. * som.c (som_object_setup, setup_sections, som_prep_headers, som_write_fixups, som_begin_writing, bfd_section_from_som_symbol, som_set_reloc_info, som_get_section_contents, som_bfd_link_split_section): .. * sparclinux.c (linux_link_create_dynamic_sections, bfd_sparclinux_size_dynamic_sections, linux_finish_dynamic_link): .. * srec.c (srec_scan, srec_read_section, srec_get_section_contents): .. * stabs.c (_bfd_link_section_stabs, _bfd_discard_section_stabs, _bfd_write_stab_strings, _bfd_stab_section_offset): .. * sunos.c (sunos_read_dynamic_info, sunos_create_dynamic_sections, bfd_sunos_size_dynamic_sections, sunos_scan_std_relocs, sunos_scan_ext_relocs, sunos_scan_dynamic_symbol, sunos_write_dynamic_symbol, sunos_check_dynamic_reloc, sunos_finish_dynamic_link): .. * syms.c (_bfd_stab_section_find_nearest_line): .. * tekhex.c (first_phase, tekhex_set_section_contents, tekhex_write_object_contents): .. * trad-core.c (trad_unix_core_file_p): .. * versados.c (process_esd, process_otr, process_otr): .. * vms-gsd.c (_bfd_vms_slurp_gsd, _bfd_vms_write_gsd): .. * vms-misc.c (add_new_contents): .. * vms-tir.c (check_section, new_section, _bfd_vms_write_tir): .. * vms.c (vms_set_section_contents): .. * xcofflink.c (xcoff_get_section_contents, xcoff_link_add_symbols, xcoff_sweep, bfd_xcoff_size_dynamic_sections, xcoff_build_ldsyms, _bfd_xcoff_bfd_final_link, xcoff_link_input_bfd): .. * xsym.c (bfd_sym_scan): .. See above. binutils/ * objcopy.c (copy_section): Don't set _cooked_size. include/ * bfdlink.h (struct bfd_link_order): Update comment. ld/ * ldlang.c (print_output_section_statement): Don't print size before relaxation. (IGNORE_SECTION): Remove bfd arg. Update all callers. * ldexp.c (fold_name): .. See below. * ldlang.c (section_already_linked, print_output_section_statement, print_input_section, insert_pad, size_input_section, lang_check_section_addresses, lang_size_sections_1, lang_size_sections, lang_do_assignments_1, lang_set_startof, lang_one_common, lang_reset_memory_regions, lang_process, lang_abs_symbol_at_end_of, lang_do_version_exports_section): .. * ldwrite.c (build_link_order, clone_section, ds, split_sections): .. * pe-dll.c (process_def_file, generate_reloc): .. * emultempl/elf32.em (gld${EMULATION_NAME}_find_statement_assignment, gld${EMULATION_NAME}_before_allocation): .. * emultempl/mmix-elfnmmo.em (mmix_after_allocation): .. * emultempl/sh64elf.em (sh64_elf_${EMULATION_NAME}_before_allocation, sh64_elf_${EMULATION_NAME}_after_allocation): .. * emultempl/sunos.em (gld${EMULATION_NAME}_before_allocation): .. * emultempl/xtensaelf.em (ld_assign_relative_paged_dot, ld_local_file_relocations_fit, ld_xtensa_insert_page_offsets): Use "size" instead of "_raw_size" and "_cooked_size". Expand bfd_section_size macro invocations.
2004-06-24 06:46:28 +02:00
l_vaddr -= code_sec->size;
1999-05-03 09:29:11 +02:00
}
else
{
bfd_set_error (bfd_error_bad_value);
return FALSE;
1999-05-03 09:29:11 +02:00
}
rel->address = l_vaddr;
return TRUE;
1999-05-03 09:29:11 +02:00
}
2005-04-21 09:45:39 +02:00
#else /* not OLDFORMAT */
/* There is only one type of reloc in a PowerPC NLM. */
static reloc_howto_type nlm_powerpc_howto =
HOWTO (0, /* Type. */
0, /* Rightshift. */
2, /* Size (0 = byte, 1 = short, 2 = long). */
32, /* Bitsize. */
FALSE, /* PC relative. */
0, /* Bitpos. */
complain_overflow_bitfield, /* Complain_on_overflow. */
0, /* Special_function. */
"32", /* Name. */
TRUE, /* Partial_inplace. */
0xffffffff, /* Source mask. */
0xffffffff, /* Dest mask. */
FALSE); /* PC rel_offset. */
/* Read a PowerPC NLM reloc. */
static bfd_boolean
nlm_powerpc_read_reloc (bfd *abfd,
nlmNAME (symbol_type) *sym,
asection **secp,
arelent *rel)
{
bfd_byte temp[4];
bfd_vma val;
const char *name;
if (bfd_bread (temp, (bfd_size_type) sizeof (temp), abfd) != sizeof (temp))
return FALSE;
val = bfd_get_32 (abfd, temp);
/* The value is a word offset into either the code or data segment.
This is the location which needs to be adjusted.
The high bit is 0 if the value is an offset into the data
segment, or 1 if the value is an offset into the text segment.
If this is a relocation fixup rather than an imported symbol (the
sym argument is NULL), then the second most significant bit is 0
if the address of the data segment should be added to the
location addressed by the value, or 1 if the address of the text
segment should be added.
If this is an imported symbol, the second most significant bit is
not used and must be 0. */
if ((val & NLM_HIBIT) == 0)
name = NLM_INITIALIZED_DATA_NAME;
else
{
name = NLM_CODE_NAME;
val &=~ NLM_HIBIT;
}
*secp = bfd_get_section_by_name (abfd, name);
if (sym == NULL)
{
if ((val & (NLM_HIBIT >> 1)) == 0)
name = NLM_INITIALIZED_DATA_NAME;
else
{
name = NLM_CODE_NAME;
val &=~ (NLM_HIBIT >> 1);
}
rel->sym_ptr_ptr = bfd_get_section_by_name (abfd, name)->symbol_ptr_ptr;
}
rel->howto = & nlm_powerpc_howto;
rel->address = val << 2;
rel->addend = 0;
return TRUE;
}
#endif /* not OLDFORMAT */
1999-05-03 09:29:11 +02:00
/* Mangle PowerPC NLM relocs for output. */
static bfd_boolean
2005-04-21 09:45:39 +02:00
nlm_powerpc_mangle_relocs (bfd *abfd ATTRIBUTE_UNUSED,
asection *sec ATTRIBUTE_UNUSED,
const void * data ATTRIBUTE_UNUSED,
bfd_vma offset ATTRIBUTE_UNUSED,
bfd_size_type count ATTRIBUTE_UNUSED)
1999-05-03 09:29:11 +02:00
{
return TRUE;
1999-05-03 09:29:11 +02:00
}
/* Read a PowerPC NLM import record */
static bfd_boolean
2005-04-21 09:45:39 +02:00
nlm_powerpc_read_import (bfd * abfd, nlmNAME (symbol_type) * sym)
1999-05-03 09:29:11 +02:00
{
2005-04-21 09:45:39 +02:00
struct nlm_relent *nlm_relocs; /* Relocation records for symbol. */
bfd_size_type rcount; /* Number of relocs. */
bfd_byte temp[NLM_TARGET_LONG_SIZE]; /* Temporary 32-bit value. */
unsigned char symlength; /* Length of symbol name. */
1999-05-03 09:29:11 +02:00
char *name;
2005-04-21 09:45:39 +02:00
if (bfd_bread (& symlength, (bfd_size_type) sizeof (symlength), abfd)
1999-05-03 09:29:11 +02:00
!= sizeof (symlength))
return FALSE;
1999-05-03 09:29:11 +02:00
sym -> symbol.the_bfd = abfd;
name = bfd_alloc (abfd, (bfd_size_type) symlength + 1);
1999-05-03 09:29:11 +02:00
if (name == NULL)
return FALSE;
if (bfd_bread (name, (bfd_size_type) symlength, abfd) != symlength)
return FALSE;
1999-05-03 09:29:11 +02:00
name[symlength] = '\0';
sym -> symbol.name = name;
sym -> symbol.flags = 0;
sym -> symbol.value = 0;
sym -> symbol.section = bfd_und_section_ptr;
2005-04-21 09:45:39 +02:00
if (bfd_bread (temp, (bfd_size_type) sizeof (temp), abfd)
!= sizeof (temp))
return FALSE;
rcount = H_GET_32 (abfd, temp);
2005-04-21 09:45:39 +02:00
nlm_relocs = bfd_alloc (abfd, rcount * sizeof (struct nlm_relent));
if (nlm_relocs == NULL)
return FALSE;
1999-05-03 09:29:11 +02:00
sym -> relocs = nlm_relocs;
sym -> rcnt = 0;
while (sym -> rcnt < rcount)
{
asection *section;
2002-06-25 08:21:54 +02:00
if (! nlm_powerpc_read_reloc (abfd, sym, &section, &nlm_relocs -> reloc))
return FALSE;
1999-05-03 09:29:11 +02:00
nlm_relocs -> section = section;
nlm_relocs++;
sym -> rcnt++;
}
return TRUE;
1999-05-03 09:29:11 +02:00
}
#ifndef OLDFORMAT
/* Write a PowerPC NLM reloc. */
static bfd_boolean
2005-04-21 09:45:39 +02:00
nlm_powerpc_write_import (bfd * abfd, asection * sec, arelent * rel)
1999-05-03 09:29:11 +02:00
{
asymbol *sym;
bfd_vma val;
bfd_byte temp[4];
/* PowerPC NetWare only supports one kind of reloc. */
if (rel->addend != 0
|| rel->howto == NULL
|| rel->howto->rightshift != 0
|| rel->howto->size != 2
|| rel->howto->bitsize != 32
|| rel->howto->bitpos != 0
|| rel->howto->pc_relative
|| (rel->howto->src_mask != 0xffffffff && rel->addend != 0)
|| rel->howto->dst_mask != 0xffffffff)
{
bfd_set_error (bfd_error_invalid_operation);
return FALSE;
1999-05-03 09:29:11 +02:00
}
sym = *rel->sym_ptr_ptr;
/* The value we write out is the offset into the appropriate
segment, rightshifted by two. This offset is the section vma,
adjusted by the vma of the lowest section in that segment, plus
the address of the relocation. */
val = bfd_get_section_vma (abfd, sec) + rel->address;
if ((val & 3) != 0)
{
bfd_set_error (bfd_error_bad_value);
return FALSE;
1999-05-03 09:29:11 +02:00
}
val >>= 2;
/* The high bit is 0 if the reloc is in the data section, or 1 if
the reloc is in the code section. */
if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
val -= nlm_get_data_low (abfd);
else
{
val -= nlm_get_text_low (abfd);
val |= NLM_HIBIT;
}
1999-05-03 09:29:11 +02:00
if (! bfd_is_und_section (bfd_get_section (sym)))
{
/* This is an internal relocation fixup. The second most
significant bit is 0 if this is a reloc against the data
segment, or 1 if it is a reloc against the text segment. */
if (bfd_get_section_flags (abfd, bfd_get_section (sym)) & SEC_CODE)
val |= NLM_HIBIT >> 1;
}
bfd_put_32 (abfd, val, temp);
if (bfd_bwrite (temp, (bfd_size_type) sizeof (temp), abfd) != sizeof (temp))
return FALSE;
1999-05-03 09:29:11 +02:00
return TRUE;
1999-05-03 09:29:11 +02:00
}
#else /* OLDFORMAT */
/* This is used for the reloc handling in the old format. */
/* Write a PowerPC NLM reloc. */
static bfd_boolean
2005-04-21 09:45:39 +02:00
nlm_powerpc_write_reloc (bfd *abfd,
asection *sec,
arelent *rel,
int indx)
1999-05-03 09:29:11 +02:00
{
struct nlm32_powerpc_external_reloc ext;
asection *code_sec, *data_sec, *bss_sec;
asymbol *sym;
asection *symsec;
unsigned long l_symndx;
int l_rtype;
int l_rsecnm;
reloc_howto_type *howto;
bfd_size_type address;
/* Get the sections now, for convenience. */
code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME);
data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME);
bss_sec = bfd_get_section_by_name (abfd, NLM_UNINITIALIZED_DATA_NAME);
sym = *rel->sym_ptr_ptr;
symsec = bfd_get_section (sym);
if (indx != -1)
{
BFD_ASSERT (bfd_is_und_section (symsec));
l_symndx = indx + 3;
}
else
{
if (symsec == code_sec)
l_symndx = 0;
else if (symsec == data_sec)
l_symndx = 1;
else if (symsec == bss_sec)
l_symndx = 2;
else
{
bfd_set_error (bfd_error_bad_value);
return FALSE;
1999-05-03 09:29:11 +02:00
}
}
H_PUT_32 (abfd, l_symndx, ext.l_symndx);
1999-05-03 09:29:11 +02:00
for (howto = nlm_powerpc_howto_table;
howto < nlm_powerpc_howto_table + HOWTO_COUNT;
howto++)
{
if (howto->rightshift == rel->howto->rightshift
&& howto->size == rel->howto->size
&& howto->bitsize == rel->howto->bitsize
&& howto->pc_relative == rel->howto->pc_relative
&& howto->bitpos == rel->howto->bitpos
&& (howto->partial_inplace == rel->howto->partial_inplace
|| (! rel->howto->partial_inplace
&& rel->addend == 0))
&& (howto->src_mask == rel->howto->src_mask
|| (rel->howto->src_mask == 0
&& rel->addend == 0))
&& howto->dst_mask == rel->howto->dst_mask
&& howto->pcrel_offset == rel->howto->pcrel_offset)
break;
}
if (howto >= nlm_powerpc_howto_table + HOWTO_COUNT)
{
bfd_set_error (bfd_error_bad_value);
return FALSE;
1999-05-03 09:29:11 +02:00
}
l_rtype = howto->type;
if (howto->complain_on_overflow == complain_overflow_signed)
l_rtype |= 0x8000;
l_rtype |= (howto->bitsize - 1) << 8;
H_PUT_16 (abfd, l_rtype, ext.l_rtype);
1999-05-03 09:29:11 +02:00
address = rel->address;
if (sec == code_sec)
l_rsecnm = 0;
else if (sec == data_sec)
{
l_rsecnm = 1;
bfd/ * section.c (struct sec): Rename "_cooked_size" to "size". Rename "_raw_size" to "rawsize". (STD_SECTION): Adjust comments. (bfd_set_section_size, bfd_get_section_contents): Use size. (bfd_malloc_and_get_section): New function. * bfd-in.h (bfd_section_size, bfd_get_section_size): Use size. * coff-sh.c (sh_relax_section): Alloc coff_section_data struct early. Correctly free reloc and contents memory. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Delete FIXME and fake CIE now that we can shink section size to zero. (_bfd_elf_write_section_eh_frame): Likewise.. * elf32-ppc.c (ppc_elf_relax_section): Delay reading section contents. * elf-m10300.c (mn10300_elf_final_link_relocate): Don't use _bfd_stab_section_offset. Use _bfd_elf_section_offset. * stabs.c (_bfd_stab_section_offset_): Remove unused args and unneeded indirection. * elf.c (_bfd_elf_section_offset): .. and update call. * libbfd-in.h (_bfd_stab_section_offset): Update prototype. * libbfd.h: Regenerate. * bfd-in2.h: Regenerate. Replace occurrences of "_raw_size" and "_cooked_size" in most places with "size". Set new "rawsize" for stabs, eh_frame, and SEC_MERGE sections. Use "rawsize", if non-zero, for bfd_get_section_contents calls if the section might be a stabs, eh_frame, or SEC_MERGE section. Similarly use "rawsize", if non-zero, in reloc functions to validate reloc addresses. Use new bfd_malloc_and_get_section in most places where bfd_get_section_contents was called. Expand all occurrences of bfd_section_size and bfd_get_section_size. Rename "raw_size" var in grok_prstatus and similar functions to "size". * aix386-core.c (aix386_core_file_p): .. * aix5ppc-core.c (xcoff64_core_p): .. * aout-adobe.c (aout_adobe_callback, aout_adobe_write_object_contents, aout_adobe_set_section_contents): .. * aout-target.h (callback): .. * aout-tic30.c (tic30_aout_callback, tic30_aout_final_link_relocate, MY_bfd_final_link): .. * aoutf1.h (sunos4_core_file_p): .. * aoutx.h (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, translate_from_native_sym_flags, final_link, aout_link_input_section): .. * binary.c (binary_object_p, binary_canonicalize_symtab, binary_set_section_contents): .. * bout.c (b_out_callback, b_out_write_object_contents, b_out_set_section_contents, b_out_bfd_relax_section, b_out_bfd_get_relocated_section_contents): .. * cisco-core.c (cisco_core_file_validate): .. * coff-alpha.c (alpha_ecoff_object_p, alpha_ecoff_get_relocated_section_conten, alpha_relocate_section): .. * coff-arm.c (coff_arm_relocate_section, bfd_arm_allocate_interworking_sections): .. * coff-h8300.c (h8300_reloc16_extra_cases, h8300_bfd_link_add_symbols): .. * coff-mips.c (mips_refhi_reloc, mips_gprel_reloc): .. * coff-ppc.c (coff_ppc_relocate_section, ppc_allocate_toc_section, ppc_bfd_coff_final_link): .. * coff-rs6000.c (xcoff_reloc_type_br, xcoff_ppc_relocate_section): .. * coff-sh.c (sh_relax_section, sh_relax_delete_bytes, sh_align_loads, sh_coff_get_relocated_section_contents): .. * coff64-rs6000.c (xcoff64_write_object_contents, xcoff64_reloc_type_br, xcoff64_ppc_relocate_section): .. * coffcode.h (coff_compute_section_file_positions, coff_write_object_contents): .. * coffgen.c (make_a_section_from_file, coff_write_symbols, coff_section_symbol, build_debug_section): .. * cofflink.c (coff_link_add_symbols, _bfd_coff_final_link, process_embedded_commands, _bfd_coff_link_input_bfd, _bfd_coff_write_global_sym): .. * cpu-arm.c (bfd_arm_update_notes, bfd_arm_get_mach_from_notes): .. * cpu-ns32k.c (do_ns32k_reloc, _bfd_ns32k_final_link_relocate): .. * dwarf1.c (parse_line_table, _bfd_dwarf1_find_nearest_line): .. * dwarf2.c (read_indirect_string, read_abbrevs, decode_line_info, _bfd_dwarf2_find_nearest_line): .. * ecoff.c (bfd_debug_section, ecoff_set_symbol_info, ecoff_compute_section_file_positions, _bfd_ecoff_write_object_contents, ecoff_indirect_link_order): .. * elf-eh-frame.c (_bfd_elf_discard_section_eh_frame, _bfd_elf_discard_section_eh_frame_hdr, _bfd_elf_maybe_strip_eh_frame_hdr, _bfd_elf_eh_frame_section_offset, _bfd_elf_write_section_eh_frame, _bfd_elf_write_section_eh_frame_hdr): .. * elf-hppa.h (elf_hppa_sort_unwind): .. * elf-m10200.c (mn10200_elf_relax_section, mn10200_elf_relax_delete_bytes, mn10200_elf_get_relocated_section_contents): .. * elf-m10300.c (_bfd_mn10300_elf_create_got_section, mn10300_elf_check_relocs, mn10300_elf_relax_section, mn10300_elf_relax_delete_bytes, mn10300_elf_get_relocated_section_contents, _bfd_mn10300_elf_adjust_dynamic_symbol, _bfd_mn10300_elf_discard_copies, _bfd_mn10300_elf_size_dynamic_sections, _bfd_mn10300_elf_finish_dynamic_sections): .. * elf.c (_bfd_elf_print_private_bfd_data, bfd_elf_get_bfd_needed_list, _bfd_elf_make_section_from_phdr, elf_fake_sections, bfd_elf_set_group_contents, map_sections_to_segments, elf_sort_sections, assign_file_positions_for_segments, SECTION_SIZE, copy_private_bfd_data, _bfd_elf_get_dynamic_reloc_upper_bound, _bfd_elf_canonicalize_dynamic_reloc, elfcore_maybe_make_sect, _bfd_elfcore_make_pseudosection, elfcore_grok_prstatus, elfcore_grok_lwpstatus, elfcore_grok_win32pstatus, elfcore_grok_note, elfcore_grok_nto_status, elfcore_grok_nto_gregs, _bfd_elf_rel_local_sym, _bfd_elf_get_synthetic_symtab): .. * elf32-arm.h (bfd_elf32_arm_allocate_interworking_sect, bfd_elf32_arm_process_before_allocation, elf32_arm_adjust_dynamic_symbol, allocate_dynrelocs, elf32_arm_size_dynamic_sections, elf32_arm_finish_dynamic_sections, elf32_arm_write_section): .. * elf32-cris.c (cris_elf_grok_prstatus, elf_cris_finish_dynamic_sections, cris_elf_gc_sweep_hook, elf_cris_adjust_gotplt_to_got, elf_cris_adjust_dynamic_symbol, cris_elf_check_relocs, elf_cris_size_dynamic_sections, elf_cris_discard_excess_dso_dynamics, elf_cris_discard_excess_program_dynamics): .. * elf32-d30v.c (bfd_elf_d30v_reloc, bfd_elf_d30v_reloc_21): .. * elf32-dlx.c (_bfd_dlx_elf_hi16_reloc): .. * elf32-frv.c (_frvfdpic_add_dyn_reloc, _frvfdpic_add_rofixup, _frv_create_got_section, _frvfdpic_assign_plt_entries, elf32_frvfdpic_size_dynamic_sections, elf32_frvfdpic_modify_segment_map, elf32_frvfdpic_finish_dynamic_sections): .. * elf32-h8300.c (elf32_h8_relax_section, elf32_h8_relax_delete_bytes, elf32_h8_get_relocated_section_contents): .. * elf32-hppa.c (hppa_build_one_stub, hppa_size_one_stub, elf32_hppa_adjust_dynamic_symbol, allocate_plt_static, allocate_dynrelocs, elf32_hppa_size_dynamic_sections, group_sections, elf32_hppa_size_stubs, elf32_hppa_set_gp, elf32_hppa_build_stubs, elf32_hppa_finish_dynamic_sections): .. * elf32-i370.c (i370_elf_adjust_dynamic_symbol, i370_elf_size_dynamic_sections, i370_elf_check_relocs, i370_elf_finish_dynamic_sections): .. * elf32-i386.c (elf_i386_grok_prstatus, elf_i386_adjust_dynamic_symbol, allocate_dynrelocs, elf_i386_size_dynamic_sections, elf_i386_relocate_section, elf_i386_finish_dynamic_sections): .. * elf32-i860.c (i860_howto_pc26_reloc, i860_howto_pc16_reloc, i860_howto_highadj_reloc, i860_howto_splitn_reloc): .. * elf32-ip2k.c (ip2k_is_switch_table_128, ip2k_relax_switch_table_128, ip2k_is_switch_table_256, ip2k_relax_switch_table_256, ip2k_elf_relax_section, adjust_all_relocations, ip2k_elf_relax_delete_bytes): .. * elf32-m32r.c (m32r_elf_do_10_pcrel_reloc, m32r_elf_hi16_reloc, m32r_elf_generic_reloc, m32r_elf_adjust_dynamic_symbol, allocate_dynrelocs, m32r_elf_size_dynamic_sections, m32r_elf_relocate_section, m32r_elf_finish_dynamic_sections, m32r_elf_relax_section, m32r_elf_relax_delete_bytes, m32r_elf_get_relocated_section_contents): .. * elf32-m68hc11.c (m68hc11_elf_build_one_stub, m68hc11_elf_size_one_stub, m68hc11_elf_relax_section, m68hc11_elf_relax_delete_bytes): .. * elf32-m68hc12.c (m68hc12_elf_build_one_stub, m68hc12_elf_size_one_stub): .. * elf32-m68hc1x.c (elf32_m68hc11_size_stubs, elf32_m68hc11_build_stubs, m68hc11_elf_special_reloc): .. * elf32-m68k.c (elf_m68k_check_relocs, elf_m68k_gc_sweep_hook, elf_m68k_adjust_dynamic_symbol, elf_m68k_size_dynamic_sections, elf_m68k_discard_copies, elf_m68k_finish_dynamic_sections): .. * elf32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elf32-or32.c (or32_elf_consth_reloc): .. * elf32-ppc.c (ppc_elf_relax_section, ppc_elf_addr16_ha_reloc, elf_create_pointer_linker_section, ppc_elf_create_linker_section, ppc_elf_additional_program_headers, ppc_elf_adjust_dynamic_symbol, allocate_dynrelocs, ppc_elf_size_dynamic_sections, ppc_elf_finish_dynamic_sections, ppc_elf_grok_prstatus, ppc_elf_final_write_processing): .. * elf32-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections, elf_s390_grok_prstatus): .. * elf32-sh.c (sh_elf_reloc_loop, sh_elf_relax_section, sh_elf_relax_delete_bytes, sh_elf_align_loads, sh_elf_adjust_dynamic_symbol, allocate_dynrelocs, sh_elf_size_dynamic_sections, sh_elf_get_relocated_section_contents, sh_elf_finish_dynamic_sections, elf32_shlin_grok_prstatus): .. * elf32-sh64-com.c (sh64_address_in_cranges, sh64_get_contents_type): .. * elf32-sh64.c (sh64_find_section_for_address, sh64_elf_final_write_processing): .. * elf32-sparc.c (sparc_elf_wdisp16_reloc, sparc_elf_hix22_reloc, sparc_elf_lox10_reloc, elf32_sparc_adjust_dynamic_symbol, allocate_dynrelocs, elf32_sparc_size_dynamic_sections, elf32_sparc_relocate_section, elf32_sparc_finish_dynamic_sections): .. * elf32-v850.c (v850_elf_reloc, v850_elf_relax_section): .. * elf32-vax.c (elf_vax_check_relocs, elf_vax_adjust_dynamic_symbol, elf_vax_size_dynamic_sections, elf_vax_discard_copies, elf_vax_instantiate_got_entries, elf_vax_relocate_section, elf_vax_finish_dynamic_sections): .. * elf32-xstormy16.c (xstormy16_elf_24_reloc, xstormy16_elf_check_relocs, xstormy16_relax_plt_check, xstormy16_elf_relax_section, xstormy16_elf_always_size_sections, xstormy16_elf_finish_dynamic_sections): .. * elf32-xtensa.c (xtensa_read_table_entries, elf_xtensa_allocate_got_size, elf_xtensa_allocate_local_got_size, elf_xtensa_size_dynamic_sections, elf_xtensa_do_reloc, bfd_elf_xtensa_reloc, elf_xtensa_relocate_section, elf_xtensa_combine_prop_entries, elf_xtensa_finish_dynamic_sections, elf_xtensa_discard_info_for_section, elf_xtensa_grok_prstatus, get_relocation_opcode, retrieve_contents, find_relaxable_sections, collect_source_relocs, is_resolvable_asm_expansion, remove_literals, relax_section, shrink_dynamic_reloc_sections, relax_property_section, xtensa_callback_required_dependence): .. * elf64-alpha.c (elf64_alpha_reloc_gpdisp, elf64_alpha_relax_section, elf64_alpha_check_relocs, elf64_alpha_adjust_dynamic_symbol, elf64_alpha_calc_got_offsets_for_symbol, elf64_alpha_calc_got_offsets, elf64_alpha_size_plt_section, elf64_alpha_size_plt_section_1, elf64_alpha_always_size_sections, elf64_alpha_calc_dynrel_sizes, elf64_alpha_size_rela_got_section, elf64_alpha_size_rela_got_1, elf64_alpha_size_dynamic_sections, elf64_alpha_emit_dynrel, elf64_alpha_finish_dynamic_sections, elf64_alpha_final_link): .. * elf64-hppa.c (allocate_dynrel_entries, elf64_hppa_size_dynamic_sections, elf64_hppa_finish_dynamic_sections): .. * elf64-mips.c (mips_elf64_gprel32_reloc, mips16_gprel_reloc, mips_elf64_canonicalize_dynamic_reloc, mips_elf64_slurp_reloc_table, elf64_mips_grok_prstatus): .. * elf64-mmix.c (mmix_elf_perform_relocation, mmix_elf_reloc, mmix_elf_relocate_section, mmix_elf_final_link, mmix_set_relaxable_size, _bfd_mmix_after_linker_allocation, mmix_elf_relax_section, mmix_elf_get_section_contents): .. * elf64-ppc.c (ppc64_elf_object_p, ppc64_elf_grok_prstatus, ppc64_elf_check_relocs, ppc64_elf_func_desc_adjust, ppc64_elf_adjust_dynamic_symbol, ppc64_elf_edit_opd, allocate_dynrelocs, ppc64_elf_size_dynamic_sections, ppc_build_one_stub, ppc_size_one_stub, ppc64_elf_next_toc_section, toc_adjusting_stub_needed, group_sections, ppc64_elf_size_stubs, ppc64_elf_build_stubs, ppc64_elf_relocate_section, ppc64_elf_finish_dynamic_sections): .. * elf64-s390.c (s390_elf_ldisp_reloc, elf_s390_adjust_dynamic_symbol, allocate_dynrelocs, elf_s390_size_dynamic_sections, elf_s390_finish_dynamic_sections): .. * elf64-sh64.c (sh_elf64_get_relocated_section_contents, sh_elf64_check_relocs, sh64_elf64_adjust_dynamic_symbol, sh64_elf64_discard_copies, sh64_elf64_size_dynamic_sections, sh64_elf64_finish_dynamic_sections): .. * elf64-sparc.c (sparc64_elf_slurp_reloc_table, init_insn_reloc, sparc64_elf_check_relocs, sparc64_elf_adjust_dynamic_symbol, sparc64_elf_size_dynamic_sections, sparc64_elf_relocate_section, sparc64_elf_finish_dynamic_symbol, sparc64_elf_finish_dynamic_sections): .. * elf64-x86-64.c (elf64_x86_64_grok_prstatus, elf64_x86_64_adjust_dynamic_symbol, allocate_dynrelocs, elf64_x86_64_size_dynamic_sections, elf64_x86_64_relocate_section, elf64_x86_64_finish_dynamic_sections): .. * elfarm-nabi.c (elf32_arm_nabi_grok_prstatus): .. * elfcode.h (elf_slurp_reloc_table): .. * elflink.c (_bfd_elf_create_got_section, elf_add_dt_needed_tag, elf_finalize_dynstr, elf_link_add_object_symbols, bfd_elf_size_dynamic_sections, elf_link_sort_relocs, elf_link_input_bfd, bfd_elf_final_link, bfd_elf_discard_info): .. * elfn32-mips.c (gprel32_with_gp, mips16_gprel_reloc, elf32_mips_grok_prstatus): .. * elfxx-ia64.c (elfNN_ia64_relax_section, allocate_dynrel_entries, elfNN_ia64_size_dynamic_sections, elfNN_ia64_install_dyn_reloc, elfNN_ia64_choose_gp, elfNN_ia64_final_link, elfNN_ia64_finish_dynamic_sections): .. * elfxx-mips.c (mips_elf_create_procedure_table, mips_elf_check_mips16_stubs, _bfd_mips_elf_gprel16_with_gp, _bfd_mips_elf_hi16_reloc, _bfd_mips_elf_generic_reloc, mips_elf_global_got_index, mips_elf_multi_got, mips_elf_create_compact_rel_section, mips_elf_calculate_relocation, mips_elf_allocate_dynamic_relocations, mips_elf_create_dynamic_relocation, _bfd_mips_elf_fake_sections, _bfd_mips_relax_section, _bfd_mips_elf_adjust_dynamic_symbol, _bfd_mips_elf_always_size_sections, _bfd_mips_elf_size_dynamic_sections, _bfd_mips_elf_finish_dynamic_symbol, _bfd_mips_elf_finish_dynamic_sections, _bfd_mips_elf_modify_segment_map, _bfd_mips_elf_discard_info, _bfd_mips_elf_write_section, _bfd_mips_elf_set_section_contents, _bfd_elf_mips_get_relocated_section_contents, _bfd_mips_elf_final_link, _bfd_mips_elf_merge_private_bfd_data): .. * hp300hpux.c (callback): .. * hppabsd-core.c (make_bfd_asection): .. * hpux-core.c (make_bfd_asection): .. * i386linux.c (linux_link_create_dynamic_sections, bfd_i386linux_size_dynamic_sections, linux_finish_dynamic_link): .. * i386msdos.c (msdos_write_object_contents): .. * i386os9k.c (os9k_callback, os9k_write_object_contents, os9k_set_section_contents): .. * ieee.c (parse_expression, ieee_slurp_external_symbols, ieee_slurp_sections, ieee_slurp_debug, ieee_slurp_section_data, ieee_write_section_part, do_with_relocs, do_as_repeat, do_without_relocs, ieee_write_debug_part, init_for_output, ieee_set_section_contents): .. * ihex.c (ihex_scan, ihex_read_section, ihex_get_section_contents): .. * irix-core.c (do_sections, make_bfd_asection): .. * libaout.h (aout_section_merge_with_text_p): .. * libbfd.c (_bfd_generic_get_section_contents, _bfd_generic_get_section_contents_in_window): .. * linker.c (default_indirect_link_order): .. * lynx-core.c (make_bfd_asection): .. * m68klinux.c (linux_link_create_dynamic_sections, bfd_m68klinux_size_dynamic_sections, linux_finish_dynamic_link): .. * mach-o.c (bfd_mach_o_make_bfd_section, bfd_mach_o_scan_read_dylinker, bfd_mach_o_scan_read_dylib, bfd_mach_o_scan_read_thread, bfd_mach_o_scan_read_symtab, bfd_mach_o_scan_read_segment): .. * merge.c (_bfd_add_merge_section, record_section, merge_strings, _bfd_merge_sections): .. * mmo.c (mmo_find_sec_w_addr, mmo_get_spec_section, mmo_get_loc, mmo_map_set_sizes, mmo_canonicalize_symtab, mmo_internal_write_section, mmo_write_object_contents): .. * netbsd-core.c (netbsd_core_file_p): .. * nlm32-alpha.c (nlm_alpha_read_reloc, nlm_alpha_write_import, nlm_alpha_set_public_section): .. * nlm32-ppc.c (nlm_powerpc_read_reloc, nlm_powerpc_write_reloc): .. * nlm32-sparc.c (nlm_sparc_write_import): .. * nlmcode.h (add_bfd_section, nlm_swap_auxiliary_headers_in, nlm_compute_section_file_positions): .. * oasys.c (oasys_object_p, oasys_slurp_section_data, oasys_write_sections, oasys_write_data, oasys_set_section_contents): .. * opncls.c (get_debug_link_info): .. * osf-core.c (make_bfd_asection): .. * pdp11.c (some_aout_object_p, adjust_o_magic, adjust_z_magic, adjust_n_magic, adjust_sizes_and_vmas, squirt_out_relocs, final_link, aout_link_input_section): .. * peXXigen.c (_bfd_XXi_swap_sym_in, _bfd_XXi_swap_aouthdr_out, pe_print_idata, pe_print_edata, pe_print_pdata, pe_print_reloc): .. * pef.c (bfd_pef_make_bfd_section, bfd_pef_print_loader_section, bfd_pef_scan_start_address, bfd_pef_parse_symbols): .. * ppcboot.c (ppcboot_object_p, ppcboot_canonicalize_symtab): .. * ptrace-core.c (ptrace_unix_core_file_p): .. * reloc.c (bfd_perform_relocation, bfd_install_relocation, _bfd_final_link_relocate, bfd_generic_relax_section, bfd_generic_get_relocated_section_contents): .. * reloc16.c (bfd_coff_reloc16_relax_section, bfd_coff_reloc16_get_relocated_section_c): .. * riscix.c (riscix_some_aout_object_p): .. * rs6000-core.c (read_hdr, make_bfd_asection): .. * sco5-core.c (make_bfd_asection): .. * simple.c (bfd_simple_get_relocated_section_contents): .. * som.c (som_object_setup, setup_sections, som_prep_headers, som_write_fixups, som_begin_writing, bfd_section_from_som_symbol, som_set_reloc_info, som_get_section_contents, som_bfd_link_split_section): .. * sparclinux.c (linux_link_create_dynamic_sections, bfd_sparclinux_size_dynamic_sections, linux_finish_dynamic_link): .. * srec.c (srec_scan, srec_read_section, srec_get_section_contents): .. * stabs.c (_bfd_link_section_stabs, _bfd_discard_section_stabs, _bfd_write_stab_strings, _bfd_stab_section_offset): .. * sunos.c (sunos_read_dynamic_info, sunos_create_dynamic_sections, bfd_sunos_size_dynamic_sections, sunos_scan_std_relocs, sunos_scan_ext_relocs, sunos_scan_dynamic_symbol, sunos_write_dynamic_symbol, sunos_check_dynamic_reloc, sunos_finish_dynamic_link): .. * syms.c (_bfd_stab_section_find_nearest_line): .. * tekhex.c (first_phase, tekhex_set_section_contents, tekhex_write_object_contents): .. * trad-core.c (trad_unix_core_file_p): .. * versados.c (process_esd, process_otr, process_otr): .. * vms-gsd.c (_bfd_vms_slurp_gsd, _bfd_vms_write_gsd): .. * vms-misc.c (add_new_contents): .. * vms-tir.c (check_section, new_section, _bfd_vms_write_tir): .. * vms.c (vms_set_section_contents): .. * xcofflink.c (xcoff_get_section_contents, xcoff_link_add_symbols, xcoff_sweep, bfd_xcoff_size_dynamic_sections, xcoff_build_ldsyms, _bfd_xcoff_bfd_final_link, xcoff_link_input_bfd): .. * xsym.c (bfd_sym_scan): .. See above. binutils/ * objcopy.c (copy_section): Don't set _cooked_size. include/ * bfdlink.h (struct bfd_link_order): Update comment. ld/ * ldlang.c (print_output_section_statement): Don't print size before relaxation. (IGNORE_SECTION): Remove bfd arg. Update all callers. * ldexp.c (fold_name): .. See below. * ldlang.c (section_already_linked, print_output_section_statement, print_input_section, insert_pad, size_input_section, lang_check_section_addresses, lang_size_sections_1, lang_size_sections, lang_do_assignments_1, lang_set_startof, lang_one_common, lang_reset_memory_regions, lang_process, lang_abs_symbol_at_end_of, lang_do_version_exports_section): .. * ldwrite.c (build_link_order, clone_section, ds, split_sections): .. * pe-dll.c (process_def_file, generate_reloc): .. * emultempl/elf32.em (gld${EMULATION_NAME}_find_statement_assignment, gld${EMULATION_NAME}_before_allocation): .. * emultempl/mmix-elfnmmo.em (mmix_after_allocation): .. * emultempl/sh64elf.em (sh64_elf_${EMULATION_NAME}_before_allocation, sh64_elf_${EMULATION_NAME}_after_allocation): .. * emultempl/sunos.em (gld${EMULATION_NAME}_before_allocation): .. * emultempl/xtensaelf.em (ld_assign_relative_paged_dot, ld_local_file_relocations_fit, ld_xtensa_insert_page_offsets): Use "size" instead of "_raw_size" and "_cooked_size". Expand bfd_section_size macro invocations.
2004-06-24 06:46:28 +02:00
address += code_sec->size;
1999-05-03 09:29:11 +02:00
}
else
{
bfd_set_error (bfd_error_bad_value);
return FALSE;
1999-05-03 09:29:11 +02:00
}
H_PUT_16 (abfd, l_rsecnm, ext.l_rsecnm);
H_PUT_32 (abfd, address, ext.l_vaddr);
1999-05-03 09:29:11 +02:00
if (bfd_bwrite (&ext, (bfd_size_type) sizeof ext, abfd) != sizeof ext)
return FALSE;
1999-05-03 09:29:11 +02:00
return TRUE;
1999-05-03 09:29:11 +02:00
}
/* Write a PowerPC NLM import. */
static bfd_boolean
2005-04-21 09:45:39 +02:00
nlm_powerpc_write_import (bfd * abfd, asection * sec, arelent * rel)
1999-05-03 09:29:11 +02:00
{
return nlm_powerpc_write_reloc (abfd, sec, rel, -1);
}
#endif /* OLDFORMAT */
/* Write a PowerPC NLM external symbol. This routine keeps a static
count of the symbol index. FIXME: I don't know if this is
necessary, and the index never gets reset. */
static bfd_boolean
2005-04-21 09:45:39 +02:00
nlm_powerpc_write_external (bfd *abfd,
bfd_size_type count,
asymbol *sym,
struct reloc_and_sec *relocs)
1999-05-03 09:29:11 +02:00
{
unsigned int i;
bfd_byte len;
unsigned char temp[NLM_TARGET_LONG_SIZE];
#ifdef OLDFORMAT
static int indx;
#endif
len = strlen (sym->name);
if ((bfd_bwrite (&len, (bfd_size_type) sizeof (bfd_byte), abfd)
!= sizeof (bfd_byte))
|| bfd_bwrite (sym->name, (bfd_size_type) len, abfd) != len)
return FALSE;
1999-05-03 09:29:11 +02:00
bfd_put_32 (abfd, count, temp);
if (bfd_bwrite (temp, (bfd_size_type) sizeof (temp), abfd) != sizeof (temp))
return FALSE;
1999-05-03 09:29:11 +02:00
for (i = 0; i < count; i++)
{
#ifndef OLDFORMAT
if (! nlm_powerpc_write_import (abfd, relocs[i].sec, relocs[i].rel))
return FALSE;
1999-05-03 09:29:11 +02:00
#else
if (! nlm_powerpc_write_reloc (abfd, relocs[i].sec,
relocs[i].rel, indx))
return FALSE;
1999-05-03 09:29:11 +02:00
#endif
}
#ifdef OLDFORMAT
++indx;
#endif
return TRUE;
1999-05-03 09:29:11 +02:00
}
#ifndef OLDFORMAT
/* PowerPC Netware uses a word offset, not a byte offset, for public
symbols. */
/* Set the section for a public symbol. */
static bfd_boolean
2005-04-21 09:45:39 +02:00
nlm_powerpc_set_public_section (bfd *abfd, nlmNAME (symbol_type) *sym)
1999-05-03 09:29:11 +02:00
{
if (sym->symbol.value & NLM_HIBIT)
{
sym->symbol.value &= ~NLM_HIBIT;
sym->symbol.flags |= BSF_FUNCTION;
sym->symbol.section =
bfd_get_section_by_name (abfd, NLM_CODE_NAME);
}
else
2005-04-21 09:45:39 +02:00
sym->symbol.section =
bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME);
1999-05-03 09:29:11 +02:00
sym->symbol.value <<= 2;
return TRUE;
1999-05-03 09:29:11 +02:00
}
/* Get the offset to write out for a public symbol. */
static bfd_vma
2005-04-21 09:45:39 +02:00
nlm_powerpc_get_public_offset (bfd *abfd, asymbol *sym)
1999-05-03 09:29:11 +02:00
{
bfd_vma offset;
asection *sec;
offset = bfd_asymbol_value (sym);
sec = bfd_get_section (sym);
if (sec->flags & SEC_CODE)
{
offset -= nlm_get_text_low (abfd);
offset |= NLM_HIBIT;
}
else if (sec->flags & (SEC_DATA | SEC_ALLOC))
{
/* SEC_ALLOC is for the .bss section. */
offset -= nlm_get_data_low (abfd);
}
else
{
/* We can't handle an exported symbol that is not in the code or
data segment. */
bfd_set_error (bfd_error_invalid_operation);
/* FIXME: No way to return error. */
abort ();
}
return offset;
}
#endif /* ! defined (OLDFORMAT) */
#include "nlmswap.h"
static const struct nlm_backend_data nlm32_powerpc_backend =
{
"NetWare PowerPC Module \032",
sizeof (Nlm32_powerpc_External_Fixed_Header),
#ifndef OLDFORMAT
2005-04-21 09:45:39 +02:00
0, /* Optional_prefix_size. */
1999-05-03 09:29:11 +02:00
#else
sizeof (struct nlm32_powerpc_external_prefix_header),
#endif
bfd_arch_powerpc,
0,
FALSE,
1999-05-03 09:29:11 +02:00
#ifndef OLDFORMAT
2005-04-21 09:45:39 +02:00
0, /* Backend_object_p. */
0, /* Write_prefix. */
1999-05-03 09:29:11 +02:00
#else
nlm_powerpc_backend_object_p,
nlm_powerpc_write_prefix,
#endif
nlm_powerpc_read_reloc,
nlm_powerpc_mangle_relocs,
nlm_powerpc_read_import,
nlm_powerpc_write_import,
#ifndef OLDFORMAT
nlm_powerpc_set_public_section,
nlm_powerpc_get_public_offset,
#else
2005-04-21 09:45:39 +02:00
0, /* Set_public_section. */
0, /* Get_public_offset. */
1999-05-03 09:29:11 +02:00
#endif
nlm_swap_fixed_header_in,
nlm_swap_fixed_header_out,
nlm_powerpc_write_external,
2005-04-21 09:45:39 +02:00
0, /* Write_export. */
1999-05-03 09:29:11 +02:00
};
#define TARGET_BIG_NAME "nlm32-powerpc"
2005-04-21 09:45:39 +02:00
#define TARGET_BIG_SYM nlmNAME (powerpc_vec)
#define TARGET_BACKEND_DATA & nlm32_powerpc_backend
1999-05-03 09:29:11 +02:00
#include "nlm-target.h"