* opncls.c (_bfd_new_bfd, _bfd_new_bfd_contained_in): Add
"_bfd_" to function names.
* archive.c (_bfd_create_empty_archive_element_shell),
libbfd-in.h: Change callers.
* libbfd.c (bfd_zmalloc): Renamed from zalloc.
* libbfd.c (bfd_add_to_string_table),
trad-core.c (trad_unix_core_file_p),
targets.c (bfd_target_list),
ptrace-core.c (ptrace_unix_core_file_p),
opncls.c (new_bfd), libbfd-in.h,
ieee.c (ieee_make_empty_symbol),
elf32-hppa.c (hppa_elf_stub_branch_reloc),
(hppa_elf_stub_reloc): Change callers.
* libbfd.h: Regenerated.
* archive.c (_bfd_look_for_bfd_in_cache): Add "_bfd_" to name.
(_bfd_get_elt_at_filepos),
coff-rs6000.c (rs6000coff_get_elt_at_filepos), libbfd-in.h:
Change callers.
* format.c (bfd_check_format_matches), libbfd-in.h, targets.c,
elfcode.h (elf_object_p): Rename target_vector to bfd_target_vector
and default_vector to bfd_default_vector.
* libbfd.h: Regenerated.
1994-01-25 13:25:26 +00:00
|
|
|
|
/* BFD back-end for IBM RS/6000 "XCOFF" files.
|
1994-02-15 01:28:16 +00:00
|
|
|
|
Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
|
* opncls.c (_bfd_new_bfd, _bfd_new_bfd_contained_in): Add
"_bfd_" to function names.
* archive.c (_bfd_create_empty_archive_element_shell),
libbfd-in.h: Change callers.
* libbfd.c (bfd_zmalloc): Renamed from zalloc.
* libbfd.c (bfd_add_to_string_table),
trad-core.c (trad_unix_core_file_p),
targets.c (bfd_target_list),
ptrace-core.c (ptrace_unix_core_file_p),
opncls.c (new_bfd), libbfd-in.h,
ieee.c (ieee_make_empty_symbol),
elf32-hppa.c (hppa_elf_stub_branch_reloc),
(hppa_elf_stub_reloc): Change callers.
* libbfd.h: Regenerated.
* archive.c (_bfd_look_for_bfd_in_cache): Add "_bfd_" to name.
(_bfd_get_elt_at_filepos),
coff-rs6000.c (rs6000coff_get_elt_at_filepos), libbfd-in.h:
Change callers.
* format.c (bfd_check_format_matches), libbfd-in.h, targets.c,
elfcode.h (elf_object_p): Rename target_vector to bfd_target_vector
and default_vector to bfd_default_vector.
* libbfd.h: Regenerated.
1994-01-25 13:25:26 +00:00
|
|
|
|
FIXME: Can someone provide a transliteration of this name into ASCII?
|
|
|
|
|
Using the following chars caused a compiler warning on HIUX (so I replaced
|
|
|
|
|
them with octal escapes), and isn't useful without an understanding of what
|
|
|
|
|
character set it is.
|
|
|
|
|
Written by Metin G. Ozisik, Mimi Ph\373\364ng-Th\345o V\365,
|
|
|
|
|
and John Gilmore.
|
1991-10-25 07:16:56 +00:00
|
|
|
|
Archive support from Damon A. Permezel.
|
|
|
|
|
Contributed by IBM Corporation and Cygnus Support.
|
|
|
|
|
|
|
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
/* This port currently only handles reading object files, except when
|
|
|
|
|
compiled on an RS/6000 host. -- no archive support, no core files.
|
|
|
|
|
In all cases, it does not support writing.
|
|
|
|
|
|
|
|
|
|
FIXMEmgo comments are left from Metin Ozisik's original port. */
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
|
|
|
|
/* Internalcoff.h and coffcode.h modify themselves based on this flag. */
|
|
|
|
|
#define RS6000COFF_C 1
|
|
|
|
|
|
|
|
|
|
#include "bfd.h"
|
1991-10-25 10:17:52 +00:00
|
|
|
|
#include "sysdep.h"
|
1991-10-25 07:16:56 +00:00
|
|
|
|
#include "libbfd.h"
|
|
|
|
|
#include "obstack.h"
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 16:02:09 +00:00
|
|
|
|
#include "coff/internal.h"
|
|
|
|
|
#include "coff/rs6000.h"
|
1991-10-25 07:16:56 +00:00
|
|
|
|
#include "libcoff.h"
|
|
|
|
|
|
|
|
|
|
/* The main body of code is in coffcode.h. */
|
|
|
|
|
|
1994-02-15 01:28:16 +00:00
|
|
|
|
/* The XCOFF reloc table. Actually, XCOFF relocations specify the
|
|
|
|
|
bitsize and whether they are signed or not, along with a
|
|
|
|
|
conventional type. This table is for the types, which are used for
|
|
|
|
|
different algorithms for putting in the reloc. Many of these
|
|
|
|
|
relocs need special_function entries, which I have not written. */
|
|
|
|
|
|
|
|
|
|
static reloc_howto_type rs6000coff_howto_table[] =
|
|
|
|
|
{
|
|
|
|
|
/* Standard 32 bit relocation. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffffffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* 32 bit relocation, but store negative value. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffffffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* 32 bit PC relative relocation. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffffffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* 16 bit TOC relative relocation. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* I don't really know what this is. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffffffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* External TOC relative symbol. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* Local TOC relative symbol. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
{ 7 },
|
|
|
|
|
|
|
|
|
|
/* Non modifiable absolute branch. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0x3fffffc, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
{ 9 },
|
|
|
|
|
|
|
|
|
|
/* Non modifiable relative branch. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0x3fffffc, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
{ 0xb },
|
|
|
|
|
|
|
|
|
|
/* Indirect load. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* Load address. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
{ 0xe },
|
|
|
|
|
|
|
|
|
|
/* Non-relocating reference. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
{ 0x10 },
|
|
|
|
|
{ 0x11 },
|
|
|
|
|
|
|
|
|
|
/* TOC relative indirect load. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* TOC relative load address. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* Modifiable relative branch. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffffffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* Modifiable absolute branch. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffffffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* Modifiable call absolute indirect. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* Modifiable call relative. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* Modifiable branch absolute. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* Modifiable branch absolute. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* Modifiable branch relative. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false), /* pcrel_offset */
|
|
|
|
|
|
|
|
|
|
/* Modifiable branch absolute. */
|
|
|
|
|
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, /* src_mask */
|
|
|
|
|
0xffff, /* dst_mask */
|
|
|
|
|
false) /* pcrel_offset */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#define RTYPE2HOWTO(cache_ptr, dst) rs6000coff_rtype2howto (cache_ptr, dst)
|
|
|
|
|
|
|
|
|
|
static void rs6000coff_rtype2howto PARAMS ((arelent *,
|
|
|
|
|
struct internal_reloc *));
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
rs6000coff_rtype2howto (relent, internal)
|
|
|
|
|
arelent *relent;
|
|
|
|
|
struct internal_reloc *internal;
|
|
|
|
|
{
|
|
|
|
|
relent->howto = rs6000coff_howto_table + internal->r_type;
|
|
|
|
|
|
|
|
|
|
/* The r_size field of an XCOFF reloc encodes the bitsize of the
|
|
|
|
|
relocation, as well as indicating whether it is signed or not.
|
|
|
|
|
Doublecheck that the relocation information gathered from the
|
|
|
|
|
type matches this information. */
|
|
|
|
|
if (relent->howto->bitsize != (internal->r_size & 0x1f) + 1)
|
|
|
|
|
abort ();
|
|
|
|
|
#if 0
|
|
|
|
|
if ((internal->r_size & 0x80) != 0
|
|
|
|
|
? (relent->howto->complain_on_overflow != complain_overflow_signed)
|
|
|
|
|
: (relent->howto->complain_on_overflow != complain_overflow_bitfield))
|
|
|
|
|
abort ();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define coff_bfd_reloc_type_lookup rs6000coff_reloc_type_lookup
|
|
|
|
|
|
|
|
|
|
static const struct reloc_howto_struct *rs6000coff_reloc_type_lookup
|
|
|
|
|
PARAMS ((bfd *, bfd_reloc_code_real_type));
|
|
|
|
|
|
|
|
|
|
static const struct reloc_howto_struct *
|
|
|
|
|
rs6000coff_reloc_type_lookup (abfd, code)
|
|
|
|
|
bfd *abfd;
|
|
|
|
|
bfd_reloc_code_real_type code;
|
|
|
|
|
{
|
|
|
|
|
switch (code)
|
|
|
|
|
{
|
|
|
|
|
case BFD_RELOC_PPC_B26:
|
|
|
|
|
return &rs6000coff_howto_table[0xa];
|
|
|
|
|
case BFD_RELOC_PPC_BA26:
|
|
|
|
|
return &rs6000coff_howto_table[8];
|
|
|
|
|
case BFD_RELOC_PPC_TOC16:
|
|
|
|
|
return &rs6000coff_howto_table[3];
|
|
|
|
|
case BFD_RELOC_32:
|
|
|
|
|
return &rs6000coff_howto_table[0];
|
|
|
|
|
default:
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define SELECT_RELOC(internal, howto) \
|
|
|
|
|
{ \
|
|
|
|
|
internal.r_type = howto->type; \
|
|
|
|
|
internal.r_size = \
|
|
|
|
|
((howto->complain_on_overflow == complain_overflow_signed \
|
|
|
|
|
? 0x80 \
|
|
|
|
|
: 0) \
|
|
|
|
|
| (howto->bitsize - 1)); \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define COFF_LONG_FILENAMES
|
* opncls.c (_bfd_new_bfd, _bfd_new_bfd_contained_in): Add
"_bfd_" to function names.
* archive.c (_bfd_create_empty_archive_element_shell),
libbfd-in.h: Change callers.
* libbfd.c (bfd_zmalloc): Renamed from zalloc.
* libbfd.c (bfd_add_to_string_table),
trad-core.c (trad_unix_core_file_p),
targets.c (bfd_target_list),
ptrace-core.c (ptrace_unix_core_file_p),
opncls.c (new_bfd), libbfd-in.h,
ieee.c (ieee_make_empty_symbol),
elf32-hppa.c (hppa_elf_stub_branch_reloc),
(hppa_elf_stub_reloc): Change callers.
* libbfd.h: Regenerated.
* archive.c (_bfd_look_for_bfd_in_cache): Add "_bfd_" to name.
(_bfd_get_elt_at_filepos),
coff-rs6000.c (rs6000coff_get_elt_at_filepos), libbfd-in.h:
Change callers.
* format.c (bfd_check_format_matches), libbfd-in.h, targets.c,
elfcode.h (elf_object_p): Rename target_vector to bfd_target_vector
and default_vector to bfd_default_vector.
* libbfd.h: Regenerated.
1994-01-25 13:25:26 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
#include "coffcode.h"
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
#define coff_archive_p bfd_generic_archive_p
|
|
|
|
|
#define coff_mkarchive _bfd_generic_mkarchive
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1994-02-15 01:28:16 +00:00
|
|
|
|
#ifdef HOST_AIX
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
/* ------------------------------------------------------------------------ */
|
|
|
|
|
/* Support for archive file stuff.. */
|
|
|
|
|
/* Stolen from Damon A. Permezel's `bfd' portation. */
|
|
|
|
|
/* ------------------------------------------------------------------------ */
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
#undef coff_openr_next_archived_file
|
|
|
|
|
#define coff_openr_next_archived_file rs6000coff_openr_next_archived_file
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
#undef coff_write_armap
|
|
|
|
|
#define coff_write_armap rs6000coff_write_armap
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
#undef coff_stat_arch_elt
|
|
|
|
|
#define coff_stat_arch_elt rs6000coff_stat_arch_elt
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
#undef coff_snarf_ar_hdr
|
|
|
|
|
#define coff_snarf_ar_hdr rs6000coff_snarf_ar_hdr
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
#undef coff_mkarchive
|
|
|
|
|
#define coff_mkarchive rs6000coff_mkarchive
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
#undef coff_archive_p
|
|
|
|
|
#define coff_archive_p rs6000coff_archive_p
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
|
|
|
|
#include "/usr/include/ar.h" /* <ar.h> doesn't do it. */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define arch_hdr(bfd) \
|
|
|
|
|
((struct ar_hdr *) \
|
|
|
|
|
(((struct areltdata *)((bfd)->arelt_data))->arch_header))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static boolean
|
|
|
|
|
rs6000coff_mkarchive (abfd)
|
|
|
|
|
bfd *abfd;
|
|
|
|
|
{
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_invalid_operation); /* write not supported */
|
1994-02-15 01:28:16 +00:00
|
|
|
|
return false;
|
1991-10-25 07:16:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* This functions reads an arch header and returns an areltdata pointer, or
|
|
|
|
|
NULL on error.
|
|
|
|
|
|
|
|
|
|
Presumes the file pointer is already in the right place (ie pointing
|
|
|
|
|
to the ar_hdr in the file). Moves the file pointer; on success it
|
|
|
|
|
should be pointing to the front of the file contents; on failure it
|
|
|
|
|
could have been moved arbitrarily.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
struct areltdata *
|
|
|
|
|
rs6000coff_snarf_ar_hdr (abfd)
|
|
|
|
|
bfd *abfd;
|
|
|
|
|
{
|
|
|
|
|
struct {
|
|
|
|
|
struct ar_hdr hdr;
|
|
|
|
|
char namebuf[256];
|
|
|
|
|
} h;
|
|
|
|
|
int size;
|
|
|
|
|
struct areltdata *ared;
|
|
|
|
|
char *allocptr;
|
|
|
|
|
|
|
|
|
|
size = sizeof (h.hdr);
|
|
|
|
|
if (bfd_read(&h.hdr, 1, size, abfd) != size) {
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_no_more_archived_files);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
size = atoi(h.hdr.ar_namlen); /* ar_name[] length */
|
|
|
|
|
size += size & 1;
|
|
|
|
|
|
|
|
|
|
if (bfd_read(&h.hdr._ar_name.ar_name[2], 1, size, abfd) != size) {
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_no_more_archived_files);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (strncmp(h.hdr._ar_name.ar_fmag + size, AIAFMAG, 2)) {
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_malformed_archive);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
h.hdr._ar_name.ar_name[size] = 0; /* terminate filename */
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* if the filename is NULL, we're (probably) at the end.
|
|
|
|
|
*/
|
|
|
|
|
if (size == 0) {
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_no_more_archived_files);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size += sizeof (h.hdr);
|
|
|
|
|
allocptr = bfd_zalloc(abfd, sizeof (*ared) + size);
|
|
|
|
|
|
|
|
|
|
if (allocptr == NULL) {
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_no_memory);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ared = (struct areltdata *) allocptr;
|
|
|
|
|
|
|
|
|
|
ared->arch_header = (void *) (allocptr + sizeof (struct areltdata));
|
|
|
|
|
memcpy ((char *) ared->arch_header, &h.hdr, size);
|
|
|
|
|
ared->parsed_size = atoi(h.hdr.ar_size);
|
|
|
|
|
ared->filename = ((AR_HDR*) ared->arch_header)->_ar_name.ar_name;
|
|
|
|
|
|
|
|
|
|
return ared;
|
|
|
|
|
}
|
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
/* Stolen directly from archive.c, except it calls rs6000coff_snarf_ar_hdr.
|
|
|
|
|
Why wasn't this part of the transfer vector? */
|
|
|
|
|
|
|
|
|
|
bfd *
|
|
|
|
|
rs6000coff_get_elt_at_filepos (archive, filepos)
|
|
|
|
|
bfd *archive;
|
|
|
|
|
file_ptr filepos;
|
|
|
|
|
{
|
|
|
|
|
struct areltdata *new_areldata;
|
|
|
|
|
bfd *n_nfd;
|
|
|
|
|
|
* opncls.c (_bfd_new_bfd, _bfd_new_bfd_contained_in): Add
"_bfd_" to function names.
* archive.c (_bfd_create_empty_archive_element_shell),
libbfd-in.h: Change callers.
* libbfd.c (bfd_zmalloc): Renamed from zalloc.
* libbfd.c (bfd_add_to_string_table),
trad-core.c (trad_unix_core_file_p),
targets.c (bfd_target_list),
ptrace-core.c (ptrace_unix_core_file_p),
opncls.c (new_bfd), libbfd-in.h,
ieee.c (ieee_make_empty_symbol),
elf32-hppa.c (hppa_elf_stub_branch_reloc),
(hppa_elf_stub_reloc): Change callers.
* libbfd.h: Regenerated.
* archive.c (_bfd_look_for_bfd_in_cache): Add "_bfd_" to name.
(_bfd_get_elt_at_filepos),
coff-rs6000.c (rs6000coff_get_elt_at_filepos), libbfd-in.h:
Change callers.
* format.c (bfd_check_format_matches), libbfd-in.h, targets.c,
elfcode.h (elf_object_p): Rename target_vector to bfd_target_vector
and default_vector to bfd_default_vector.
* libbfd.h: Regenerated.
1994-01-25 13:25:26 +00:00
|
|
|
|
n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos);
|
1991-11-27 21:57:48 +00:00
|
|
|
|
if (n_nfd) return n_nfd;
|
|
|
|
|
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
if (0 != bfd_seek (archive, filepos, SEEK_SET))
|
1991-11-27 21:57:48 +00:00
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
if ((new_areldata = rs6000coff_snarf_ar_hdr (archive)) == NULL) return NULL;
|
|
|
|
|
|
|
|
|
|
n_nfd = _bfd_create_empty_archive_element_shell (archive);
|
|
|
|
|
if (n_nfd == NULL) {
|
|
|
|
|
bfd_release (archive, (PTR)new_areldata);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
n_nfd->origin = bfd_tell (archive);
|
|
|
|
|
n_nfd->arelt_data = (PTR) new_areldata;
|
|
|
|
|
n_nfd->filename = new_areldata->filename;
|
|
|
|
|
|
* opncls.c (_bfd_new_bfd, _bfd_new_bfd_contained_in): Add
"_bfd_" to function names.
* archive.c (_bfd_create_empty_archive_element_shell),
libbfd-in.h: Change callers.
* libbfd.c (bfd_zmalloc): Renamed from zalloc.
* libbfd.c (bfd_add_to_string_table),
trad-core.c (trad_unix_core_file_p),
targets.c (bfd_target_list),
ptrace-core.c (ptrace_unix_core_file_p),
opncls.c (new_bfd), libbfd-in.h,
ieee.c (ieee_make_empty_symbol),
elf32-hppa.c (hppa_elf_stub_branch_reloc),
(hppa_elf_stub_reloc): Change callers.
* libbfd.h: Regenerated.
* archive.c (_bfd_look_for_bfd_in_cache): Add "_bfd_" to name.
(_bfd_get_elt_at_filepos),
coff-rs6000.c (rs6000coff_get_elt_at_filepos), libbfd-in.h:
Change callers.
* format.c (bfd_check_format_matches), libbfd-in.h, targets.c,
elfcode.h (elf_object_p): Rename target_vector to bfd_target_vector
and default_vector to bfd_default_vector.
* libbfd.h: Regenerated.
1994-01-25 13:25:26 +00:00
|
|
|
|
if (_bfd_add_bfd_to_archive_cache (archive, filepos, n_nfd))
|
1991-11-27 21:57:48 +00:00
|
|
|
|
return n_nfd;
|
|
|
|
|
|
|
|
|
|
/* huh? */
|
|
|
|
|
bfd_release (archive, (PTR)n_nfd);
|
|
|
|
|
bfd_release (archive, (PTR)new_areldata);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
1991-10-25 07:16:56 +00:00
|
|
|
|
/*
|
|
|
|
|
* xcoff_openr_next_archived_file - xcoff has nxt/prv seek addrs.
|
|
|
|
|
*/
|
|
|
|
|
static bfd *
|
|
|
|
|
rs6000coff_openr_next_archived_file(archive, last_file)
|
|
|
|
|
bfd *archive, *last_file;
|
|
|
|
|
{
|
|
|
|
|
file_ptr filestart;
|
|
|
|
|
|
|
|
|
|
if (!last_file)
|
|
|
|
|
filestart = bfd_ardata(archive)->first_file_filepos;
|
|
|
|
|
else
|
|
|
|
|
filestart = atol(arch_hdr(last_file)->ar_nxtmem);
|
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
return rs6000coff_get_elt_at_filepos (archive, filestart);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bfd_target *
|
|
|
|
|
rs6000coff_archive_p (abfd)
|
|
|
|
|
bfd *abfd;
|
|
|
|
|
{
|
|
|
|
|
struct fl_hdr hdr;
|
|
|
|
|
register struct artdata *art;
|
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
if (bfd_read (&hdr, sizeof (hdr), 1, abfd) != sizeof (hdr)) {
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_wrong_format);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (strncmp(hdr.fl_magic, AIAMAG, SAIAMAG)) {
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_wrong_format);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* bfd_ardata() accesses the bfd->tdata field.
|
|
|
|
|
*/
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 16:02:09 +00:00
|
|
|
|
abfd->tdata.aout_ar_data =
|
|
|
|
|
(void *) bfd_zalloc(abfd, sizeof (*art) + sizeof (hdr));
|
1991-10-25 07:16:56 +00:00
|
|
|
|
if ((art = bfd_ardata (abfd)) == NULL) {
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_no_memory);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
art->first_file_filepos = atoi(hdr.fl_fstmoff);
|
|
|
|
|
*(struct fl_hdr *) (1 + art) = hdr;
|
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
/* Someday...
|
|
|
|
|
* slurp in the member table, which I think is the armap equivalent.
|
1991-10-25 07:16:56 +00:00
|
|
|
|
xcoff_slurp_armap(abfd);
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
return abfd->xvec;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
rs6000coff_stat_arch_elt(abfd, buf)
|
|
|
|
|
bfd *abfd;
|
|
|
|
|
struct stat *buf;
|
|
|
|
|
{
|
|
|
|
|
struct ar_hdr *hdr;
|
|
|
|
|
char *aloser;
|
|
|
|
|
|
|
|
|
|
if (abfd->arelt_data == NULL) {
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_invalid_operation);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hdr = arch_hdr (abfd);
|
|
|
|
|
|
|
|
|
|
#define foo(arelt, stelt, size) \
|
|
|
|
|
buf->stelt = strtol (hdr->arelt, &aloser, size); \
|
|
|
|
|
if (aloser == hdr->arelt) return -1;
|
|
|
|
|
|
|
|
|
|
foo (ar_date, st_mtime, 10);
|
|
|
|
|
foo (ar_uid, st_uid, 10);
|
|
|
|
|
foo (ar_gid, st_gid, 10);
|
|
|
|
|
foo (ar_mode, st_mode, 8);
|
|
|
|
|
foo (ar_size, st_size, 10);
|
1991-11-27 21:57:48 +00:00
|
|
|
|
#undef foo
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static boolean
|
|
|
|
|
rs6000coff_write_armap (arch, elength, map, orl_count, stridx)
|
|
|
|
|
bfd *arch;
|
|
|
|
|
unsigned int elength;
|
|
|
|
|
struct orl *map;
|
1994-02-15 01:28:16 +00:00
|
|
|
|
unsigned int orl_count;
|
|
|
|
|
int stridx;
|
1991-10-25 07:16:56 +00:00
|
|
|
|
{
|
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated).
* som.c: Do not blindly set bfd_error_system_call after a
failing bfd_read, bfd_write, or bfd_seek. In a few places
(like som_object_p) override the error status set by bfd_read.
* aix386-core.c, aout-encap,c archive.c, bout.c: Likewise.
* coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise.
* elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise.
* nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise.
* som.c: Check return values from several bfd_{seek,read,write}
calls that we just assumed were not failing.
1994-03-26 18:28:29 +00:00
|
|
|
|
bfd_set_error (bfd_error_invalid_operation);
|
1991-10-25 07:16:56 +00:00
|
|
|
|
return false;
|
|
|
|
|
}
|
1994-02-15 01:28:16 +00:00
|
|
|
|
#endif /* HOST_AIX */
|
1991-11-27 21:57:48 +00:00
|
|
|
|
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 16:02:09 +00:00
|
|
|
|
|
1994-02-15 01:28:16 +00:00
|
|
|
|
#define CORE_FILE_P _bfd_dummy_target
|
|
|
|
|
|
|
|
|
|
#ifdef HOST_AIX
|
|
|
|
|
#undef CORE_FILE_P
|
|
|
|
|
#define CORE_FILE_P rs6000coff_core_p
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 16:02:09 +00:00
|
|
|
|
extern bfd_target * rs6000coff_core_p ();
|
|
|
|
|
extern boolean rs6000coff_get_section_contents ();
|
|
|
|
|
extern boolean rs6000coff_core_file_matches_executable_p ();
|
1991-11-27 21:57:48 +00:00
|
|
|
|
|
|
|
|
|
#undef coff_core_file_matches_executable_p
|
|
|
|
|
#define coff_core_file_matches_executable_p \
|
|
|
|
|
rs6000coff_core_file_matches_executable_p
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
#undef coff_get_section_contents
|
|
|
|
|
#define coff_get_section_contents rs6000coff_get_section_contents
|
1994-02-15 01:28:16 +00:00
|
|
|
|
#endif /* HOST_AIX */
|
|
|
|
|
|
|
|
|
|
#ifdef HOST_LYNX
|
|
|
|
|
|
|
|
|
|
#undef CORE_FILE_P
|
|
|
|
|
#define CORE_FILE_P lynx_core_file_p
|
|
|
|
|
extern bfd_target *lynx_core_file_p PARAMS ((bfd *abfd));
|
|
|
|
|
|
|
|
|
|
extern boolean lynx_core_file_matches_executable_p PARAMS ((bfd *core_bfd,
|
|
|
|
|
bfd *exec_bfd));
|
|
|
|
|
#undef coff_core_file_matches_executable_p
|
|
|
|
|
#define coff_core_file_matches_executable_p lynx_core_file_matches_executable_p
|
|
|
|
|
|
|
|
|
|
extern char *lynx_core_file_failing_command PARAMS ((bfd *abfd));
|
|
|
|
|
#undef coff_core_file_failing_command
|
|
|
|
|
#define coff_core_file_failing_command lynx_core_file_failing_command
|
|
|
|
|
|
|
|
|
|
extern int lynx_core_file_failing_signal PARAMS ((bfd *abfd));
|
|
|
|
|
#undef coff_core_file_failing_signal
|
|
|
|
|
#define coff_core_file_failing_signal lynx_core_file_failing_signal
|
|
|
|
|
|
|
|
|
|
#endif /* HOST_LYNX */
|
1991-10-25 07:16:56 +00:00
|
|
|
|
|
1991-11-27 21:57:48 +00:00
|
|
|
|
/* The transfer vector that leads the outside world to all of the above. */
|
|
|
|
|
|
|
|
|
|
bfd_target rs6000coff_vec =
|
|
|
|
|
{
|
|
|
|
|
"aixcoff-rs6000", /* name */
|
|
|
|
|
bfd_target_coff_flavour,
|
|
|
|
|
true, /* data byte order is big */
|
|
|
|
|
true, /* header byte order is big */
|
|
|
|
|
|
|
|
|
|
(HAS_RELOC | EXEC_P | /* object flags */
|
|
|
|
|
HAS_LINENO | HAS_DEBUG |
|
* opncls.c (_bfd_new_bfd, _bfd_new_bfd_contained_in): Add
"_bfd_" to function names.
* archive.c (_bfd_create_empty_archive_element_shell),
libbfd-in.h: Change callers.
* libbfd.c (bfd_zmalloc): Renamed from zalloc.
* libbfd.c (bfd_add_to_string_table),
trad-core.c (trad_unix_core_file_p),
targets.c (bfd_target_list),
ptrace-core.c (ptrace_unix_core_file_p),
opncls.c (new_bfd), libbfd-in.h,
ieee.c (ieee_make_empty_symbol),
elf32-hppa.c (hppa_elf_stub_branch_reloc),
(hppa_elf_stub_reloc): Change callers.
* libbfd.h: Regenerated.
* archive.c (_bfd_look_for_bfd_in_cache): Add "_bfd_" to name.
(_bfd_get_elt_at_filepos),
coff-rs6000.c (rs6000coff_get_elt_at_filepos), libbfd-in.h:
Change callers.
* format.c (bfd_check_format_matches), libbfd-in.h, targets.c,
elfcode.h (elf_object_p): Rename target_vector to bfd_target_vector
and default_vector to bfd_default_vector.
* libbfd.h: Regenerated.
1994-01-25 13:25:26 +00:00
|
|
|
|
HAS_SYMS | HAS_LOCALS | WP_TEXT),
|
1991-11-27 21:57:48 +00:00
|
|
|
|
|
|
|
|
|
(SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
|
Some of these are guesses, if you know different, just yell.
Thu Oct 8 08:52:48 1992 Steve Chamberlain (sac@thepub.cygnus.com)
Now a bfd knows whether underscores are normally prepended
to symbols in its file format. Helps with error messages.
* aout-adobe.c, aout-target.h, bout.c, coff-a29k.c, coff-h8300.c,
coff-z8k.c: targets set so they have leading underscore
* coff-i386.c, coff-i960.c, coff-m68k.c, coff-mips.c, coff-m88k.c,
coff-rs6000.c, coff-we32k.c, elf.c, ieee.c, srec.c: targets set
without leading underscore flag
* targets.c: add symbol leading char to xvec description
* bfd-in.h (bfd_get_symbol_leading_char): new macro.
1992-10-08 16:02:09 +00:00
|
|
|
|
0, /* leading char */
|
1991-11-27 21:57:48 +00:00
|
|
|
|
'/', /* ar_pad_char */
|
|
|
|
|
15, /* ar_max_namelen??? FIXMEmgo */
|
|
|
|
|
3, /* default alignment power */
|
|
|
|
|
|
* opncls.c (_bfd_new_bfd, _bfd_new_bfd_contained_in): Add
"_bfd_" to function names.
* archive.c (_bfd_create_empty_archive_element_shell),
libbfd-in.h: Change callers.
* libbfd.c (bfd_zmalloc): Renamed from zalloc.
* libbfd.c (bfd_add_to_string_table),
trad-core.c (trad_unix_core_file_p),
targets.c (bfd_target_list),
ptrace-core.c (ptrace_unix_core_file_p),
opncls.c (new_bfd), libbfd-in.h,
ieee.c (ieee_make_empty_symbol),
elf32-hppa.c (hppa_elf_stub_branch_reloc),
(hppa_elf_stub_reloc): Change callers.
* libbfd.h: Regenerated.
* archive.c (_bfd_look_for_bfd_in_cache): Add "_bfd_" to name.
(_bfd_get_elt_at_filepos),
coff-rs6000.c (rs6000coff_get_elt_at_filepos), libbfd-in.h:
Change callers.
* format.c (bfd_check_format_matches), libbfd-in.h, targets.c,
elfcode.h (elf_object_p): Rename target_vector to bfd_target_vector
and default_vector to bfd_default_vector.
* libbfd.h: Regenerated.
1994-01-25 13:25:26 +00:00
|
|
|
|
bfd_getb64, bfd_getb_signed_64, bfd_putb64,
|
|
|
|
|
bfd_getb32, bfd_getb_signed_32, bfd_putb32,
|
|
|
|
|
bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
|
|
|
|
|
bfd_getb64, bfd_getb_signed_64, bfd_putb64,
|
|
|
|
|
bfd_getb32, bfd_getb_signed_32, bfd_putb32,
|
|
|
|
|
bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
|
1991-11-27 21:57:48 +00:00
|
|
|
|
|
|
|
|
|
{_bfd_dummy_target, coff_object_p, /* bfd_check_format */
|
1994-02-15 01:28:16 +00:00
|
|
|
|
coff_archive_p, CORE_FILE_P},
|
1991-11-27 21:57:48 +00:00
|
|
|
|
{bfd_false, coff_mkobject, coff_mkarchive, /* bfd_set_format */
|
|
|
|
|
bfd_false},
|
|
|
|
|
{bfd_false, coff_write_object_contents, /* bfd_write_contents */
|
|
|
|
|
_bfd_write_archive_contents, bfd_false},
|
|
|
|
|
|
|
|
|
|
JUMP_TABLE(coff),
|
* opncls.c (_bfd_new_bfd, _bfd_new_bfd_contained_in): Add
"_bfd_" to function names.
* archive.c (_bfd_create_empty_archive_element_shell),
libbfd-in.h: Change callers.
* libbfd.c (bfd_zmalloc): Renamed from zalloc.
* libbfd.c (bfd_add_to_string_table),
trad-core.c (trad_unix_core_file_p),
targets.c (bfd_target_list),
ptrace-core.c (ptrace_unix_core_file_p),
opncls.c (new_bfd), libbfd-in.h,
ieee.c (ieee_make_empty_symbol),
elf32-hppa.c (hppa_elf_stub_branch_reloc),
(hppa_elf_stub_reloc): Change callers.
* libbfd.h: Regenerated.
* archive.c (_bfd_look_for_bfd_in_cache): Add "_bfd_" to name.
(_bfd_get_elt_at_filepos),
coff-rs6000.c (rs6000coff_get_elt_at_filepos), libbfd-in.h:
Change callers.
* format.c (bfd_check_format_matches), libbfd-in.h, targets.c,
elfcode.h (elf_object_p): Rename target_vector to bfd_target_vector
and default_vector to bfd_default_vector.
* libbfd.h: Regenerated.
1994-01-25 13:25:26 +00:00
|
|
|
|
COFF_SWAP_TABLE,
|
1991-11-27 21:57:48 +00:00
|
|
|
|
};
|