* 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.
This commit is contained in:
Jeff Law 1994-03-26 18:28:29 +00:00
parent 649694ea87
commit 250578363e
16 changed files with 1009 additions and 1194 deletions

View File

@ -1,3 +1,20 @@
Sat Mar 26 10:25:43 1994 Jeffrey A. Law (law@snake.cs.utah.edu)
* 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.
Fri Mar 25 11:44:06 1994 Jim Kingdon (kingdon@lioth.cygnus.com)
* hosts/sysv4.h (HAVE_PROCFS): Add comments about ptx4.

View File

@ -88,10 +88,12 @@ aix386_core_file_p (abfd)
struct corehdr internal_core;
} *mergem;
bfd_set_error (bfd_error_system_call);
if (bfd_read ((PTR)longbuf, 1, sizeof (longbuf), abfd) != sizeof (longbuf))
return 0;
{
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
return 0;
}
if (strncmp(longbuf,COR_MAGIC,4)) return 0;
@ -108,7 +110,8 @@ aix386_core_file_p (abfd)
if ((bfd_read ((PTR) core, 1, core_size, abfd)) != core_size)
{
bfd_set_error (bfd_error_system_call);
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
bfd_release (abfd, (char *)mergem);
return 0;
}
@ -300,6 +303,12 @@ aix386_core_file_matches_executable_p (core_bfd, exec_bfd)
((boolean (*) PARAMS ((bfd *, struct bfd_link_info *))) bfd_false)
#define aix386_bfd_final_link \
((boolean (*) PARAMS ((bfd *, struct bfd_link_info *))) bfd_false)
#define aix386_bfd_copy_private_section_data \
((boolean (*) PARAMS ((bfd *, asection *, bfd *, asection *))) bfd_false)
#define aix386_bfd_copy_private_bfd_data \
((boolean (*) PARAMS ((bfd *, bfd *))) bfd_false)
#define aix386_bfd_is_local_label \
((boolean (*) PARAMS ((bfd *, asection *))) bfd_false)
/* If somebody calls any byte-swapping routines, shoot them. */
void

View File

@ -47,11 +47,13 @@ encap_object_p (abfd)
struct external_exec exec_bytes;
struct internal_exec exec;
bfd_set_error (bfd_error_system_call);
if (bfd_read ((PTR)magicbuf, 1, sizeof (magicbuf), abfd) !=
sizeof (magicbuf))
return 0;
{
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
return 0;
}
coff_magic = bfd_h_get_16 (abfd, magicbuf);
if (coff_magic != COFF_MAGIC)

View File

@ -194,7 +194,7 @@ _bfd_generic_mkarchive (abfd)
if (bfd_ardata (abfd) == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -236,7 +236,7 @@ bfd_get_next_mapent (abfd, prev, entry)
{
if (!bfd_has_map (abfd))
{
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return BFD_NO_MORE_SYMBOLS;
}
@ -260,7 +260,7 @@ _bfd_create_empty_archive_element_shell (obfd)
nbfd = _bfd_new_bfd_contained_in (obfd);
if (nbfd == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return NULL;
}
return nbfd;
@ -315,7 +315,7 @@ _bfd_add_bfd_to_archive_cache (arch_bfd, filepos, new_elt)
if (new_cache == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -353,7 +353,7 @@ get_extended_arelt_filename (arch, name)
index = strtol (name + 1, NULL, 10);
if (errno != 0)
{
bfd_error = malformed_archive;
bfd_set_error (bfd_error_malformed_archive);
return NULL;
}
@ -389,12 +389,12 @@ _bfd_snarf_ar_hdr (abfd)
if (bfd_read ((PTR) hdrp, 1, sizeof (struct ar_hdr), abfd)
!= sizeof (struct ar_hdr))
{
bfd_error = no_more_archived_files;
bfd_set_error (bfd_error_no_more_archived_files);
return NULL;
}
if (strncmp (hdr.ar_fmag, ARFMAG, 2))
{
bfd_error = malformed_archive;
bfd_set_error (bfd_error_malformed_archive);
return NULL;
}
@ -402,7 +402,7 @@ _bfd_snarf_ar_hdr (abfd)
parsed_size = strtol (hdr.ar_size, NULL, 10);
if (errno != 0)
{
bfd_error = malformed_archive;
bfd_set_error (bfd_error_malformed_archive);
return NULL;
}
@ -417,7 +417,7 @@ _bfd_snarf_ar_hdr (abfd)
filename = get_extended_arelt_filename (abfd, hdr.ar_name);
if (filename == NULL)
{
bfd_error = malformed_archive;
bfd_set_error (bfd_error_malformed_archive);
return NULL;
}
}
@ -434,7 +434,7 @@ _bfd_snarf_ar_hdr (abfd)
allocptr = bfd_zalloc (abfd, allocsize);
if (allocptr == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return NULL;
}
filename = (allocptr
@ -442,7 +442,7 @@ _bfd_snarf_ar_hdr (abfd)
+ sizeof (struct ar_hdr));
if (bfd_read (filename, 1, namelen, abfd) != namelen)
{
bfd_error = no_more_archived_files;
bfd_set_error (bfd_error_no_more_archived_files);
return NULL;
}
filename[namelen] = '\0';
@ -476,7 +476,7 @@ _bfd_snarf_ar_hdr (abfd)
allocptr = bfd_zalloc (abfd, allocsize);
if (allocptr == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return NULL;
}
}
@ -518,10 +518,7 @@ _bfd_get_elt_at_filepos (archive, filepos)
return n_nfd;
if (0 > bfd_seek (archive, filepos, SEEK_SET))
{
bfd_error = system_call_error;
return NULL;
}
return NULL;
if ((new_areldata = _bfd_snarf_ar_hdr (archive)) == NULL)
return NULL;
@ -595,7 +592,7 @@ bfd_openr_next_archived_file (archive, last_file)
if ((bfd_get_format (archive) != bfd_archive) ||
(archive->direction == write_direction))
{
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return NULL;
}
@ -636,7 +633,7 @@ bfd_generic_archive_p (abfd)
if (bfd_read ((PTR) armag, 1, SARMAG, abfd) != SARMAG)
{
bfd_error = wrong_format;
bfd_set_error (bfd_error_wrong_format);
return NULL;
}
@ -656,7 +653,7 @@ bfd_generic_archive_p (abfd)
if (bfd_ardata (abfd) == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return NULL;
}
@ -724,13 +721,13 @@ do_slurp_bsd_armap (abfd)
raw_armap = (bfd_byte *) bfd_zalloc (abfd, parsed_size);
if (raw_armap == (bfd_byte *) NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
if (bfd_read ((PTR) raw_armap, 1, parsed_size, abfd) != parsed_size)
{
bfd_error = malformed_archive;
bfd_set_error (bfd_error_malformed_archive);
byebye:
bfd_release (abfd, (PTR) raw_armap);
return false;
@ -742,7 +739,7 @@ do_slurp_bsd_armap (abfd)
parsed_size - BSD_SYMDEF_COUNT_SIZE)
{
/* Probably we're using the wrong byte ordering. */
bfd_error = wrong_format;
bfd_set_error (bfd_error_wrong_format);
goto byebye;
}
@ -756,7 +753,7 @@ do_slurp_bsd_armap (abfd)
* sizeof (carsym)));
if (!ardata->symdefs)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -803,7 +800,7 @@ do_slurp_coff_armap (abfd)
if (bfd_read ((PTR) int_buf, 1, 4, abfd) != 4)
{
bfd_error = malformed_archive;
bfd_set_error (bfd_error_malformed_archive);
return false;
}
/* It seems that all numeric information in a coff archive is always
@ -836,7 +833,7 @@ do_slurp_coff_armap (abfd)
ardata->symdefs = (carsym *) bfd_zalloc (abfd, carsym_size + stringsize + 1);
if (ardata->symdefs == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
carsyms = ardata->symdefs;
@ -846,13 +843,13 @@ do_slurp_coff_armap (abfd)
raw_armap = (int *) bfd_alloc (abfd, ptrsize);
if (raw_armap == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
goto release_symdefs;
}
if (bfd_read ((PTR) raw_armap, 1, ptrsize, abfd) != ptrsize
|| bfd_read ((PTR) stringbase, 1, stringsize, abfd) != stringsize)
{
bfd_error = malformed_archive;
bfd_set_error (bfd_error_malformed_archive);
goto release_raw_armap;
}
@ -954,7 +951,7 @@ bfd_slurp_bsd_armap_f2 (abfd)
raw_armap = (bfd_byte *) bfd_zalloc (abfd, mapdata->parsed_size);
if (raw_armap == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
byebye:
bfd_release (abfd, (PTR) mapdata);
return false;
@ -963,7 +960,7 @@ bfd_slurp_bsd_armap_f2 (abfd)
if (bfd_read ((PTR) raw_armap, 1, mapdata->parsed_size, abfd) !=
mapdata->parsed_size)
{
bfd_error = malformed_archive;
bfd_set_error (bfd_error_malformed_archive);
byebyebye:
bfd_release (abfd, (PTR) raw_armap);
goto byebye;
@ -975,7 +972,7 @@ bfd_slurp_bsd_armap_f2 (abfd)
> mapdata->parsed_size - HPUX_SYMDEF_COUNT_SIZE)
{
/* Probably we're using the wrong byte ordering. */
bfd_error = wrong_format;
bfd_set_error (bfd_error_wrong_format);
goto byebyebye;
}
@ -992,7 +989,7 @@ bfd_slurp_bsd_armap_f2 (abfd)
* BSD_SYMDEF_SIZE));
if (!ardata->symdefs)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -1054,7 +1051,7 @@ _bfd_slurp_extended_name_table (abfd)
bfd_zalloc (abfd, namedata->parsed_size);
if (bfd_ardata (abfd)->extended_names == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
byebye:
bfd_release (abfd, (PTR) namedata);
return false;
@ -1063,7 +1060,7 @@ _bfd_slurp_extended_name_table (abfd)
if (bfd_read ((PTR) bfd_ardata (abfd)->extended_names, 1,
namedata->parsed_size, abfd) != namedata->parsed_size)
{
bfd_error = malformed_archive;
bfd_set_error (bfd_error_malformed_archive);
bfd_release (abfd, (PTR) (bfd_ardata (abfd)->extended_names));
bfd_ardata (abfd)->extended_names = NULL;
goto byebye;
@ -1175,7 +1172,7 @@ bfd_construct_extended_name_table (abfd, tabloc, tablen)
if (!normal)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
thislen = strlen (normal);
@ -1189,7 +1186,7 @@ bfd_construct_extended_name_table (abfd, tabloc, tablen)
*tabloc = bfd_zalloc (abfd, total_namelen);
if (*tabloc == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -1204,7 +1201,7 @@ bfd_construct_extended_name_table (abfd, tabloc, tablen)
if (!normal)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
thislen = strlen (normal);
@ -1216,7 +1213,7 @@ bfd_construct_extended_name_table (abfd, tabloc, tablen)
struct ar_hdr *hdr = arch_hdr (current);
strcpy (strptr, normal);
strptr[thislen] = '\012';
hdr->ar_name[0] = ' ';
hdr->ar_name[0] = ar_padchar (current);
/* We know there will always be enough room (one of the few
cases where you may safely use sprintf). */
sprintf ((hdr->ar_name) + 1, "%-d", (unsigned) (strptr - *tabloc));
@ -1253,7 +1250,7 @@ bfd_ar_hdr_from_filesystem (abfd, filename)
if (stat (filename, &status) != 0)
{
bfd_error = system_call_error;
bfd_set_error (bfd_error_system_call);
return NULL;
}
@ -1261,13 +1258,13 @@ bfd_ar_hdr_from_filesystem (abfd, filename)
sizeof (struct areltdata));
if (ared == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return NULL;
}
hdr = (struct ar_hdr *) (((char *) ared) + sizeof (struct areltdata));
/* ar headers are space padded, not null padded! */
memset (hdr, ' ', sizeof (struct ar_hdr));
memset ((PTR) hdr, ' ', sizeof (struct ar_hdr));
strncpy (hdr->ar_fmag, ARFMAG, 2);
@ -1322,7 +1319,7 @@ bfd_generic_stat_arch_elt (abfd, buf)
if (abfd->arelt_data == NULL)
{
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return -1;
}
@ -1463,7 +1460,7 @@ _bfd_write_archive_contents (arch)
{
if (bfd_write_p (current))
{
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return false;
}
if (!current->arelt_data)
@ -1511,7 +1508,10 @@ _bfd_write_archive_contents (arch)
struct ar_hdr hdr;
memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
sprintf (&(hdr.ar_name[0]), "ARFILENAMES/");
if (ar_padchar (arch) == '/')
sprintf (&(hdr.ar_name[0]), "//");
else
sprintf (&(hdr.ar_name[0]), "ARFILENAMES/");
sprintf (&(hdr.ar_size[0]), "%-10d", (int) elength);
hdr.ar_fmag[0] = '`';
hdr.ar_fmag[1] = '\012';
@ -1532,13 +1532,9 @@ _bfd_write_archive_contents (arch)
/* write ar header */
if (bfd_write ((char *) hdr, 1, sizeof (*hdr), arch) != sizeof (*hdr))
{
syserr:
bfd_error = system_call_error;
return false;
}
return false;
if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
goto syserr;
return false;
while (remaining)
{
unsigned int amt = DEFAULT_BUFFERSIZE;
@ -1547,14 +1543,12 @@ _bfd_write_archive_contents (arch)
errno = 0;
if (bfd_read (buffer, amt, 1, current) != amt)
{
if (errno)
goto syserr;
/* Looks like a truncated archive. */
bfd_error = malformed_archive;
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_malformed_archive);
return false;
}
if (bfd_write (buffer, amt, 1, arch) != amt)
goto syserr;
return false;
remaining -= amt;
}
if ((arelt_size (current) % 2) == 1)
@ -1621,7 +1615,7 @@ compute_and_write_armap (arch, elength)
map = (struct orl *) malloc (orl_max * sizeof (struct orl));
if (map == NULL)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -1631,7 +1625,7 @@ compute_and_write_armap (arch, elength)
if (first_name == NULL)
{
free (map);
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -1666,7 +1660,7 @@ compute_and_write_armap (arch, elength)
{
free (map);
bfd_release (arch, first_name);
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
}
@ -1700,7 +1694,7 @@ compute_and_write_armap (arch, elength)
free (syms);
free (map);
bfd_release (arch, first_name);
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}

View File

@ -23,12 +23,17 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "sysdep.h"
#include "libbfd.h"
#include "bfdlink.h"
#include "genlink.h"
#include "bout.h"
#include "aout/stab_gnu.h"
#include "libaout.h" /* BFD a.out internal data structures */
static int aligncode PARAMS ((bfd *abfd, asection *input_section,
arelent *r, unsigned int shrink));
static void perform_slip PARAMS ((bfd *abfd, unsigned int slip,
asection *input_section, bfd_vma value));
static boolean b_out_squirt_out_relocs PARAMS ((bfd *abfd, asection *section));
static bfd_target *b_out_callback PARAMS ((bfd *));
static bfd_reloc_status_type calljx_callback
@ -39,11 +44,11 @@ static bfd_reloc_status_type callj_callback
unsigned int srcidx, unsigned int dstidx, asection *));
static bfd_vma get_value PARAMS ((arelent *, struct bfd_link_info *,
asection *));
static int abs32code PARAMS ((asection *, asymbol **, arelent *,
static int abs32code PARAMS ((bfd *, asection *, arelent *,
unsigned int, struct bfd_link_info *));
static boolean b_out_relax_section PARAMS ((bfd *, asection *,
struct bfd_link_info *,
asymbol **symbols));
boolean *));
static bfd_byte *b_out_get_relocated_section_contents
PARAMS ((bfd *, struct bfd_link_info *, struct bfd_link_order *,
bfd_byte *, boolean, asymbol **));
@ -52,10 +57,10 @@ static bfd_byte *b_out_get_relocated_section_contents
stream memory image, into the internal exec_header structure. */
void
DEFUN(bout_swap_exec_header_in,(abfd, raw_bytes, execp),
bfd *abfd AND
struct external_exec *raw_bytes AND
struct internal_exec *execp)
bout_swap_exec_header_in (abfd, raw_bytes, execp)
bfd *abfd;
struct external_exec *raw_bytes;
struct internal_exec *execp;
{
struct external_exec *bytes = (struct external_exec *)raw_bytes;
@ -84,10 +89,10 @@ PROTO(void, bout_swap_exec_header_out,
struct internal_exec *execp,
struct external_exec *raw_bytes));
void
DEFUN(bout_swap_exec_header_out,(abfd, execp, raw_bytes),
bfd *abfd AND
struct internal_exec *execp AND
struct external_exec *raw_bytes)
bout_swap_exec_header_out (abfd, execp, raw_bytes)
bfd *abfd;
struct internal_exec *execp;
struct external_exec *raw_bytes;
{
struct external_exec *bytes = (struct external_exec *)raw_bytes;
@ -473,7 +478,7 @@ b_out_slurp_reloc_table (abfd, asect, symbols)
count = reloc_size / sizeof (struct relocation_info);
relocs = (struct relocation_info *) malloc (reloc_size);
if (!relocs) {
if (!relocs && reloc_size != 0) {
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -485,7 +490,6 @@ b_out_slurp_reloc_table (abfd, asect, symbols)
}
if (bfd_read ((PTR) relocs, 1, reloc_size, abfd) != reloc_size) {
bfd_set_error (bfd_error_system_call);
free (reloc_cache);
free (relocs);
return false;
@ -669,7 +673,7 @@ b_out_squirt_out_relocs (abfd, section)
if (count == 0) return true;
generic = section->orelocation;
native = ((struct relocation_info *) malloc (natsize));
if (!native) {
if (!native && natsize != 0) {
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -900,9 +904,9 @@ b_out_set_arch_mach (abfd, arch, machine)
}
static int
DEFUN(b_out_sizeof_headers,(ignore_abfd, ignore),
bfd *ignore_abfd AND
boolean ignore)
b_out_sizeof_headers (ignore_abfd, ignore)
bfd *ignore_abfd;
boolean ignore;
{
return sizeof(struct internal_exec);
}
@ -961,12 +965,16 @@ get_value (reloc, link_info, input_section)
}
static void
DEFUN(perform_slip,(s, slip, input_section, value),
asymbol **s AND
unsigned int slip AND
asection *input_section AND
bfd_vma value)
perform_slip (abfd, slip, input_section, value)
bfd *abfd;
unsigned int slip;
asection *input_section;
bfd_vma value;
{
asymbol **s;
s = _bfd_generic_link_get_symbols (abfd);
BFD_ASSERT (s != (asymbol **) NULL);
/* Find all symbols past this point, and make them know
what's happened */
@ -979,6 +987,15 @@ DEFUN(perform_slip,(s, slip, input_section, value),
if (p->value > value)
{
p->value -=slip;
if (p->udata != NULL)
{
struct generic_link_hash_entry *h;
h = (struct generic_link_hash_entry *) p->udata;
BFD_ASSERT (h->root.type == bfd_link_hash_defined);
h->root.u.def.value -= slip;
BFD_ASSERT (h->root.u.def.value == p->value);
}
}
}
s++;
@ -991,9 +1008,9 @@ DEFUN(perform_slip,(s, slip, input_section, value),
If it can, then it changes the amode */
static int
abs32code (input_section, symbols, r, shrink, link_info)
abs32code (abfd, input_section, r, shrink, link_info)
bfd *abfd;
asection *input_section;
asymbol **symbols;
arelent *r;
unsigned int shrink;
struct bfd_link_info *link_info;
@ -1020,17 +1037,17 @@ abs32code (input_section, symbols, r, shrink, link_info)
/* This will be four bytes smaller in the long run */
shrink += 4 ;
perform_slip(symbols, 4, input_section, r->address-shrink +4);
perform_slip (abfd, 4, input_section, r->address-shrink + 4);
}
return shrink;
}
static int
DEFUN(aligncode,(input_section, symbols, r, shrink),
asection *input_section AND
asymbol **symbols AND
arelent *r AND
unsigned int shrink)
aligncode (abfd, input_section, r, shrink)
bfd *abfd;
asection *input_section;
arelent *r;
unsigned int shrink;
{
bfd_vma dot = output_addr (input_section) + r->address;
bfd_vma gap;
@ -1064,34 +1081,35 @@ DEFUN(aligncode,(input_section, symbols, r, shrink),
r->addend = old_end - dot + r->address;
/* This will be N bytes smaller in the long run, adjust all the symbols */
perform_slip(symbols, shrink_delta, input_section, r->address - shrink );
perform_slip (abfd, shrink_delta, input_section, r->address - shrink);
shrink += shrink_delta;
}
return shrink;
}
static boolean
b_out_relax_section (abfd, i, link_info, symbols)
b_out_relax_section (abfd, i, link_info, again)
bfd *abfd;
asection *i;
struct bfd_link_info *link_info;
asymbol **symbols;
boolean *again;
{
/* Get enough memory to hold the stuff */
bfd *input_bfd = i->owner;
asection *input_section = i;
int shrink = 0 ;
boolean new = false;
arelent **reloc_vector = NULL;
bfd_size_type reloc_size = bfd_get_reloc_upper_bound(input_bfd,
input_section);
/* We only run this relaxation once. It might work to run it
multiple times, but it hasn't been tested. */
*again = false;
if (reloc_size)
{
reloc_vector = (arelent **) malloc (reloc_size);
if (reloc_vector == NULL)
if (reloc_vector == NULL && reloc_size != 0)
{
bfd_set_error (bfd_error_no_memory);
goto error_return;
@ -1099,7 +1117,7 @@ b_out_relax_section (abfd, i, link_info, symbols)
/* Get the relocs and think about them */
if (bfd_canonicalize_reloc(input_bfd, input_section, reloc_vector,
symbols))
_bfd_generic_link_get_symbols (input_bfd)))
{
arelent **parent;
for (parent = reloc_vector; *parent; parent++)
@ -1109,13 +1127,12 @@ b_out_relax_section (abfd, i, link_info, symbols)
{
case ALIGNER:
/* An alignment reloc */
shrink = aligncode(input_section, symbols, r,shrink);
new=true;
shrink = aligncode (abfd, input_section, r, shrink);
break;
case ABS32CODE:
/* A 32bit reloc in an addressing mode */
shrink = abs32code (input_section, symbols, r, shrink, link_info);
new=true;
shrink = abs32code (input_bfd, input_section, r, shrink,
link_info);
break;
case ABS32CODE_SHRUNK:
shrink+=4;
@ -1128,7 +1145,7 @@ b_out_relax_section (abfd, i, link_info, symbols)
if (reloc_vector != NULL)
free (reloc_vector);
return new;
return true;
error_return:
if (reloc_vector != NULL)
free (reloc_vector);
@ -1160,7 +1177,7 @@ b_out_get_relocated_section_contents (in_abfd, link_info, link_order, data,
symbols);
reloc_vector = (arelent **) malloc (reloc_size);
if (reloc_vector == NULL)
if (reloc_vector == NULL && reloc_size != 0)
{
bfd_set_error (bfd_error_no_memory);
goto error_return;

View File

@ -499,7 +499,7 @@ static boolean
rs6000coff_mkarchive (abfd)
bfd *abfd;
{
bfd_error = invalid_operation; /* write not supported */
bfd_set_error (bfd_error_invalid_operation); /* write not supported */
return false;
}
@ -527,19 +527,19 @@ rs6000coff_snarf_ar_hdr (abfd)
size = sizeof (h.hdr);
if (bfd_read(&h.hdr, 1, size, abfd) != size) {
bfd_error = no_more_archived_files;
bfd_set_error (bfd_error_no_more_archived_files);
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) {
bfd_error = no_more_archived_files;
bfd_set_error (bfd_error_no_more_archived_files);
return NULL;
}
if (strncmp(h.hdr._ar_name.ar_fmag + size, AIAFMAG, 2)) {
bfd_error = malformed_archive;
bfd_set_error (bfd_error_malformed_archive);
return NULL;
}
@ -549,7 +549,7 @@ rs6000coff_snarf_ar_hdr (abfd)
* if the filename is NULL, we're (probably) at the end.
*/
if (size == 0) {
bfd_error = no_more_archived_files;
bfd_set_error (bfd_error_no_more_archived_files);
return NULL;
}
@ -557,7 +557,7 @@ rs6000coff_snarf_ar_hdr (abfd)
allocptr = bfd_zalloc(abfd, sizeof (*ared) + size);
if (allocptr == NULL) {
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return NULL;
}
@ -585,10 +585,8 @@ rs6000coff_get_elt_at_filepos (archive, filepos)
n_nfd = _bfd_look_for_bfd_in_cache (archive, filepos);
if (n_nfd) return n_nfd;
if (0 != bfd_seek (archive, filepos, SEEK_SET)) {
bfd_error = system_call_error;
if (0 != bfd_seek (archive, filepos, SEEK_SET))
return NULL;
}
if ((new_areldata = rs6000coff_snarf_ar_hdr (archive)) == NULL) return NULL;
@ -636,12 +634,12 @@ rs6000coff_archive_p (abfd)
register struct artdata *art;
if (bfd_read (&hdr, sizeof (hdr), 1, abfd) != sizeof (hdr)) {
bfd_error = wrong_format;
bfd_set_error (bfd_error_wrong_format);
return 0;
}
if (strncmp(hdr.fl_magic, AIAMAG, SAIAMAG)) {
bfd_error = wrong_format;
bfd_set_error (bfd_error_wrong_format);
return 0;
}
@ -651,7 +649,7 @@ rs6000coff_archive_p (abfd)
abfd->tdata.aout_ar_data =
(void *) bfd_zalloc(abfd, sizeof (*art) + sizeof (hdr));
if ((art = bfd_ardata (abfd)) == NULL) {
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return 0;
}
@ -676,7 +674,7 @@ rs6000coff_stat_arch_elt(abfd, buf)
char *aloser;
if (abfd->arelt_data == NULL) {
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return -1;
}
@ -704,7 +702,7 @@ rs6000coff_write_armap (arch, elength, map, orl_count, stridx)
unsigned int orl_count;
int stridx;
{
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return false;
}
#endif /* HOST_AIX */

View File

@ -46,10 +46,10 @@ static asection bfd_debug_section = { "*DEBUG*" };
/* Take a section header read from a coff file (in HOST byte order),
and make a BFD "section" out of it. This is used by ECOFF. */
static boolean
DEFUN(make_a_section_from_file,(abfd, hdr, target_index),
bfd *abfd AND
struct internal_scnhdr *hdr AND
unsigned int target_index)
make_a_section_from_file (abfd, hdr, target_index)
bfd *abfd;
struct internal_scnhdr *hdr;
unsigned int target_index;
{
asection *return_section;
char *name;
@ -113,11 +113,11 @@ DEFUN(make_a_section_from_file,(abfd, hdr, target_index),
static
bfd_target *
DEFUN(coff_real_object_p,(abfd, nscns, internal_f, internal_a),
bfd *abfd AND
unsigned nscns AND
struct internal_filehdr *internal_f AND
struct internal_aouthdr *internal_a)
coff_real_object_p (abfd, nscns, internal_f, internal_a)
bfd *abfd;
unsigned nscns;
struct internal_filehdr *internal_f;
struct internal_aouthdr *internal_a;
{
PTR tdata;
size_t readsize; /* length of file_info */
@ -187,8 +187,8 @@ DEFUN(coff_real_object_p,(abfd, nscns, internal_f, internal_a),
not a COFF file. This is also used by ECOFF. */
bfd_target *
DEFUN(coff_object_p,(abfd),
bfd *abfd)
coff_object_p (abfd)
bfd *abfd;
{
unsigned int filhsz;
unsigned int aoutsz;
@ -197,8 +197,6 @@ DEFUN(coff_object_p,(abfd),
struct internal_filehdr internal_f;
struct internal_aouthdr internal_a;
bfd_set_error (bfd_error_system_call);
/* figure out how much to read */
filhsz = bfd_coff_filhsz (abfd);
aoutsz = bfd_coff_aoutsz (abfd);
@ -207,7 +205,11 @@ DEFUN(coff_object_p,(abfd),
if (filehdr == NULL)
return 0;
if (bfd_read(filehdr, 1, filhsz, abfd) != filhsz)
return 0;
{
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
return 0;
}
bfd_coff_swap_filehdr_in(abfd, filehdr, &internal_f);
bfd_release (abfd, filehdr);
@ -241,9 +243,9 @@ DEFUN(coff_object_p,(abfd),
/* Get the BFD section from a COFF symbol section number. */
struct sec *
DEFUN(coff_section_from_bfd_index,(abfd, index),
bfd *abfd AND
int index)
coff_section_from_bfd_index (abfd, index)
bfd *abfd;
int index;
{
struct sec *answer = abfd->sections;
@ -286,9 +288,9 @@ bfd *abfd;
/* Canonicalize a COFF symbol table. */
unsigned int
DEFUN(coff_get_symtab, (abfd, alocation),
bfd *abfd AND
asymbol **alocation)
coff_get_symtab (abfd, alocation)
bfd *abfd;
asymbol **alocation;
{
unsigned int counter = 0;
coff_symbol_type *symbase;
@ -321,8 +323,8 @@ DEFUN(coff_get_symtab, (abfd, alocation),
/* Set lineno_count for the output sections of a COFF file. */
int
DEFUN(coff_count_linenumbers,(abfd),
bfd *abfd)
coff_count_linenumbers (abfd)
bfd *abfd;
{
unsigned int limit = bfd_get_symcount(abfd);
unsigned int i;
@ -366,9 +368,9 @@ DEFUN(coff_count_linenumbers,(abfd),
/*ARGSUSED*/
coff_symbol_type *
DEFUN(coff_symbol_from,(ignore_abfd, symbol),
bfd *ignore_abfd AND
asymbol *symbol)
coff_symbol_from (ignore_abfd, symbol)
bfd *ignore_abfd;
asymbol *symbol;
{
if (bfd_asymbol_flavour(symbol) != bfd_target_coff_flavour)
return (coff_symbol_type *)NULL;
@ -380,9 +382,9 @@ DEFUN(coff_symbol_from,(ignore_abfd, symbol),
}
static void
DEFUN(fixup_symbol_value,(coff_symbol_ptr, syment),
coff_symbol_type *coff_symbol_ptr AND
struct internal_syment *syment)
fixup_symbol_value (coff_symbol_ptr, syment)
coff_symbol_type *coff_symbol_ptr;
struct internal_syment *syment;
{
/* Normalize the symbol flags */
@ -426,8 +428,8 @@ struct internal_syment *syment)
*/
boolean
DEFUN(coff_renumber_symbols,(bfd_ptr),
bfd *bfd_ptr)
coff_renumber_symbols (bfd_ptr)
bfd *bfd_ptr;
{
unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
@ -559,10 +561,10 @@ static bfd_size_type debug_string_size;
static asection *debug_string_section;
static void
DEFUN(coff_fix_symbol_name,(abfd, symbol, native),
bfd *abfd AND
asymbol *symbol AND
combined_entry_type *native)
coff_fix_symbol_name (abfd, symbol, native)
bfd *abfd;
asymbol *symbol;
combined_entry_type *native;
{
unsigned int name_length;
union internal_auxent *auxent;
@ -646,11 +648,11 @@ DEFUN(coff_fix_symbol_name,(abfd, symbol, native),
#define set_index(symbol, idx) ((symbol)->udata =(PTR) (idx))
static unsigned int
DEFUN(coff_write_symbol,(abfd, symbol, native, written),
bfd *abfd AND
asymbol *symbol AND
combined_entry_type *native AND
unsigned int written)
coff_write_symbol (abfd, symbol, native, written)
bfd *abfd;
asymbol *symbol;
combined_entry_type *native;
unsigned int written;
{
unsigned int numaux = native->u.syment.n_numaux;
int type = native->u.syment.n_type;
@ -729,10 +731,10 @@ unsigned int written)
static unsigned int
DEFUN(coff_write_alien_symbol,(abfd, symbol, written),
bfd *abfd AND
asymbol *symbol AND
unsigned int written)
coff_write_alien_symbol (abfd, symbol, written)
bfd *abfd;
asymbol *symbol;
unsigned int written;
{
/*
This symbol has been created by the loader, or come from a non
@ -787,10 +789,10 @@ DEFUN(coff_write_alien_symbol,(abfd, symbol, written),
}
static unsigned int
DEFUN(coff_write_native_symbol,(abfd, symbol, written),
bfd *abfd AND
coff_symbol_type *symbol AND
unsigned int written)
coff_write_native_symbol (abfd, symbol, written)
bfd *abfd;
coff_symbol_type *symbol;
unsigned int written;
{
/*
Does this symbol have an ascociated line number - if so then
@ -846,8 +848,8 @@ I've been told this, but still need proof:
}
void
DEFUN(coff_write_symbols,(abfd),
bfd *abfd)
coff_write_symbols (abfd)
bfd *abfd;
{
unsigned int i;
unsigned int limit = bfd_get_symcount(abfd);
@ -929,8 +931,8 @@ DEFUN(coff_write_symbols,(abfd),
}
boolean
DEFUN(coff_write_linenumbers,(abfd),
bfd *abfd)
coff_write_linenumbers (abfd)
bfd *abfd;
{
asection *s;
bfd_size_type linesz;
@ -941,7 +943,7 @@ DEFUN(coff_write_linenumbers,(abfd),
if (!buff)
{
bfd_set_error (bfd_error_no_memory);
return;
return false;
}
for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
if (s->lineno_count) {
@ -981,9 +983,9 @@ DEFUN(coff_write_linenumbers,(abfd),
/*ARGSUSED*/
alent *
DEFUN(coff_get_lineno,(ignore_abfd, symbol),
bfd *ignore_abfd AND
asymbol *symbol)
coff_get_lineno (ignore_abfd, symbol)
bfd *ignore_abfd;
asymbol *symbol;
{
return coffsymbol(symbol)->lineno;
}
@ -1037,12 +1039,12 @@ coff_section_symbol (abfd, name)
pointers to syments. */
static void
DEFUN(coff_pointerize_aux,(abfd, table_base, type, class, auxent),
bfd *abfd AND
combined_entry_type *table_base AND
int type AND
int class AND
combined_entry_type *auxent)
coff_pointerize_aux (abfd, table_base, type, class, auxent)
bfd *abfd;
combined_entry_type *table_base;
int type;
int class;
combined_entry_type *auxent;
{
/* Don't bother if this is a file or a section */
if (class == C_STAT && type == T_NULL) return;
@ -1066,8 +1068,8 @@ combined_entry_type *auxent)
}
static char *
DEFUN(build_string_table,(abfd),
bfd *abfd)
build_string_table (abfd)
bfd *abfd;
{
char string_table_size_buffer[4];
unsigned int string_table_size;
@ -1077,10 +1079,8 @@ bfd *abfd)
symbols === the symbol table size. */
if (bfd_read((char *) string_table_size_buffer,
sizeof(string_table_size_buffer),
1, abfd) != sizeof(string_table_size)) {
bfd_set_error (bfd_error_system_call);
1, abfd) != sizeof(string_table_size))
return (NULL);
} /* on error */
string_table_size = bfd_h_get_32(abfd, (bfd_byte *) string_table_size_buffer);
@ -1088,10 +1088,8 @@ bfd *abfd)
bfd_set_error (bfd_error_no_memory);
return (NULL);
} /* on mallocation error */
if (bfd_read(string_table, string_table_size, 1, abfd) != string_table_size) {
bfd_set_error (bfd_error_system_call);
if (bfd_read(string_table, string_table_size, 1, abfd) != string_table_size)
return (NULL);
}
return string_table;
}
@ -1100,8 +1098,8 @@ bfd *abfd)
we didn't want to go to the trouble until someone needed it. */
static char *
DEFUN(build_debug_section,(abfd),
bfd *abfd)
build_debug_section (abfd)
bfd *abfd;
{
char *debug_section;
long position;
@ -1128,10 +1126,8 @@ DEFUN(build_debug_section,(abfd),
bfd_seek (abfd, sect->filepos, SEEK_SET);
if (bfd_read (debug_section,
bfd_get_section_size_before_reloc (sect), 1, abfd)
!= bfd_get_section_size_before_reloc(sect)) {
bfd_set_error (bfd_error_system_call);
!= bfd_get_section_size_before_reloc(sect))
return NULL;
}
bfd_seek (abfd, position, SEEK_SET);
return debug_section;
}
@ -1141,10 +1137,10 @@ DEFUN(build_debug_section,(abfd),
\0-terminated, but will not exceed 'maxlen' characters. The copy *will*
be \0-terminated. */
static char *
DEFUN(copy_name,(abfd, name, maxlen),
bfd *abfd AND
char *name AND
int maxlen)
copy_name (abfd, name, maxlen)
bfd *abfd;
char *name;
int maxlen;
{
int len;
char *newname;
@ -1170,8 +1166,8 @@ DEFUN(copy_name,(abfd, name, maxlen),
terminated string. */
combined_entry_type *
DEFUN(coff_get_normalized_symtab,(abfd),
bfd *abfd)
coff_get_normalized_symtab (abfd)
bfd *abfd;
{
combined_entry_type *internal;
combined_entry_type *internal_ptr;
@ -1212,10 +1208,8 @@ bfd *abfd)
}
if (bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET) == -1
|| bfd_read(raw, raw_size, 1, abfd) != raw_size) {
bfd_set_error (bfd_error_system_call);
|| bfd_read(raw, raw_size, 1, abfd) != raw_size)
return (NULL);
}
/* mark the end of the symbols */
raw_end = (char *) raw + bfd_get_symcount(abfd) * symesz;
/*
@ -1344,9 +1338,9 @@ bfd *abfd)
} /* coff_get_normalized_symtab() */
unsigned int
DEFUN (coff_get_reloc_upper_bound, (abfd, asect),
bfd *abfd AND
sec_ptr asect)
coff_get_reloc_upper_bound (abfd, asect)
bfd *abfd;
sec_ptr asect;
{
if (bfd_get_format(abfd) != bfd_object) {
bfd_set_error (bfd_error_invalid_operation);
@ -1356,8 +1350,8 @@ DEFUN (coff_get_reloc_upper_bound, (abfd, asect),
}
asymbol *
DEFUN (coff_make_empty_symbol, (abfd),
bfd *abfd)
coff_make_empty_symbol (abfd)
bfd *abfd;
{
coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
if (new == NULL) {
@ -1511,20 +1505,15 @@ coff_print_symbol (abfd, filep, symbol, how)
/*ARGSUSED*/
boolean
DEFUN(coff_find_nearest_line,(abfd,
section,
ignore_symbols,
offset,
filename_ptr,
functionname_ptr,
line_ptr),
bfd *abfd AND
asection *section AND
asymbol **ignore_symbols AND
bfd_vma offset AND
CONST char **filename_ptr AND
CONST char **functionname_ptr AND
unsigned int *line_ptr)
coff_find_nearest_line (abfd, section, ignore_symbols, offset, filename_ptr,
functionname_ptr, line_ptr)
bfd *abfd;
asection *section;
asymbol **ignore_symbols;
bfd_vma offset;
CONST char **filename_ptr;
CONST char **functionname_ptr;
unsigned int *line_ptr;
{
static bfd *cache_abfd;
static asection *cache_section;
@ -1619,9 +1608,9 @@ DEFUN(coff_find_nearest_line,(abfd,
}
int
DEFUN(coff_sizeof_headers,(abfd, reloc),
bfd *abfd AND
boolean reloc)
coff_sizeof_headers (abfd, reloc)
bfd *abfd;
boolean reloc;
{
size_t size;

View File

@ -646,10 +646,7 @@ ecoff_slurp_symbolic_header (abfd)
if (bfd_seek (abfd, ecoff_data (abfd)->sym_filepos, SEEK_SET) == -1
|| (bfd_read (raw, external_hdr_size, 1, abfd)
!= external_hdr_size))
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
internal_symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
(*backend->debug_swap.swap_hdr_in) (abfd, raw, internal_symhdr);
@ -755,7 +752,6 @@ ecoff_slurp_symbolic_info (abfd)
SEEK_SET) != 0
|| bfd_read (raw, raw_size, 1, abfd) != raw_size)
{
bfd_set_error (bfd_error_system_call);
bfd_release (abfd, raw);
return false;
}
@ -1831,10 +1827,7 @@ ecoff_slurp_reloc_table (abfd, section, symbols)
return false;
if (bfd_read (external_relocs, 1, external_relocs_size, abfd)
!= external_relocs_size)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
for (i = 0, rptr = internal_relocs; i < section->reloc_count; i++, rptr++)
{
@ -2505,8 +2498,6 @@ ecoff_write_object_contents (abfd)
struct internal_aouthdr internal_a;
int i;
bfd_set_error (bfd_error_system_call);
/* Determine where the sections and relocs will go in the output
file. */
reloc_size = ecoff_compute_reloc_file_positions (abfd);

View File

@ -269,6 +269,8 @@ static boolean elf32_hppa_backend_fake_sections
static boolean elf32_hppa_backend_section_from_bfd_section
PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));
static boolean som_bfd_is_local_label PARAMS ((bfd *, asymbol *));
/* ELF/PA relocation howto entries. */
static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
@ -1581,6 +1583,15 @@ elf_hppa_reloc_type_lookup (arch, code)
return NULL;
}
/* Return true if SYM represents a local label symbol. */
static boolean
hppa_elf_is_local_label (abfd, sym)
bfd *abfd;
asymbol *sym;
{
return (sym->name[0] == 'L' && sym->name[1] == '$');
}
/* Update the symbol extention chain to include the symbol pointed to
by SYMBOLP if SYMBOLP is a function symbol. Used internally and by GAS. */
@ -1934,7 +1945,7 @@ hppa_elf_stub_finish (output_bfd)
/* Make space to hold the relocations for the stub section. */
reloc_size = bfd_get_reloc_upper_bound (stub_bfd, stub_sec);
reloc_vector = (arelent **) malloc (reloc_size);
if (reloc_vector == NULL)
if (reloc_vector == NULL && reloc_size != 0)
{
/* FIXME: should be returning an error so the caller can
clean up */
@ -3133,16 +3144,10 @@ elf32_hppa_backend_symbol_table_processing (abfd, esyms,symcnt)
/* Read in the symextn section. */
if (bfd_seek (abfd, symextn_hdr->sh_offset, SEEK_SET) == -1)
{
bfd_set_error (bfd_error_system_call);
return (false);
}
return false;
if (bfd_read ((PTR) symextn_hdr->contents, 1, symextn_hdr->size, abfd)
!= symextn_hdr->size)
{
bfd_set_error (bfd_error_system_call);
return (false);
}
return false;
/* Parse entries in the symbol extension section, updating the symtab
entries as we go */
@ -3373,6 +3378,7 @@ elf32_hppa_backend_section_from_bfd_section (abfd, hdr, asect, ignored)
#define bfd_generic_get_section_contents hppa_elf_get_section_contents
#define bfd_elf32_set_section_contents hppa_elf_set_section_contents
#define bfd_elf32_bfd_is_local_label hppa_elf_is_local_label
#define elf_backend_section_processing elf32_hppa_backend_section_processing

View File

@ -853,7 +853,12 @@ elf_object_p (abfd)
/* Read in the ELF header in external format. */
if (bfd_read ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr))
goto got_system_call;
{
if (bfd_get_error () != bfd_error_system_call)
goto got_wrong_format_error;
else
goto got_no_match;
}
/* Now check to see if we have a valid ELF file, and one that BFD can
make use of. The magic number must match, the address size ('class')
@ -967,11 +972,11 @@ elf_object_p (abfd)
if (!i_shdrp || !elf_elfsections (abfd))
goto got_no_memory_error;
if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) == -1)
goto got_system_call;
goto got_no_match;
for (shindex = 0; shindex < i_ehdrp->e_shnum; shindex++)
{
if (bfd_read ((PTR) & x_shdr, sizeof x_shdr, 1, abfd) != sizeof (x_shdr))
goto got_system_call;
goto got_no_match;
elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
elf_elfsections (abfd)[shindex] = i_shdrp + shindex;
@ -1013,9 +1018,6 @@ elf_object_p (abfd)
/* If we are going to use goto's to avoid duplicating error setting
and return(NULL) code, then this at least makes it more maintainable. */
got_system_call:
bfd_set_error (bfd_error_system_call);
goto got_no_match;
got_wrong_format_error:
bfd_set_error (bfd_error_wrong_format);
goto got_no_match;
@ -1692,7 +1694,7 @@ map_program_segments (abfd)
struct seg_info *seg = NULL;
done = (char *) malloc (i_ehdrp->e_shnum);
if (done == NULL)
if (done == NULL && i_ehdrp->e_shnum != 0)
{
bfd_set_error (bfd_error_no_memory);
goto error_return;
@ -2587,10 +2589,7 @@ elf_slurp_symbol_table (abfd, symptrs)
build the caller's pointer vector. */
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
symcount = hdr->sh_size / sizeof (Elf_External_Sym);
@ -2601,10 +2600,7 @@ elf_slurp_symbol_table (abfd, symptrs)
long i;
if (bfd_seek (abfd, hdr->sh_offset, SEEK_SET) == -1)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
symbase = ((elf_symbol_type *)
bfd_zalloc (abfd, symcount * sizeof (elf_symbol_type)));
@ -2618,7 +2614,7 @@ elf_slurp_symbol_table (abfd, symptrs)
/* Temporarily allocate room for the raw ELF symbols. */
x_symp = ((Elf_External_Sym *)
malloc (symcount * sizeof (Elf_External_Sym)));
if (x_symp == NULL)
if (x_symp == NULL && symcount != 0)
{
bfd_set_error (bfd_error_no_memory);
goto error_return;
@ -2626,10 +2622,7 @@ elf_slurp_symbol_table (abfd, symptrs)
if (bfd_read ((PTR) x_symp, sizeof (Elf_External_Sym), symcount, abfd)
!= symcount * sizeof (Elf_External_Sym))
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Skip first symbol, which is a null dummy. */
for (i = 1; i < symcount; i++)
{
@ -3569,7 +3562,8 @@ elf_core_file_p (abfd)
if (bfd_read ((PTR) & x_ehdr, sizeof (x_ehdr), 1, abfd) != sizeof (x_ehdr))
{
bfd_set_error (bfd_error_system_call);
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
return NULL;
}
@ -3686,18 +3680,12 @@ elf_core_file_p (abfd)
return NULL;
}
if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) == -1)
{
bfd_set_error (bfd_error_system_call);
return NULL;
}
return NULL;
for (phindex = 0; phindex < i_ehdrp->e_phnum; phindex++)
{
if (bfd_read ((PTR) & x_phdr, sizeof (x_phdr), 1, abfd)
!= sizeof (x_phdr))
{
bfd_set_error (bfd_error_system_call);
return NULL;
}
return NULL;
elf_swap_phdr_in (abfd, &x_phdr, i_phdrp + phindex);
}

View File

@ -187,26 +187,26 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Set parameters about this a.out file that are machine-dependent.
This routine is called from some_aout_object_p just before it returns. */
static bfd_target *
DEFUN(MY(callback),(abfd),
bfd *abfd)
MY (callback) (abfd)
bfd *abfd;
{
struct internal_exec *execp = exec_hdr (abfd);
/* Calculate the file positions of the parts of a newly read aout header */
obj_textsec (abfd)->_raw_size = N_TXTSIZE(*execp);
obj_textsec (abfd)->_raw_size = N_TXTSIZE (*execp);
/* The virtual memory addresses of the sections */
obj_textsec (abfd)->vma = N_TXTADDR(*execp);
obj_datasec (abfd)->vma = N_DATADDR(*execp);
obj_bsssec (abfd)->vma = N_BSSADDR(*execp);
obj_textsec (abfd)->vma = N_TXTADDR (*execp);
obj_datasec (abfd)->vma = N_DATADDR (*execp);
obj_bsssec (abfd)->vma = N_BSSADDR (*execp);
/* The file offsets of the sections */
obj_textsec (abfd)->filepos = N_TXTOFF (*execp);
obj_datasec (abfd)->filepos = N_DATOFF (*execp);
/* The file offsets of the relocation info */
obj_textsec (abfd)->rel_filepos = N_TRELOFF(*execp);
obj_datasec (abfd)->rel_filepos = N_DRELOFF(*execp);
obj_textsec (abfd)->rel_filepos = N_TRELOFF (*execp);
obj_datasec (abfd)->rel_filepos = N_DRELOFF (*execp);
/* The file offsets of the string table and symbol table. */
obj_sym_filepos (abfd) = N_SYMOFF (*execp);
@ -214,161 +214,163 @@ DEFUN(MY(callback),(abfd),
/* Determine the architecture and machine type of the object file. */
#ifdef SET_ARCH_MACH
SET_ARCH_MACH(abfd, *execp);
SET_ARCH_MACH (abfd, *execp);
#else
bfd_default_set_arch_mach(abfd, DEFAULT_ARCH, 0);
bfd_default_set_arch_mach (abfd, DEFAULT_ARCH, 0);
#endif
if (obj_aout_subformat(abfd) == gnu_encap_format)
{
if (obj_aout_subformat (abfd) == gnu_encap_format)
{
/* The file offsets of the relocation info */
obj_textsec (abfd)->rel_filepos = N_GNU_TRELOFF(*execp);
obj_datasec (abfd)->rel_filepos = N_GNU_DRELOFF(*execp);
obj_textsec (abfd)->rel_filepos = N_GNU_TRELOFF (*execp);
obj_datasec (abfd)->rel_filepos = N_GNU_DRELOFF (*execp);
/* The file offsets of the string table and symbol table. */
obj_sym_filepos (abfd) = N_GNU_SYMOFF(*execp);
obj_sym_filepos (abfd) = N_GNU_SYMOFF (*execp);
obj_str_filepos (abfd) = (obj_sym_filepos (abfd) + execp->a_syms);
abfd->flags |= HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS;
bfd_get_symcount (abfd) = execp->a_syms / 12;
obj_symbol_entry_size (abfd) = 12;
obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
}
}
return abfd->xvec;
}
extern boolean aout_32_write_syms PARAMS ((bfd *abfd));
extern boolean aout_32_write_syms PARAMS ((bfd * abfd));
static boolean
DEFUN(MY(write_object_contents),(abfd),
bfd *abfd)
MY (write_object_contents) (abfd)
bfd *abfd;
{
struct external_exec exec_bytes;
struct internal_exec *execp = exec_hdr (abfd);
bfd_size_type text_size; /* dummy vars */
file_ptr text_end;
struct external_exec exec_bytes;
struct internal_exec *execp = exec_hdr (abfd);
bfd_size_type text_size; /* dummy vars */
file_ptr text_end;
memset (&exec_bytes, 0, sizeof (exec_bytes));
memset (&exec_bytes, 0, sizeof (exec_bytes));
#if CHOOSE_RELOC_SIZE
CHOOSE_RELOC_SIZE(abfd);
CHOOSE_RELOC_SIZE (abfd);
#else
obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
#endif
if (adata(abfd).magic == undecided_magic)
NAME(aout,adjust_sizes_and_vmas) (abfd, &text_size, &text_end);
execp->a_syms = 0;
if (adata (abfd).magic == undecided_magic)
NAME (aout, adjust_sizes_and_vmas) (abfd, &text_size, &text_end);
execp->a_syms = 0;
execp->a_entry = bfd_get_start_address (abfd);
execp->a_entry = bfd_get_start_address (abfd);
execp->a_trsize = ((obj_textsec (abfd)->reloc_count) *
obj_reloc_entry_size (abfd));
execp->a_drsize = ((obj_datasec (abfd)->reloc_count) *
obj_reloc_entry_size (abfd));
execp->a_trsize = ((obj_textsec (abfd)->reloc_count) *
obj_reloc_entry_size (abfd));
execp->a_drsize = ((obj_datasec (abfd)->reloc_count) *
obj_reloc_entry_size (abfd));
N_SET_MACHTYPE(*execp, 0xc);
N_SET_FLAGS (*execp, 0x2);
N_SET_MACHTYPE (*execp, 0xc);
N_SET_FLAGS (*execp, 0x2);
NAME(aout,swap_exec_header_out) (abfd, execp, &exec_bytes);
NAME (aout, swap_exec_header_out) (abfd, execp, &exec_bytes);
/* update fields not covered by default swap_exec_header_out */
/* update fields not covered by default swap_exec_header_out */
/* this is really the sym table size but we store it in drelocs */
bfd_h_put_32 (abfd, bfd_get_symcount (abfd) * 12, exec_bytes.e_drelocs);
/* this is really the sym table size but we store it in drelocs */
bfd_h_put_32 (abfd, bfd_get_symcount (abfd) * 12, exec_bytes.e_drelocs);
bfd_seek (abfd, 0L, false);
bfd_write ((PTR) &exec_bytes, 1, EXEC_BYTES_SIZE, abfd);
bfd_seek (abfd, 0L, false);
bfd_write ((PTR) & exec_bytes, 1, EXEC_BYTES_SIZE, abfd);
/* Write out the symbols, and then the relocs. We must write out
/* Write out the symbols, and then the relocs. We must write out
the symbols first so that we know the symbol indices. */
if (bfd_get_symcount (abfd) != 0)
{
/* Skip the relocs to where we want to put the symbols. */
if (bfd_seek (abfd, (file_ptr) N_DRELOFF (*execp) + execp->a_drsize,
SEEK_SET) != 0)
return false;
}
if (! MY(write_syms) (abfd))
return false;
if (bfd_get_symcount (abfd) != 0)
{
bfd_seek (abfd, (long)(N_TRELOFF(*execp)), false);
if (!NAME(aout,squirt_out_relocs) (abfd, obj_textsec (abfd))) return false;
bfd_seek (abfd, (long)(N_DRELOFF(*execp)), false);
if (!NAME(aout,squirt_out_relocs)(abfd, obj_datasec (abfd))) return false;
if (bfd_get_symcount (abfd) != 0)
{
/* Skip the relocs to where we want to put the symbols. */
if (bfd_seek (abfd, (file_ptr) N_DRELOFF (*execp) + execp->a_drsize,
SEEK_SET) != 0)
return false;
}
return true;
}
if (!MY (write_syms) (abfd))
return false;
if (bfd_get_symcount (abfd) != 0)
{
bfd_seek (abfd, (long) (N_TRELOFF (*execp)), false);
if (!NAME (aout, squirt_out_relocs) (abfd, obj_textsec (abfd)))
return false;
bfd_seek (abfd, (long) (N_DRELOFF (*execp)), false);
if (!NAME (aout, squirt_out_relocs) (abfd, obj_datasec (abfd)))
return false;
}
return true;
}
/* convert the hp symbol type to be the same as aout64.h usage so we */
/* can piggyback routines in aoutx.h. */
static void
DEFUN(convert_sym_type,(sym_pointer, cache_ptr, abfd),
struct external_nlist *sym_pointer AND
aout_symbol_type *cache_ptr AND
bfd *abfd)
convert_sym_type (sym_pointer, cache_ptr, abfd)
struct external_nlist *sym_pointer;
aout_symbol_type *cache_ptr;
bfd *abfd;
{
int name_type;
int new_type;
int name_type;
int new_type;
name_type = (cache_ptr->type);
new_type = 0;
name_type = (cache_ptr->type);
new_type = 0;
if ((name_type & HP_SYMTYPE_ALIGN) != 0)
if ((name_type & HP_SYMTYPE_ALIGN) != 0)
{
/* iou_error ("aligned symbol encountered: %s", name);*/
name_type = 0;
/* iou_error ("aligned symbol encountered: %s", name);*/
name_type = 0;
}
if (name_type == HP_SYMTYPE_FILENAME)
new_type = N_FN;
else
{
switch (name_type & HP_SYMTYPE_TYPE)
{
case HP_SYMTYPE_UNDEFINED:
new_type = N_UNDF;
break;
if (name_type == HP_SYMTYPE_FILENAME)
new_type = N_FN;
else
{
switch (name_type & HP_SYMTYPE_TYPE)
{
case HP_SYMTYPE_UNDEFINED:
new_type = N_UNDF;
break;
case HP_SYMTYPE_ABSOLUTE:
new_type = N_ABS;
break;
case HP_SYMTYPE_ABSOLUTE:
new_type = N_ABS;
break;
case HP_SYMTYPE_TEXT:
new_type = N_TEXT;
break;
case HP_SYMTYPE_TEXT:
new_type = N_TEXT;
break;
case HP_SYMTYPE_DATA:
new_type = N_DATA;
break;
case HP_SYMTYPE_DATA:
new_type = N_DATA;
break;
case HP_SYMTYPE_BSS:
new_type = N_BSS;
break;
case HP_SYMTYPE_BSS:
new_type = N_BSS;
break;
case HP_SYMTYPE_COMMON:
new_type = N_COMM;
break;
case HP_SYMTYPE_COMMON:
new_type = N_COMM;
break;
default:
fprintf (stderr, "unknown symbol type encountered: %x", name_type);
}
if (name_type & HP_SYMTYPE_EXTERNAL)
new_type |= N_EXT;
default:
fprintf (stderr, "unknown symbol type encountered: %x", name_type);
}
if (name_type & HP_SYMTYPE_EXTERNAL)
new_type |= N_EXT;
if (name_type & HP_SECONDARY_SYMBOL)
new_type = (new_type & ~N_TYPE) | N_INDR;
}
cache_ptr->type = new_type;
if (name_type & HP_SECONDARY_SYMBOL)
new_type = (new_type & ~N_TYPE) | N_INDR;
}
cache_ptr->type = new_type;
}
@ -381,12 +383,12 @@ DESCRIPTION
*/
void
DEFUN(NAME(aout,swap_exec_header_in),(abfd, raw_bytes, execp),
bfd *abfd AND
struct external_exec *raw_bytes AND
struct internal_exec *execp)
NAME (aout, swap_exec_header_in) (abfd, raw_bytes, execp)
bfd *abfd;
struct external_exec *raw_bytes;
struct internal_exec *execp;
{
struct external_exec *bytes = (struct external_exec *)raw_bytes;
struct external_exec *bytes = (struct external_exec *) raw_bytes;
/* The internal_exec structure has some fields that are unused in this
configuration (IE for i960), so ensure that all such uninitialized
@ -394,12 +396,12 @@ DEFUN(NAME(aout,swap_exec_header_in),(abfd, raw_bytes, execp),
are memcmp'd, and thus the contents do matter. */
memset (execp, 0, sizeof (struct internal_exec));
/* Now fill in fields in the execp, from the bytes in the raw data. */
execp->a_info = bfd_h_get_32 (abfd, bytes->e_info);
execp->a_text = GET_WORD (abfd, bytes->e_text);
execp->a_data = GET_WORD (abfd, bytes->e_data);
execp->a_bss = GET_WORD (abfd, bytes->e_bss);
execp->a_syms = GET_WORD (abfd, bytes->e_syms);
execp->a_entry = GET_WORD (abfd, bytes->e_entry);
execp->a_info = bfd_h_get_32 (abfd, bytes->e_info);
execp->a_text = GET_WORD (abfd, bytes->e_text);
execp->a_data = GET_WORD (abfd, bytes->e_data);
execp->a_bss = GET_WORD (abfd, bytes->e_bss);
execp->a_syms = GET_WORD (abfd, bytes->e_syms);
execp->a_entry = GET_WORD (abfd, bytes->e_entry);
execp->a_trsize = GET_WORD (abfd, bytes->e_trsize);
execp->a_drsize = GET_WORD (abfd, bytes->e_drsize);
@ -410,29 +412,35 @@ DEFUN(NAME(aout,swap_exec_header_in),(abfd, raw_bytes, execp),
/* to be set. */
/***************************************************************/
do
{
{
long syms;
struct aout_data_struct *rawptr;
if (bfd_h_get_32 (abfd, bytes->e_passize) != 0) break;
if (bfd_h_get_32 (abfd, bytes->e_syms) != 0) break;
if (bfd_h_get_32 (abfd, bytes->e_supsize) != 0) break;
struct aout_data_struct *rawptr;
if (bfd_h_get_32 (abfd, bytes->e_passize) != 0)
break;
if (bfd_h_get_32 (abfd, bytes->e_syms) != 0)
break;
if (bfd_h_get_32 (abfd, bytes->e_supsize) != 0)
break;
syms = bfd_h_get_32 (abfd, bytes->e_drelocs);
if (syms == 0) break;
if (syms == 0)
break;
/* OK, we've passed the test as best as we can determine */
execp->a_syms = syms;
/* allocate storage for where we will store this result */
rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, sizeof (*rawptr));
rawptr = (struct aout_data_struct *) bfd_zalloc (abfd, sizeof (*rawptr));
if (rawptr == NULL) {
bfd_error = no_memory;
return;
}
if (rawptr == NULL)
{
bfd_set_error (bfd_error_no_memory);
return;
}
abfd->tdata.aout_data = rawptr;
obj_aout_subformat(abfd) = gnu_encap_format;
} while (0);
obj_aout_subformat (abfd) = gnu_encap_format;
}
while (0);
}
@ -460,8 +468,8 @@ DEFUN(NAME(aout,swap_exec_header_in),(abfd, raw_bytes, execp),
*/
boolean
DEFUN(MY(slurp_symbol_table),(abfd),
bfd *abfd)
MY (slurp_symbol_table) (abfd)
bfd *abfd;
{
bfd_size_type symbol_bytes;
struct external_nlist *syms;
@ -473,50 +481,52 @@ DEFUN(MY(slurp_symbol_table),(abfd),
unsigned num_secondary = 0;
/* If there's no work to be done, don't do any */
if (obj_aout_symbols (abfd) != (aout_symbol_type *)NULL) return true;
symbol_bytes = exec_hdr(abfd)->a_syms;
if (symbol_bytes == 0) {
bfd_error = no_symbols;
return false;
}
if (obj_aout_symbols (abfd) != (aout_symbol_type *) NULL)
return true;
symbol_bytes = exec_hdr (abfd)->a_syms;
if (symbol_bytes == 0)
{
bfd_set_error (bfd_error_no_symbols);
return false;
}
strings = (char *) bfd_alloc(abfd,
symbol_bytes + SYM_EXTRA_BYTES);
strings = (char *) bfd_alloc (abfd,
symbol_bytes + SYM_EXTRA_BYTES);
if (!strings)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
syms = (struct external_nlist *) (strings + SYM_EXTRA_BYTES);
bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET);
if (bfd_read ((PTR)syms, symbol_bytes, 1, abfd) != symbol_bytes)
{
if (bfd_read ((PTR) syms, symbol_bytes, 1, abfd) != symbol_bytes)
{
bfd_release (abfd, syms);
return false;
}
}
sym_end = (struct external_nlist *) (((char *)syms) + symbol_bytes);
sym_end = (struct external_nlist *) (((char *) syms) + symbol_bytes);
/* first, march thru the table and figure out how many symbols there are */
for (sym_pointer = syms; sym_pointer < sym_end; sym_pointer++, num_syms++)
{
if (bfd_get_8(abfd, sym_pointer->e_type) & HP_SECONDARY_SYMBOL)
num_secondary++;
{
if (bfd_get_8 (abfd, sym_pointer->e_type) & HP_SECONDARY_SYMBOL)
num_secondary++;
/* skip over the embedded symbol. */
sym_pointer = (struct external_nlist *) (((char *)sym_pointer) +
sym_pointer->e_length[0]);
}
sym_pointer = (struct external_nlist *) (((char *) sym_pointer) +
sym_pointer->e_length[0]);
}
/* now that we know the symbol count, update the bfd header */
bfd_get_symcount (abfd) = num_syms+num_secondary;
bfd_get_symcount (abfd) = num_syms + num_secondary;
cached = (aout_symbol_type *)
bfd_zalloc(abfd, (bfd_size_type)(bfd_get_symcount (abfd) *
sizeof(aout_symbol_type)));
bfd_zalloc (abfd, (bfd_size_type) (bfd_get_symcount (abfd) *
sizeof (aout_symbol_type)));
if (!cached)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -527,82 +537,82 @@ DEFUN(MY(slurp_symbol_table),(abfd),
num_secondary = 0;
/* OK, now walk the new symtable, cacheing symbol properties */
{
aout_symbol_type *cache_ptr = cached;
aout_symbol_type cache_save;
/* Run through table and copy values */
for (sym_pointer = syms, cache_ptr = cached;
sym_pointer < sym_end; sym_pointer++, cache_ptr++)
{
aout_symbol_type *cache_ptr = cached;
aout_symbol_type cache_save;
/* Run through table and copy values */
for (sym_pointer = syms, cache_ptr = cached;
sym_pointer < sym_end; sym_pointer++, cache_ptr++)
{
unsigned int length;
cache_ptr->symbol.the_bfd = abfd;
cache_ptr->symbol.value = GET_SWORD (abfd, sym_pointer->e_value);
cache_ptr->desc = bfd_get_16 (abfd, sym_pointer->e_almod);
cache_ptr->type = bfd_get_8 (abfd, sym_pointer->e_type);
cache_ptr->symbol.udata = 0;
length = bfd_get_8 (abfd, sym_pointer->e_length);
cache_ptr->other = length; /* other not used, save length here */
cache_save = *cache_ptr;
convert_sym_type (sym_pointer, cache_ptr, abfd);
if (!translate_from_native_sym_flags (sym_pointer, cache_ptr, abfd))
return false;
/********************************************************/
/* for hpux, the 'lenght' value indicates the length of */
/* the symbol name which follows the nlist entry. */
/********************************************************/
if (length)
{
unsigned int length;
cache_ptr->symbol.the_bfd = abfd;
cache_ptr->symbol.value = GET_SWORD(abfd, sym_pointer->e_value);
cache_ptr->desc = bfd_get_16(abfd, sym_pointer->e_almod);
cache_ptr->type = bfd_get_8(abfd, sym_pointer->e_type);
cache_ptr->symbol.udata = 0;
length = bfd_get_8(abfd, sym_pointer->e_length);
cache_ptr->other = length; /* other not used, save length here */
cache_save = *cache_ptr;
convert_sym_type(sym_pointer, cache_ptr, abfd);
if (!translate_from_native_sym_flags (sym_pointer, cache_ptr, abfd))
return false;
/********************************************************/
/* for hpux, the 'lenght' value indicates the length of */
/* the symbol name which follows the nlist entry. */
/********************************************************/
if (length)
{
/**************************************************************/
/* the hp string is not null terminated so we create a new one*/
/* by copying the string to overlap the just vacated nlist */
/* structure before it in memory. */
/**************************************************************/
cache_ptr->symbol.name = strings;
memcpy(strings, sym_pointer+1, length);
strings[length] = '\0';
strings += length + 1;
}
else
cache_ptr->symbol.name = (char *)NULL;
/**********************************************************/
/* this is a bit of a kludge, but a secondary hp symbol */
/* gets translated into a gnu indirect symbol. When this */
/* happens, we need to create a "dummy" record to which */
/* we can point the indirect symbol to. */
/**********************************************************/
if ((cache_ptr->type | N_EXT) == (N_INDR | N_EXT))
{
aout_symbol_type *cache_ptr2 = cached + num_syms+num_secondary;
num_secondary++;
/* aoutx.h assumes the "next" value is the indirect sym */
/* since we don't want to disturb the order by inserting */
/* a new symbol, we tack on the created secondary syms */
/* at the end. */
cache_ptr->symbol.value = (bfd_vma)(cache_ptr2);
*cache_ptr2 = cache_save;
cache_ptr2->symbol.name = strings;
memcpy(strings, cache_ptr->symbol.name, length);
strcpy(strings+length,":secondry"); /* 9 max chars + null */
strings += length+10;
cache_ptr2->type &= ~HP_SECONDARY_SYMBOL; /* clear secondary */
convert_sym_type(sym_pointer, cache_ptr2, abfd);
if (!translate_from_native_sym_flags (sym_pointer, cache_ptr2,
abfd))
return false;
}
/* skip over the embedded symbol. */
sym_pointer = (struct external_nlist *) (((char *)sym_pointer) +
length);
/**************************************************************/
/* the hp string is not null terminated so we create a new one*/
/* by copying the string to overlap the just vacated nlist */
/* structure before it in memory. */
/**************************************************************/
cache_ptr->symbol.name = strings;
memcpy (strings, sym_pointer + 1, length);
strings[length] = '\0';
strings += length + 1;
}
}
else
cache_ptr->symbol.name = (char *) NULL;
obj_aout_symbols (abfd) = cached;
/**********************************************************/
/* this is a bit of a kludge, but a secondary hp symbol */
/* gets translated into a gnu indirect symbol. When this */
/* happens, we need to create a "dummy" record to which */
/* we can point the indirect symbol to. */
/**********************************************************/
if ((cache_ptr->type | N_EXT) == (N_INDR | N_EXT))
{
aout_symbol_type *cache_ptr2 = cached + num_syms + num_secondary;
num_secondary++;
/* aoutx.h assumes the "next" value is the indirect sym */
/* since we don't want to disturb the order by inserting */
/* a new symbol, we tack on the created secondary syms */
/* at the end. */
cache_ptr->symbol.value = (bfd_vma) (cache_ptr2);
*cache_ptr2 = cache_save;
cache_ptr2->symbol.name = strings;
memcpy (strings, cache_ptr->symbol.name, length);
strcpy (strings + length, ":secondry"); /* 9 max chars + null */
strings += length + 10;
cache_ptr2->type &= ~HP_SECONDARY_SYMBOL; /* clear secondary */
convert_sym_type (sym_pointer, cache_ptr2, abfd);
if (!translate_from_native_sym_flags (sym_pointer, cache_ptr2,
abfd))
return false;
}
/* skip over the embedded symbol. */
sym_pointer = (struct external_nlist *) (((char *) sym_pointer) +
length);
}
}
obj_aout_symbols (abfd) = cached;
return true;
}
@ -610,49 +620,49 @@ DEFUN(MY(slurp_symbol_table),(abfd),
void
DEFUN(MY(swap_std_reloc_in), (abfd, bytes, cache_ptr, symbols),
bfd *abfd AND
struct hp300hpux_reloc *bytes AND
arelent *cache_ptr AND
asymbol **symbols)
MY (swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols)
bfd *abfd;
struct hp300hpux_reloc *bytes;
arelent *cache_ptr;
asymbol **symbols;
{
int r_index;
int r_extern = 0;
unsigned int r_length;
int r_pcrel = 0;
struct aoutdata *su = &(abfd->tdata.aout_data->a);
struct aoutdata *su = &(abfd->tdata.aout_data->a);
cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address);
r_index = bfd_h_get_16(abfd, bytes->r_index);
r_index = bfd_h_get_16 (abfd, bytes->r_index);
switch (bytes->r_type[0])
{
case HP_RSEGMENT_TEXT:
{
case HP_RSEGMENT_TEXT:
r_index = N_TEXT;
break;
case HP_RSEGMENT_DATA:
case HP_RSEGMENT_DATA:
r_index = N_DATA;
break;
case HP_RSEGMENT_BSS:
case HP_RSEGMENT_BSS:
r_index = N_BSS;
break;
case HP_RSEGMENT_EXTERNAL:
case HP_RSEGMENT_EXTERNAL:
r_extern = 1;
break;
case HP_RSEGMENT_PCREL:
case HP_RSEGMENT_PCREL:
r_extern = 1;
r_pcrel = 1;
break;
case HP_RSEGMENT_RDLT:
case HP_RSEGMENT_RDLT:
break;
case HP_RSEGMENT_RPLT:
case HP_RSEGMENT_RPLT:
break;
case HP_RSEGMENT_NOOP:
case HP_RSEGMENT_NOOP:
break;
default:
default:
fprintf (stderr, "illegal relocation segment type: %x\n",
(bytes->r_type[0]));
}
}
switch (bytes->r_length[0])
{
@ -666,32 +676,32 @@ DEFUN(MY(swap_std_reloc_in), (abfd, bytes, cache_ptr, symbols),
r_length = 2;
break;
default:
fprintf (stderr, "illegal relocation length: %x\n",bytes->r_length[0] );
fprintf (stderr, "illegal relocation length: %x\n", bytes->r_length[0]);
r_length = 0;
}
cache_ptr->howto = howto_table_std + r_length + 4 * r_pcrel;
cache_ptr->howto = howto_table_std + r_length + 4 * r_pcrel;
/* FIXME-soon: Roll baserel, jmptable, relative bits into howto setting */
/* This macro uses the r_index value computed above */
if (r_pcrel && r_extern)
{
/* The GNU linker assumes any offset from beginning of section */
/* is already incorporated into the image while the HP linker */
/* adds this in later. Add it in now... */
MOVE_ADDRESS( - cache_ptr->address);
}
{
/* The GNU linker assumes any offset from beginning of section */
/* is already incorporated into the image while the HP linker */
/* adds this in later. Add it in now... */
MOVE_ADDRESS (-cache_ptr->address);
}
else
{
MOVE_ADDRESS(0);
}
{
MOVE_ADDRESS (0);
}
}
boolean
DEFUN(MY(slurp_reloc_table),(abfd, asect, symbols),
bfd *abfd AND
sec_ptr asect AND
asymbol **symbols)
MY (slurp_reloc_table) (abfd, asect, symbols)
bfd *abfd;
sec_ptr asect;
asymbol **symbols;
{
unsigned int count;
bfd_size_type reloc_size;
@ -702,61 +712,68 @@ DEFUN(MY(slurp_reloc_table),(abfd, asect, symbols),
unsigned int counter;
arelent *cache_ptr;
if (asect->relocation) return true;
if (asect->relocation)
return true;
if (asect->flags & SEC_CONSTRUCTOR) return true;
if (asect->flags & SEC_CONSTRUCTOR)
return true;
if (asect == obj_datasec (abfd)) {
reloc_size = exec_hdr(abfd)->a_drsize;
goto doit;
}
if (asect == obj_datasec (abfd))
{
reloc_size = exec_hdr (abfd)->a_drsize;
goto doit;
}
if (asect == obj_textsec (abfd)) {
reloc_size = exec_hdr(abfd)->a_trsize;
goto doit;
}
if (asect == obj_textsec (abfd))
{
reloc_size = exec_hdr (abfd)->a_trsize;
goto doit;
}
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return false;
doit:
doit:
bfd_seek (abfd, asect->rel_filepos, SEEK_SET);
each_size = obj_reloc_entry_size (abfd);
count = reloc_size / each_size;
reloc_cache = (arelent *) bfd_zalloc (abfd, (size_t)(count * sizeof
(arelent)));
if (!reloc_cache) {
nomem:
bfd_error = no_memory;
return false;
}
reloc_cache = (arelent *) bfd_zalloc (abfd, (size_t) (count * sizeof
(arelent)));
if (!reloc_cache)
{
nomem:
bfd_set_error (bfd_error_no_memory);
return false;
}
relocs = (PTR) bfd_alloc (abfd, reloc_size);
if (!relocs) {
bfd_release (abfd, reloc_cache);
goto nomem;
}
if (!relocs)
{
bfd_release (abfd, reloc_cache);
goto nomem;
}
if (bfd_read (relocs, 1, reloc_size, abfd) != reloc_size) {
bfd_release (abfd, relocs);
bfd_release (abfd, reloc_cache);
bfd_error = system_call_error;
return false;
}
if (bfd_read (relocs, 1, reloc_size, abfd) != reloc_size)
{
bfd_release (abfd, relocs);
bfd_release (abfd, reloc_cache);
return false;
}
rptr = (struct hp300hpux_reloc*) relocs;
counter = 0;
cache_ptr = reloc_cache;
rptr = (struct hp300hpux_reloc *) relocs;
counter = 0;
cache_ptr = reloc_cache;
for (; counter < count; counter++, rptr++, cache_ptr++) {
MY(swap_std_reloc_in)(abfd, rptr, cache_ptr, symbols);
for (; counter < count; counter++, rptr++, cache_ptr++)
{
MY (swap_std_reloc_in) (abfd, rptr, cache_ptr, symbols);
}
bfd_release (abfd,relocs);
bfd_release (abfd, relocs);
asect->relocation = reloc_cache;
asect->reloc_count = count;
return true;
@ -769,77 +786,83 @@ nomem:
/* call aout_32 versions if the input file was generated by gcc */
/************************************************************************/
unsigned int aout_32_get_symtab PARAMS((bfd *abfd, asymbol **location));
unsigned int aout_32_get_symtab_upper_bound PARAMS ((bfd *abfd));
unsigned int aout_32_get_symtab PARAMS ((bfd * abfd, asymbol ** location));
unsigned int aout_32_get_symtab_upper_bound PARAMS ((bfd * abfd));
unsigned int aout_32_canonicalize_reloc PARAMS((bfd *abfd, sec_ptr section,
arelent **relptr,
asymbol **symbols));
unsigned int aout_32_canonicalize_reloc PARAMS ((bfd * abfd, sec_ptr section,
arelent ** relptr,
asymbol ** symbols));
unsigned int
DEFUN(MY(get_symtab),(abfd, location),
bfd *abfd AND
asymbol **location)
MY (get_symtab) (abfd, location)
bfd *abfd;
asymbol **location;
{
unsigned int counter = 0;
aout_symbol_type *symbase;
unsigned int counter = 0;
aout_symbol_type *symbase;
if (obj_aout_subformat(abfd) == gnu_encap_format)
return aout_32_get_symtab(abfd,location);
if (obj_aout_subformat (abfd) == gnu_encap_format)
return aout_32_get_symtab (abfd, location);
if (!MY(slurp_symbol_table)(abfd)) return 0;
if (!MY (slurp_symbol_table) (abfd))
return 0;
for (symbase = obj_aout_symbols(abfd); counter++ < bfd_get_symcount (abfd);)
*(location++) = (asymbol *)( symbase++);
*location++ =0;
return bfd_get_symcount (abfd);
for (symbase = obj_aout_symbols (abfd); counter++ < bfd_get_symcount (abfd);)
*(location++) = (asymbol *) (symbase++);
*location++ = 0;
return bfd_get_symcount (abfd);
}
unsigned int
DEFUN(MY(get_symtab_upper_bound),(abfd),
bfd *abfd)
unsigned int
MY (get_symtab_upper_bound) (abfd)
bfd *abfd;
{
if (obj_aout_subformat(abfd) == gnu_encap_format)
return aout_32_get_symtab_upper_bound(abfd);
if (!MY(slurp_symbol_table)(abfd)) return 0;
if (obj_aout_subformat (abfd) == gnu_encap_format)
return aout_32_get_symtab_upper_bound (abfd);
if (!MY (slurp_symbol_table) (abfd))
return 0;
return (bfd_get_symcount (abfd)+1) * (sizeof (aout_symbol_type *));
return (bfd_get_symcount (abfd) + 1) * (sizeof (aout_symbol_type *));
}
unsigned int
DEFUN(MY(canonicalize_reloc),(abfd, section, relptr, symbols),
bfd *abfd AND
sec_ptr section AND
arelent **relptr AND
asymbol **symbols)
MY (canonicalize_reloc) (abfd, section, relptr, symbols)
bfd *abfd;
sec_ptr section;
arelent **relptr;
asymbol **symbols;
{
arelent *tblptr = section->relocation;
unsigned int count;
if (obj_aout_subformat(abfd) == gnu_encap_format)
return aout_32_canonicalize_reloc(abfd,section,relptr,symbols);
if (obj_aout_subformat (abfd) == gnu_encap_format)
return aout_32_canonicalize_reloc (abfd, section, relptr, symbols);
if (!(tblptr || MY(slurp_reloc_table)(abfd, section, symbols)))
if (!(tblptr || MY (slurp_reloc_table) (abfd, section, symbols)))
return 0;
if (section->flags & SEC_CONSTRUCTOR) {
arelent_chain *chain = section->constructor_chain;
for (count = 0; count < section->reloc_count; count ++) {
*relptr ++ = &chain->relent;
chain = chain->next;
if (section->flags & SEC_CONSTRUCTOR)
{
arelent_chain *chain = section->constructor_chain;
for (count = 0; count < section->reloc_count; count++)
{
*relptr++ = &chain->relent;
chain = chain->next;
}
}
}
else {
tblptr = section->relocation;
if (!tblptr) return 0;
else
{
tblptr = section->relocation;
if (!tblptr)
return 0;
for (count = 0; count++ < section->reloc_count;)
{
*relptr++ = tblptr++;
}
}
for (count = 0; count++ < section->reloc_count;)
{
*relptr++ = tblptr++;
}
}
*relptr = 0;
return section->reloc_count;

View File

@ -1,4 +1,4 @@
/* BFD back-end for i386 a.out binaries under Lynx.
/* BFD back-end for i386 a.out binaries under LynxOS.
Copyright (C) 1990, 1991, 1992 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
@ -58,7 +58,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
{ \
bfd_seek (abfd, (file_ptr)(N_SYMOFF(*execp)), SEEK_SET); \
\
NAME(aout,write_syms)(abfd); \
if (! NAME(aout,write_syms)(abfd)) return false; \
\
bfd_seek (abfd, (file_ptr)(N_TRELOFF(*execp)), SEEK_SET); \
\
@ -67,7 +67,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
\
if (!NAME(lynx,squirt_out_relocs)(abfd, obj_datasec (abfd))) return false; \
} \
}
}
#endif
#include "libaout.h"
@ -75,10 +75,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifdef HOST_LYNX
char *lynx_core_file_failing_command();
int lynx_core_file_failing_signal();
boolean lynx_core_file_matches_executable_p();
bfd_target *lynx_core_file_p();
char *lynx_core_file_failing_command ();
int lynx_core_file_failing_signal ();
boolean lynx_core_file_matches_executable_p ();
bfd_target *lynx_core_file_p ();
#define MY_core_file_failing_command lynx_core_file_failing_command
#define MY_core_file_failing_signal lynx_core_file_failing_signal
@ -86,8 +86,8 @@ bfd_target *lynx_core_file_p();
#define MY_core_file_p lynx_core_file_p
#endif /* HOST_LYNX */
#define KEEPIT flags
extern reloc_howto_type aout_32_ext_howto_table[];
@ -97,10 +97,10 @@ extern reloc_howto_type aout_32_std_howto_table[];
/* Output standard relocation information to a file in target byte order. */
void
DEFUN(NAME(lynx,swap_std_reloc_out),(abfd, g, natptr),
bfd *abfd AND
arelent *g AND
struct reloc_std_external *natptr)
NAME (lynx, swap_std_reloc_out) (abfd, g, natptr)
bfd *abfd;
arelent *g;
struct reloc_std_external *natptr;
{
int r_index;
asymbol *sym = *(g->sym_ptr_ptr);
@ -111,78 +111,81 @@ DEFUN(NAME(lynx,swap_std_reloc_out),(abfd, g, natptr),
unsigned int r_addend;
asection *output_section = sym->section->output_section;
PUT_WORD(abfd, g->address, natptr->r_address);
PUT_WORD (abfd, g->address, natptr->r_address);
r_length = g->howto->size ; /* Size as a power of two */
r_pcrel = (int) g->howto->pc_relative; /* Relative to PC? */
r_length = g->howto->size; /* Size as a power of two */
r_pcrel = (int) g->howto->pc_relative; /* Relative to PC? */
/* r_baserel, r_jmptable, r_relative??? FIXME-soon */
r_baserel = 0;
r_jmptable = 0;
r_relative = 0;
r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma;
/* name was clobbered by aout_write_syms to be symbol index */
/* If this relocation is relative to a symbol then set the
/* If this relocation is relative to a symbol then set the
r_index to the symbols index, and the r_extern bit.
Absolute symbols can come in in two ways, either as an offset
from the abs section, or as a symbol which has an abs value.
check for that here
*/
if (bfd_is_com_section (output_section)
|| output_section == &bfd_abs_section
|| output_section == &bfd_und_section)
|| output_section == &bfd_und_section)
{
if (bfd_abs_section.symbol == sym)
{
/* Whoops, looked like an abs symbol, but is really an offset
{
/* Whoops, looked like an abs symbol, but is really an offset
from the abs section */
r_index = 0;
r_extern = 0;
}
else
{
/* Fill in symbol */
r_extern = 1;
r_index = stoi((*(g->sym_ptr_ptr))->KEEPIT);
}
r_index = 0;
r_extern = 0;
}
else
{
/* Fill in symbol */
r_extern = 1;
r_index = stoi ((*(g->sym_ptr_ptr))->KEEPIT);
}
}
else
else
{
/* Just an ordinary section */
r_extern = 0;
r_index = output_section->target_index;
r_index = output_section->target_index;
}
/* now the fun stuff */
if (abfd->xvec->header_byteorder_big_p != false) {
if (abfd->xvec->header_byteorder_big_p != false)
{
natptr->r_index[0] = r_index >> 16;
natptr->r_index[1] = r_index >> 8;
natptr->r_index[2] = r_index;
natptr->r_type[0] =
(r_extern? RELOC_STD_BITS_EXTERN_BIG: 0)
| (r_pcrel? RELOC_STD_BITS_PCREL_BIG: 0)
| (r_baserel? RELOC_STD_BITS_BASEREL_BIG: 0)
| (r_jmptable? RELOC_STD_BITS_JMPTABLE_BIG: 0)
| (r_relative? RELOC_STD_BITS_RELATIVE_BIG: 0)
| (r_length << RELOC_STD_BITS_LENGTH_SH_BIG);
} else {
natptr->r_index[2] = r_index >> 16;
natptr->r_index[1] = r_index >> 8;
natptr->r_index[0] = r_index;
natptr->r_type[0] =
(r_extern? RELOC_STD_BITS_EXTERN_LITTLE: 0)
| (r_pcrel? RELOC_STD_BITS_PCREL_LITTLE: 0)
| (r_baserel? RELOC_STD_BITS_BASEREL_LITTLE: 0)
| (r_jmptable? RELOC_STD_BITS_JMPTABLE_LITTLE: 0)
| (r_relative? RELOC_STD_BITS_RELATIVE_LITTLE: 0)
| (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE);
}
(r_extern ? RELOC_STD_BITS_EXTERN_BIG : 0)
| (r_pcrel ? RELOC_STD_BITS_PCREL_BIG : 0)
| (r_baserel ? RELOC_STD_BITS_BASEREL_BIG : 0)
| (r_jmptable ? RELOC_STD_BITS_JMPTABLE_BIG : 0)
| (r_relative ? RELOC_STD_BITS_RELATIVE_BIG : 0)
| (r_length << RELOC_STD_BITS_LENGTH_SH_BIG);
}
else
{
natptr->r_index[2] = r_index >> 16;
natptr->r_index[1] = r_index >> 8;
natptr->r_index[0] = r_index;
natptr->r_type[0] =
(r_extern ? RELOC_STD_BITS_EXTERN_LITTLE : 0)
| (r_pcrel ? RELOC_STD_BITS_PCREL_LITTLE : 0)
| (r_baserel ? RELOC_STD_BITS_BASEREL_LITTLE : 0)
| (r_jmptable ? RELOC_STD_BITS_JMPTABLE_LITTLE : 0)
| (r_relative ? RELOC_STD_BITS_RELATIVE_LITTLE : 0)
| (r_length << RELOC_STD_BITS_LENGTH_SH_LITTLE);
}
}
@ -190,81 +193,84 @@ DEFUN(NAME(lynx,swap_std_reloc_out),(abfd, g, natptr),
/* Output extended relocation information to a file in target byte order. */
void
DEFUN(NAME(lynx,swap_ext_reloc_out),(abfd, g, natptr),
bfd *abfd AND
arelent *g AND
register struct reloc_ext_external *natptr)
NAME (lynx, swap_ext_reloc_out) (abfd, g, natptr)
bfd *abfd;
arelent *g;
register struct reloc_ext_external *natptr;
{
int r_index;
int r_extern;
unsigned int r_type;
unsigned int r_addend;
asymbol *sym = *(g->sym_ptr_ptr);
asymbol *sym = *(g->sym_ptr_ptr);
asection *output_section = sym->section->output_section;
PUT_WORD (abfd, g->address, natptr->r_address);
r_type = (unsigned int) g->howto->type;
r_addend = g->addend + (*(g->sym_ptr_ptr))->section->output_section->vma;
/* If this relocation is relative to a symbol then set the
/* If this relocation is relative to a symbol then set the
r_index to the symbols index, and the r_extern bit.
Absolute symbols can come in in two ways, either as an offset
from the abs section, or as a symbol which has an abs value.
check for that here
*/
if (bfd_is_com_section (output_section)
|| output_section == &bfd_abs_section
|| output_section == &bfd_und_section)
{
if (bfd_abs_section.symbol == sym)
{
/* Whoops, looked like an abs symbol, but is really an offset
if (bfd_abs_section.symbol == sym)
{
/* Whoops, looked like an abs symbol, but is really an offset
from the abs section */
r_index = 0;
r_extern = 0;
}
else
{
r_extern = 1;
r_index = stoi((*(g->sym_ptr_ptr))->KEEPIT);
r_index = 0;
r_extern = 0;
}
else
{
r_extern = 1;
r_index = stoi ((*(g->sym_ptr_ptr))->KEEPIT);
}
}
}
else
{
/* Just an ordinary section */
r_extern = 0;
r_index = output_section->target_index;
}
else
{
/* Just an ordinary section */
r_extern = 0;
r_index = output_section->target_index;
}
/* now the fun stuff */
if (abfd->xvec->header_byteorder_big_p != false) {
natptr->r_index[0] = r_index >> 16;
natptr->r_index[1] = r_index >> 8;
natptr->r_index[2] = r_index;
natptr->r_type[0] =
(r_extern? RELOC_EXT_BITS_EXTERN_BIG: 0)
| (r_type << RELOC_EXT_BITS_TYPE_SH_BIG);
} else {
natptr->r_index[2] = r_index >> 16;
natptr->r_index[1] = r_index >> 8;
natptr->r_index[0] = r_index;
natptr->r_type[0] =
(r_extern? RELOC_EXT_BITS_EXTERN_LITTLE: 0)
| (r_type << RELOC_EXT_BITS_TYPE_SH_LITTLE);
}
if (abfd->xvec->header_byteorder_big_p != false)
{
natptr->r_index[0] = r_index >> 16;
natptr->r_index[1] = r_index >> 8;
natptr->r_index[2] = r_index;
natptr->r_type[0] =
(r_extern ? RELOC_EXT_BITS_EXTERN_BIG : 0)
| (r_type << RELOC_EXT_BITS_TYPE_SH_BIG);
}
else
{
natptr->r_index[2] = r_index >> 16;
natptr->r_index[1] = r_index >> 8;
natptr->r_index[0] = r_index;
natptr->r_type[0] =
(r_extern ? RELOC_EXT_BITS_EXTERN_LITTLE : 0)
| (r_type << RELOC_EXT_BITS_TYPE_SH_LITTLE);
}
PUT_WORD (abfd, r_addend, natptr->r_addend);
}
/* BFD deals internally with all things based from the section they're
in. so, something in 10 bytes into a text section with a base of
50 would have a symbol (.text+10) and know .text vma was 50.
50 would have a symbol (.text+10) and know .text vma was 50.
Aout keeps all it's symbols based from zero, so the symbol would
contain 60. This macro subs the base of each section from the value
@ -305,11 +311,11 @@ DEFUN(NAME(lynx,swap_ext_reloc_out),(abfd, g, natptr),
} \
void
DEFUN(NAME(lynx,swap_ext_reloc_in), (abfd, bytes, cache_ptr, symbols),
bfd *abfd AND
struct reloc_ext_external *bytes AND
arelent *cache_ptr AND
asymbol **symbols)
NAME (lynx, swap_ext_reloc_in) (abfd, bytes, cache_ptr, symbols)
bfd *abfd;
struct reloc_ext_external *bytes;
arelent *cache_ptr;
asymbol **symbols;
{
int r_index;
int r_extern;
@ -318,68 +324,53 @@ DEFUN(NAME(lynx,swap_ext_reloc_in), (abfd, bytes, cache_ptr, symbols),
cache_ptr->address = (GET_SWORD (abfd, bytes->r_address));
/* now the fun stuff */
if (1 /* abfd->xvec->header_byteorder_big_p != false */) {
r_index = (bytes->r_index[0] << 16)
| (bytes->r_index[1] << 8)
| bytes->r_index[2];
r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_BIG));
r_type = (bytes->r_type[0] & RELOC_EXT_BITS_TYPE_BIG)
>> RELOC_EXT_BITS_TYPE_SH_BIG;
} else {
r_index = (bytes->r_index[2] << 16)
| (bytes->r_index[1] << 8)
| bytes->r_index[0];
r_extern = (0 != (bytes->r_type[0] & RELOC_EXT_BITS_EXTERN_LITTLE));
r_type = (bytes->r_type[0] & RELOC_EXT_BITS_TYPE_LITTLE)
>> RELOC_EXT_BITS_TYPE_SH_LITTLE;
}
r_index = bytes->r_index[1];
r_extern = (0 != (bytes->r_index[0] & RELOC_EXT_BITS_EXTERN_BIG));
r_type = (bytes->r_index[0] & RELOC_EXT_BITS_TYPE_BIG)
>> RELOC_EXT_BITS_TYPE_SH_BIG;
cache_ptr->howto = aout_32_ext_howto_table + r_type;
MOVE_ADDRESS(GET_SWORD(abfd, bytes->r_addend));
cache_ptr->howto = aout_32_ext_howto_table + r_type;
MOVE_ADDRESS (GET_SWORD (abfd, bytes->r_addend));
}
void
DEFUN(NAME(lynx,swap_std_reloc_in), (abfd, bytes, cache_ptr, symbols),
bfd *abfd AND
struct reloc_std_external *bytes AND
arelent *cache_ptr AND
asymbol **symbols)
NAME (lynx, swap_std_reloc_in) (abfd, bytes, cache_ptr, symbols)
bfd *abfd;
struct reloc_std_external *bytes;
arelent *cache_ptr;
asymbol **symbols;
{
char tmp;
int r_index;
int r_extern;
unsigned int r_length;
int r_pcrel;
int r_baserel, r_jmptable, r_relative;
struct aoutdata *su = &(abfd->tdata.aout_data->a);
struct aoutdata *su = &(abfd->tdata.aout_data->a);
cache_ptr->address = bfd_h_get_32 (abfd, bytes->r_address);
r_index = (bytes->r_type[0] << 16)
| (bytes->r_index[2] << 8)
| bytes->r_index[1];
r_extern = (0 != (bytes->r_index[0] & RELOC_STD_BITS_EXTERN_BIG));
r_pcrel = (0 != (bytes->r_index[0] & RELOC_STD_BITS_PCREL_BIG));
r_index = bytes->r_index[1];
r_extern = (0 != (bytes->r_index[0] & RELOC_STD_BITS_EXTERN_BIG));
r_pcrel = (0 != (bytes->r_index[0] & RELOC_STD_BITS_PCREL_BIG));
r_baserel = (0 != (bytes->r_index[0] & RELOC_STD_BITS_BASEREL_BIG));
r_jmptable= (0 != (bytes->r_index[0] & RELOC_STD_BITS_JMPTABLE_BIG));
r_relative= (0 != (bytes->r_index[0] & RELOC_STD_BITS_RELATIVE_BIG));
r_length = (bytes->r_index[0] & RELOC_STD_BITS_LENGTH_BIG)
r_jmptable = (0 != (bytes->r_index[0] & RELOC_STD_BITS_JMPTABLE_BIG));
r_relative = (0 != (bytes->r_index[0] & RELOC_STD_BITS_RELATIVE_BIG));
r_length = (bytes->r_index[0] & RELOC_STD_BITS_LENGTH_BIG)
>> RELOC_STD_BITS_LENGTH_SH_BIG;
cache_ptr->howto = aout_32_std_howto_table + r_length + 4 * r_pcrel;
cache_ptr->howto = aout_32_std_howto_table + r_length + 4 * r_pcrel;
/* FIXME-soon: Roll baserel, jmptable, relative bits into howto setting */
MOVE_ADDRESS(0);
MOVE_ADDRESS (0);
}
/* Reloc hackery */
boolean
DEFUN(NAME(lynx,slurp_reloc_table),(abfd, asect, symbols),
bfd *abfd AND
sec_ptr asect AND
asymbol **symbols)
NAME (lynx, slurp_reloc_table) (abfd, asect, symbols)
bfd *abfd;
sec_ptr asect;
asymbol **symbols;
{
unsigned int count;
bfd_size_type reloc_size;
@ -387,71 +378,82 @@ DEFUN(NAME(lynx,slurp_reloc_table),(abfd, asect, symbols),
arelent *reloc_cache;
size_t each_size;
if (asect->relocation) return true;
if (asect->relocation)
return true;
if (asect->flags & SEC_CONSTRUCTOR) return true;
if (asect->flags & SEC_CONSTRUCTOR)
return true;
if (asect == obj_datasec (abfd)) {
reloc_size = exec_hdr(abfd)->a_drsize;
goto doit;
}
if (asect == obj_datasec (abfd))
{
reloc_size = exec_hdr (abfd)->a_drsize;
goto doit;
}
if (asect == obj_textsec (abfd)) {
reloc_size = exec_hdr(abfd)->a_trsize;
goto doit;
}
if (asect == obj_textsec (abfd))
{
reloc_size = exec_hdr (abfd)->a_trsize;
goto doit;
}
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return false;
doit:
doit:
bfd_seek (abfd, asect->rel_filepos, SEEK_SET);
each_size = obj_reloc_entry_size (abfd);
count = reloc_size / each_size;
reloc_cache = (arelent *) bfd_zalloc (abfd, (size_t)(count * sizeof
(arelent)));
if (!reloc_cache) {
nomem:
bfd_error = no_memory;
return false;
}
reloc_cache = (arelent *) bfd_zalloc (abfd, (size_t) (count * sizeof
(arelent)));
if (!reloc_cache)
{
nomem:
bfd_set_error (bfd_error_no_memory);
return false;
}
relocs = (PTR) bfd_alloc (abfd, reloc_size);
if (!relocs) {
bfd_release (abfd, reloc_cache);
goto nomem;
}
if (bfd_read (relocs, 1, reloc_size, abfd) != reloc_size) {
bfd_release (abfd, relocs);
bfd_release (abfd, reloc_cache);
bfd_error = system_call_error;
return false;
}
if (each_size == RELOC_EXT_SIZE) {
register struct reloc_ext_external *rptr = (struct reloc_ext_external *) relocs;
unsigned int counter = 0;
arelent *cache_ptr = reloc_cache;
for (; counter < count; counter++, rptr++, cache_ptr++) {
NAME(lynx,swap_ext_reloc_in)(abfd, rptr, cache_ptr, symbols);
}
} else {
register struct reloc_std_external *rptr = (struct reloc_std_external*) relocs;
unsigned int counter = 0;
arelent *cache_ptr = reloc_cache;
for (; counter < count; counter++, rptr++, cache_ptr++) {
NAME(lynx,swap_std_reloc_in)(abfd, rptr, cache_ptr, symbols);
if (!relocs)
{
bfd_release (abfd, reloc_cache);
goto nomem;
}
}
if (bfd_read (relocs, 1, reloc_size, abfd) != reloc_size)
{
bfd_release (abfd, relocs);
bfd_release (abfd, reloc_cache);
return false;
}
bfd_release (abfd,relocs);
if (each_size == RELOC_EXT_SIZE)
{
register struct reloc_ext_external *rptr = (struct reloc_ext_external *) relocs;
unsigned int counter = 0;
arelent *cache_ptr = reloc_cache;
for (; counter < count; counter++, rptr++, cache_ptr++)
{
NAME (lynx, swap_ext_reloc_in) (abfd, rptr, cache_ptr, symbols);
}
}
else
{
register struct reloc_std_external *rptr = (struct reloc_std_external *) relocs;
unsigned int counter = 0;
arelent *cache_ptr = reloc_cache;
for (; counter < count; counter++, rptr++, cache_ptr++)
{
NAME (lynx, swap_std_reloc_in) (abfd, rptr, cache_ptr, symbols);
}
}
bfd_release (abfd, relocs);
asect->relocation = reloc_cache;
asect->reloc_count = count;
return true;
@ -462,9 +464,9 @@ nomem:
/* Write out a relocation section into an object file. */
boolean
DEFUN(NAME(lynx,squirt_out_relocs),(abfd, section),
bfd *abfd AND
asection *section)
NAME (lynx, squirt_out_relocs) (abfd, section)
bfd *abfd;
asection *section;
{
arelent **generic;
unsigned char *native, *natptr;
@ -473,37 +475,40 @@ DEFUN(NAME(lynx,squirt_out_relocs),(abfd, section),
unsigned int count = section->reloc_count;
size_t natsize;
if (count == 0) return true;
if (count == 0)
return true;
each_size = obj_reloc_entry_size (abfd);
natsize = each_size * count;
native = (unsigned char *) bfd_zalloc (abfd, natsize);
if (!native) {
bfd_error = no_memory;
return false;
}
if (!native)
{
bfd_set_error (bfd_error_no_memory);
return false;
}
generic = section->orelocation;
if (each_size == RELOC_EXT_SIZE)
if (each_size == RELOC_EXT_SIZE)
{
for (natptr = native;
count != 0;
--count, natptr += each_size, ++generic)
NAME(lynx,swap_ext_reloc_out) (abfd, *generic, (struct reloc_ext_external *)natptr);
NAME (lynx, swap_ext_reloc_out) (abfd, *generic, (struct reloc_ext_external *) natptr);
}
else
else
{
for (natptr = native;
count != 0;
--count, natptr += each_size, ++generic)
NAME(lynx,swap_std_reloc_out)(abfd, *generic, (struct reloc_std_external *)natptr);
NAME (lynx, swap_std_reloc_out) (abfd, *generic, (struct reloc_std_external *) natptr);
}
if ( bfd_write ((PTR) native, 1, natsize, abfd) != natsize) {
bfd_release(abfd, native);
return false;
}
if (bfd_write ((PTR) native, 1, natsize, abfd) != natsize)
{
bfd_release (abfd, native);
return false;
}
bfd_release (abfd, native);
return true;
@ -511,34 +516,38 @@ DEFUN(NAME(lynx,squirt_out_relocs),(abfd, section),
/* This is stupid. This function should be a boolean predicate */
unsigned int
DEFUN(NAME(lynx,canonicalize_reloc),(abfd, section, relptr, symbols),
bfd *abfd AND
sec_ptr section AND
arelent **relptr AND
asymbol **symbols)
NAME (lynx, canonicalize_reloc) (abfd, section, relptr, symbols)
bfd *abfd;
sec_ptr section;
arelent **relptr;
asymbol **symbols;
{
arelent *tblptr = section->relocation;
unsigned int count;
if (!(tblptr || NAME(lynx,slurp_reloc_table)(abfd, section, symbols)))
if (!(tblptr || NAME (lynx, slurp_reloc_table) (abfd, section, symbols)))
return 0;
if (section->flags & SEC_CONSTRUCTOR) {
arelent_chain *chain = section->constructor_chain;
for (count = 0; count < section->reloc_count; count ++) {
*relptr ++ = &chain->relent;
chain = chain->next;
if (section->flags & SEC_CONSTRUCTOR)
{
arelent_chain *chain = section->constructor_chain;
for (count = 0; count < section->reloc_count; count++)
{
*relptr++ = &chain->relent;
chain = chain->next;
}
}
}
else {
tblptr = section->relocation;
if (!tblptr) return 0;
else
{
tblptr = section->relocation;
if (!tblptr)
return 0;
for (count = 0; count++ < section->reloc_count;)
{
*relptr++ = tblptr++;
}
}
for (count = 0; count++ < section->reloc_count;)
{
*relptr++ = tblptr++;
}
}
*relptr = 0;
return section->reloc_count;

View File

@ -92,10 +92,7 @@ nlm_alpha_write_prefix (abfd)
bfd_h_put_32 (abfd, (bfd_vma) 2, s.format);
bfd_h_put_32 (abfd, (bfd_vma) sizeof s, s.size);
if (bfd_write ((PTR) &s, sizeof s, 1, abfd) != sizeof s)
{
bfd_error = system_call_error;
return false;
}
return false;
return true;
}
@ -425,10 +422,7 @@ nlm_alpha_read_reloc (abfd, sym, secp, rel)
/* Read the reloc from the file. */
if (bfd_read (&ext, sizeof ext, 1, abfd) != sizeof ext)
{
bfd_error = system_call_error;
return false;
}
return false;
/* Swap in the reloc information. */
r_vaddr = bfd_h_get_64 (abfd, (bfd_byte *) ext.r_vaddr);
@ -632,37 +626,28 @@ nlm_alpha_read_import (abfd, sym)
if (bfd_read ((PTR) &symlength, sizeof (symlength), 1, abfd)
!= sizeof (symlength))
{
bfd_error = system_call_error;
return (false);
}
return false;
sym -> symbol.the_bfd = abfd;
sym -> symbol.name = bfd_alloc (abfd, symlength + 1);
if (!sym -> symbol.name)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
if (bfd_read ((PTR) sym -> symbol.name, symlength, 1, abfd)
!= symlength)
{
bfd_error = system_call_error;
return (false);
}
return false;
sym -> symbol.flags = 0;
sym -> symbol.value = 0;
sym -> symbol.section = &bfd_und_section;
if (bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp))
{
bfd_error = system_call_error;
return (false);
}
return faflse;
rcount = bfd_h_get_32 (abfd, temp);
nlm_relocs = ((struct nlm_relent *)
bfd_alloc (abfd, rcount * sizeof (struct nlm_relent)));
if (!nlm_relocs)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
sym -> relocs = nlm_relocs;
@ -785,10 +770,7 @@ nlm_alpha_write_import (abfd, sec, rel)
/* Write out the relocation. */
if (bfd_write (&ext, sizeof ext, 1, abfd) != sizeof ext)
{
bfd_error = system_call_error;
return false;
}
return false;
return true;
}
@ -852,17 +834,11 @@ nlm_alpha_write_external (abfd, count, sym, relocs)
len = strlen (sym->name);
if ((bfd_write (&len, sizeof (bfd_byte), 1, abfd) != sizeof(bfd_byte))
|| bfd_write (sym->name, len, 1, abfd) != len)
{
bfd_error = system_call_error;
return false;
}
return false;
bfd_put_32 (abfd, count + 2, temp);
if (bfd_write (temp, sizeof (temp), 1, abfd) != sizeof (temp))
{
bfd_error = system_call_error;
return false;
}
return false;
/* The first two relocs for each external symbol are the .lita
address and the GP value. */

View File

@ -87,10 +87,7 @@ nlm_i386_read_reloc (abfd, sym, secp, rel)
const char *name;
if (bfd_read (temp, sizeof (temp), 1, abfd) != sizeof (temp))
{
bfd_error = system_call_error;
return false;
}
return false;
val = bfd_get_32 (abfd, temp);
@ -176,7 +173,7 @@ nlm_i386_write_import (abfd, sec, rel)
|| rel->howto->src_mask != 0xffffffff
|| rel->howto->dst_mask != 0xffffffff)
{
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return false;
}
@ -204,7 +201,7 @@ nlm_i386_write_import (abfd, sec, rel)
/* NetWare only supports absolute internal relocs. */
if (rel->howto->pc_relative)
{
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return false;
}
@ -224,7 +221,7 @@ nlm_i386_write_import (abfd, sec, rel)
/* PC relative relocs on NetWare must be pcrel_offset. */
if (! rel->howto->pcrel_offset)
{
bfd_error = invalid_operation;
bfd_set_error (bfd_error_invalid_operation);
return false;
}
}
@ -232,10 +229,7 @@ nlm_i386_write_import (abfd, sec, rel)
bfd_put_32 (abfd, val, temp);
if (bfd_write (temp, sizeof (temp), 1, abfd) != sizeof (temp))
{
bfd_error = system_call_error;
return false;
}
return false;
return true;
}
@ -357,37 +351,28 @@ nlm_i386_read_import (abfd, sym)
if (bfd_read ((PTR) &symlength, sizeof (symlength), 1, abfd)
!= sizeof (symlength))
{
bfd_error = system_call_error;
return (false);
}
return false;
sym -> symbol.the_bfd = abfd;
sym -> symbol.name = bfd_alloc (abfd, symlength + 1);
if (!sym -> symbol.name)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
if (bfd_read ((PTR) sym -> symbol.name, symlength, 1, abfd)
!= symlength)
{
bfd_error = system_call_error;
return (false);
}
return false;
sym -> symbol.flags = 0;
sym -> symbol.value = 0;
sym -> symbol.section = &bfd_und_section;
if (bfd_read ((PTR) temp, sizeof (temp), 1, abfd) != sizeof (temp))
{
bfd_error = system_call_error;
return (false);
}
return false;
rcount = bfd_h_get_32 (abfd, temp);
nlm_relocs = ((struct nlm_relent *)
bfd_alloc (abfd, rcount * sizeof (struct nlm_relent)));
if (!nlm_relocs)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
sym -> relocs = nlm_relocs;
@ -423,17 +408,11 @@ nlm_i386_write_external (abfd, count, sym, relocs)
len = strlen (sym->name);
if ((bfd_write (&len, sizeof (bfd_byte), 1, abfd) != sizeof(bfd_byte))
|| bfd_write (sym->name, len, 1, abfd) != len)
{
bfd_error = system_call_error;
return false;
}
return false;
bfd_put_32 (abfd, count, temp);
if (bfd_write (temp, sizeof(temp), 1, abfd) != sizeof (temp))
{
bfd_error = system_call_error;
return false;
}
return false;
for (i = 0; i < count; i++)
{

View File

@ -130,10 +130,8 @@ nlm_sparc_read_reloc (abfd, sym, secp, rel)
struct nlm32_sparc_reloc_ext tmp_reloc;
asection *code_sec, *data_sec;
if (bfd_read (&tmp_reloc, 12, 1, abfd) != 12) {
bfd_error = system_call_error;
if (bfd_read (&tmp_reloc, 12, 1, abfd) != 12)
return false;
}
code_sec = bfd_get_section_by_name (abfd, NLM_CODE_NAME);
data_sec = bfd_get_section_by_name (abfd, NLM_INITIALIZED_DATA_NAME);
@ -262,12 +260,8 @@ nlm_sparc_read_import (abfd, sym)
* First, read in the number of relocation
* entries for this symbol
*/
if (bfd_read ((PTR) temp, 4, 1, abfd)
!= 4)
{
bfd_error = system_call_error;
return (false);
}
if (bfd_read ((PTR) temp, 4, 1, abfd) != 4)
return false;
rcount = bfd_get_32 (abfd, temp);
@ -277,15 +271,12 @@ nlm_sparc_read_import (abfd, sym)
if (bfd_read ((PTR) &symlength, sizeof (symlength), 1, abfd)
!= sizeof (symlength))
{
bfd_error = system_call_error;
return (false);
}
return false;
sym -> symbol.the_bfd = abfd;
sym -> symbol.name = bfd_alloc (abfd, symlength + 1);
if (!sym -> symbol.name)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
@ -295,10 +286,7 @@ nlm_sparc_read_import (abfd, sym)
if (bfd_read ((PTR) sym -> symbol.name, symlength, 1, abfd)
!= symlength)
{
bfd_error = system_call_error;
return (false);
}
return false;
sym -> symbol.flags = 0;
sym -> symbol.value = 0;
sym -> symbol.section = &bfd_und_section;
@ -311,7 +299,7 @@ nlm_sparc_read_import (abfd, sym)
bfd_alloc (abfd, rcount * sizeof (struct nlm_relent)));
if (!nlm_relocs)
{
bfd_error = no_memory;
bfd_set_error (bfd_error_no_memory);
return false;
}
sym -> relocs = nlm_relocs;
@ -383,18 +371,12 @@ nlm_sparc_write_external (abfd, count, sym, relocs)
bfd_put_32 (abfd, count, temp);
if (bfd_write (temp, sizeof(temp), 1, abfd) != sizeof (temp))
{
bfd_error = system_call_error;
return false;
}
return false;
len = strlen (sym->name);
if ((bfd_write (&len, sizeof (bfd_byte), 1, abfd) != sizeof(bfd_byte))
|| bfd_write (sym->name, len, 1, abfd) != len)
{
bfd_error = system_call_error;
return false;
}
return false;
for (i = 0; i < count; i++)
{
@ -425,10 +407,7 @@ nlm_sparc_write_export (abfd, sym, value)
if (bfd_write (temp, 4, 1, abfd) != 4
|| bfd_write (&len, 1, 1, abfd) != 1
|| bfd_write (sym->name, len, 1, abfd) != len)
{
bfd_error = system_call_error;
return false;
}
return false;
return true;
}

338
bfd/som.c
View File

@ -1845,7 +1845,8 @@ som_object_p (abfd)
if (bfd_read ((PTR) & file_hdr, 1, FILE_HDR_SIZE, abfd) != FILE_HDR_SIZE)
{
bfd_set_error (bfd_error_system_call);
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
return 0;
}
@ -1894,7 +1895,8 @@ som_object_p (abfd)
{
if (bfd_read ((PTR) & aux_hdr, 1, AUX_HDR_SIZE, abfd) != AUX_HDR_SIZE)
{
bfd_set_error (bfd_error_wrong_format);
if (bfd_get_error () != bfd_error_system_call)
bfd_set_error (bfd_error_wrong_format);
return 0;
}
}
@ -2339,11 +2341,8 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep)
each subspace. Seek to the start of the relocation stream
for this subspace in preparation for writing out its fixup
stream. */
if (bfd_seek (abfd, current_offset + total_reloc_size, SEEK_SET) != 0)
{
bfd_set_error (bfd_error_system_call);
return false;
}
if (bfd_seek (abfd, current_offset + total_reloc_size, SEEK_SET) < 0)
return false;
/* Buffer space has already been allocated. Just perform some
initialization here. */
@ -2379,10 +2378,8 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep)
{
if (bfd_write ((PTR) tmp_space, p - tmp_space, 1, abfd)
!= p - tmp_space)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
p = tmp_space;
som_initialize_reloc_queue (reloc_queue);
}
@ -2549,10 +2546,7 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep)
/* Scribble out the relocations. */
if (bfd_write ((PTR) tmp_space, p - tmp_space, 1, abfd)
!= p - tmp_space)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
p = tmp_space;
total_reloc_size += subspace_reloc_size;
@ -2585,11 +2579,8 @@ som_write_space_strings (abfd, current_offset, string_sizep)
/* Seek to the start of the space strings in preparation for writing
them out. */
if (bfd_seek (abfd, current_offset, SEEK_SET) != 0)
{
bfd_set_error (bfd_error_system_call);
return false;
}
if (bfd_seek (abfd, current_offset, SEEK_SET) < 0)
return false;
/* Walk through all the spaces and subspaces (order is not important)
building up and writing string table entries for their names. */
@ -2612,10 +2603,7 @@ som_write_space_strings (abfd, current_offset, string_sizep)
{
if (bfd_write ((PTR) &tmp_space[0], p - tmp_space, 1, abfd)
!= p - tmp_space)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Reset to beginning of the buffer space. */
p = tmp_space;
}
@ -2649,10 +2637,7 @@ som_write_space_strings (abfd, current_offset, string_sizep)
/* Done with the space/subspace strings. Write out any information
contained in a partial block. */
if (bfd_write ((PTR) &tmp_space[0], p - tmp_space, 1, abfd) != p - tmp_space)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
*string_sizep = strings_size;
return true;
}
@ -2680,11 +2665,8 @@ som_write_symbol_strings (abfd, current_offset, syms, num_syms, string_sizep)
/* Seek to the start of the space strings in preparation for writing
them out. */
if (bfd_seek (abfd, current_offset, SEEK_SET) != 0)
{
bfd_set_error (bfd_error_system_call);
return false;
}
if (bfd_seek (abfd, current_offset, SEEK_SET) < 0)
return false;
for (i = 0; i < num_syms; i++)
{
@ -2696,10 +2678,7 @@ som_write_symbol_strings (abfd, current_offset, syms, num_syms, string_sizep)
{
if (bfd_write ((PTR) &tmp_space[0], p - tmp_space, 1, abfd)
!= p - tmp_space)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Reset to beginning of the buffer space. */
p = tmp_space;
}
@ -2731,10 +2710,7 @@ som_write_symbol_strings (abfd, current_offset, syms, num_syms, string_sizep)
/* Scribble out any partial block. */
if (bfd_write ((PTR) &tmp_space[0], p - tmp_space, 1, abfd) != p - tmp_space)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
*string_sizep = strings_size;
return true;
@ -2790,17 +2766,15 @@ som_begin_writing (abfd)
{
unsigned int len;
bfd_seek (abfd, current_offset, SEEK_SET);
if (bfd_seek (abfd, current_offset, SEEK_SET) < 0)
return false;
/* Write the aux_id structure and the string length. */
len = sizeof (struct aux_id) + sizeof (unsigned int);
obj_som_file_hdr (abfd)->aux_header_size += len;
current_offset += len;
if (bfd_write ((PTR) obj_som_version_hdr (abfd), len, 1, abfd) != len)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Write the version string. */
len = obj_som_version_hdr (abfd)->header_id.length - sizeof (int);
@ -2808,27 +2782,22 @@ som_begin_writing (abfd)
current_offset += len;
if (bfd_write ((PTR) obj_som_version_hdr (abfd)->user_string,
len, 1, abfd) != len)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
}
if (obj_som_copyright_hdr (abfd) != NULL)
{
unsigned int len;
bfd_seek (abfd, current_offset, SEEK_SET);
if (bfd_seek (abfd, current_offset, SEEK_SET) < 0)
return false;
/* Write the aux_id structure and the string length. */
len = sizeof (struct aux_id) + sizeof (unsigned int);
obj_som_file_hdr (abfd)->aux_header_size += len;
current_offset += len;
if (bfd_write ((PTR) obj_som_copyright_hdr (abfd), len, 1, abfd) != len)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Write the copyright string. */
len = obj_som_copyright_hdr (abfd)->header_id.length - sizeof (int);
@ -2836,10 +2805,7 @@ som_begin_writing (abfd)
current_offset += len;
if (bfd_write ((PTR) obj_som_copyright_hdr (abfd)->copyright,
len, 1, abfd) != len)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
}
/* Next comes the initialization pointers; we have no initialization
@ -3119,15 +3085,9 @@ som_begin_writing (abfd)
if (abfd->flags & EXEC_P)
current_offset = SOM_ALIGN (current_offset, PA_PAGESIZE);
if (bfd_seek (abfd, current_offset - 1, SEEK_SET) < 0)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
if (bfd_write ((PTR) "", 1, 1, abfd) != 1)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
obj_som_file_hdr (abfd)->unloadable_sp_size
= current_offset - obj_som_file_hdr (abfd)->unloadable_sp_location;
@ -3157,14 +3117,13 @@ som_begin_writing (abfd)
exec_header.exec_bsize = 0;
exec_header.exec_dsize = tmp;
bfd_seek (abfd, obj_som_file_hdr (abfd)->aux_header_location, SEEK_SET);
if (bfd_seek (abfd, obj_som_file_hdr (abfd)->aux_header_location,
SEEK_SET) < 0)
return false;
if (bfd_write ((PTR) &exec_header, AUX_HDR_SIZE, 1, abfd)
!= AUX_HDR_SIZE)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
}
return true;
}
@ -3186,7 +3145,9 @@ som_write_headers (abfd)
/* Seek to the start of the subspace dictionary records. */
location = obj_som_file_hdr (abfd)->subspace_location;
bfd_seek (abfd, location, SEEK_SET);
if (bfd_seek (abfd, location, SEEK_SET) < 0)
return false;
section = abfd->sections;
/* Now for each loadable space write out records for its subspaces. */
for (i = 0; i < num_spaces; i++)
@ -3235,10 +3196,7 @@ som_write_headers (abfd)
if (bfd_write ((PTR) som_section_data (subsection)->subspace_dict,
sizeof (struct subspace_dictionary_record), 1, abfd)
!= sizeof (struct subspace_dictionary_record))
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
}
/* Goto the next section. */
section = section->next;
@ -3294,10 +3252,7 @@ som_write_headers (abfd)
if (bfd_write ((PTR) som_section_data (subsection)->subspace_dict,
sizeof (struct subspace_dictionary_record), 1, abfd)
!= sizeof (struct subspace_dictionary_record))
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
}
/* Goto the next section. */
section = section->next;
@ -3309,7 +3264,8 @@ som_write_headers (abfd)
Seek to the right location and start writing the space
dictionary records. */
location = obj_som_file_hdr (abfd)->space_location;
bfd_seek (abfd, location, SEEK_SET);
if (bfd_seek (abfd, location, SEEK_SET) < 0)
return false;
section = abfd->sections;
for (i = 0; i < num_spaces; i++)
@ -3323,10 +3279,7 @@ som_write_headers (abfd)
if (bfd_write ((PTR) som_section_data (section)->space_dict,
sizeof (struct space_dictionary_record), 1, abfd)
!= sizeof (struct space_dictionary_record))
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Goto the next section. */
section = section->next;
@ -3334,14 +3287,12 @@ som_write_headers (abfd)
/* Only thing left to do is write out the file header. It is always
at location zero. Seek there and write it. */
bfd_seek (abfd, (file_ptr) 0, SEEK_SET);
if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) < 0)
return false;
if (bfd_write ((PTR) obj_som_file_hdr (abfd),
sizeof (struct header), 1, abfd)
!= sizeof (struct header))
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
return true;
}
@ -3513,16 +3464,10 @@ som_build_and_write_symbol_table (abfd)
/* Everything is ready, seek to the right location and
scribble out the symbol table. */
if (bfd_seek (abfd, symtab_location, SEEK_SET) != 0)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
return false;
if (bfd_write ((PTR) som_symtab, symtab_size, 1, abfd) != symtab_size)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
if (som_symtab != NULL)
free (som_symtab);
@ -3583,17 +3528,11 @@ som_slurp_string_table (abfd)
}
if (bfd_seek (abfd, obj_som_str_filepos (abfd), SEEK_SET) < 0)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
if (bfd_read (stringtab, obj_som_stringtab_size (abfd), 1, abfd)
!= obj_som_stringtab_size (abfd))
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Save our results and return success. */
obj_som_stringtab (abfd) = stringtab;
@ -3699,16 +3638,10 @@ som_slurp_symbol_table (abfd)
goto error_return;
}
if (bfd_seek (abfd, obj_som_sym_filepos (abfd), SEEK_SET) < 0)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
if (bfd_read (buf, symbol_count * symsize, 1, abfd)
!= symbol_count * symsize)
{
bfd_set_error (bfd_error_no_symbols);
goto error_return;
}
goto error_return;
/* Iterate over all the symbols and internalize them. */
endbufp = buf + symbol_count;
@ -4189,16 +4122,11 @@ som_slurp_reloc_table (abfd, section, symbols, just_count)
obj_som_reloc_filepos (abfd) + section->rel_filepos,
SEEK_SET)
!= 0)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
if (bfd_read (external_relocs, 1, fixup_stream_size, abfd)
!= fixup_stream_size)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Let callers know how many relocations found.
also save the relocation stream as we will
need it again. */
@ -4501,7 +4429,7 @@ bfd_som_attach_aux_hdr (abfd, type, string)
+ sizeof (unsigned int) + len + pad);
if (!obj_som_copyright_hdr (abfd))
{
bfd_set_error (bfd_error_no_error);
bfd_set_error (bfd_error_no_memory);
return false;
}
obj_som_copyright_hdr (abfd)->header_id.type = COPYRIGHT_AUX_ID;
@ -4542,16 +4470,10 @@ som_set_section_contents (abfd, section, location, offset, count)
data. */
offset += som_section_data (section)->subspace_dict->file_loc_init_value;
if (bfd_seek (abfd, offset, SEEK_SET) == -1)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
if (bfd_write ((PTR) location, 1, count, abfd) != count)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
return true;
}
@ -4678,10 +4600,7 @@ som_bfd_count_ar_symbols (abfd, lst_header, count)
which point to the hash chains. */
if (bfd_read ((PTR) hash_table, lst_header->hash_size, 4, abfd)
!= lst_header->hash_size * 4)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Walk each chain counting the number of symbols found on that particular
chain. */
@ -4695,18 +4614,13 @@ som_bfd_count_ar_symbols (abfd, lst_header, count)
/* Seek to the first symbol in this hash chain. */
if (bfd_seek (abfd, lst_filepos + hash_table[i], SEEK_SET) < 0)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Read in this symbol and update the counter. */
if (bfd_read ((PTR) & lst_symbol, 1, sizeof (lst_symbol), abfd)
!= sizeof (lst_symbol))
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
(*count)++;
/* Now iterate through the rest of the symbols on this chain. */
@ -4716,18 +4630,13 @@ som_bfd_count_ar_symbols (abfd, lst_header, count)
/* Seek to the next symbol. */
if (bfd_seek (abfd, lst_filepos + lst_symbol.next_entry, SEEK_SET)
< 0)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Read the symbol in and update the counter. */
if (bfd_read ((PTR) & lst_symbol, 1, sizeof (lst_symbol), abfd)
!= sizeof (lst_symbol))
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
(*count)++;
}
}
@ -4777,26 +4686,17 @@ som_bfd_fill_in_ar_symbols (abfd, lst_header, syms)
which point to the hash chains. */
if (bfd_read ((PTR) hash_table, lst_header->hash_size, 4, abfd)
!= lst_header->hash_size * 4)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Seek to and read in the SOM dictionary. We will need this to fill
in the carsym's filepos field. */
if (bfd_seek (abfd, lst_filepos + lst_header->dir_loc, SEEK_SET) < 0)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
if (bfd_read ((PTR) som_dict, lst_header->module_count,
sizeof (struct som_entry), abfd)
!= lst_header->module_count * sizeof (struct som_entry))
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Walk each chain filling in the carsyms as we go along. */
for (i = 0; i < lst_header->hash_size; i++)
@ -4809,17 +4709,11 @@ som_bfd_fill_in_ar_symbols (abfd, lst_header, syms)
/* Seek to and read the first symbol on the chain. */
if (bfd_seek (abfd, lst_filepos + hash_table[i], SEEK_SET) < 0)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
if (bfd_read ((PTR) & lst_symbol, 1, sizeof (lst_symbol), abfd)
!= sizeof (lst_symbol))
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Get the name of the symbol, first get the length which is stored
as a 32bit integer just before the symbol.
@ -4830,16 +4724,10 @@ som_bfd_fill_in_ar_symbols (abfd, lst_header, syms)
using the string table would not be safe. */
if (bfd_seek (abfd, lst_filepos + lst_header->string_loc
+ lst_symbol.name.n_strx - 4, SEEK_SET) < 0)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
if (bfd_read (&len, 1, 4, abfd) != 4)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Allocate space for the name and null terminate it too. */
set->name = bfd_zalloc (abfd, len + 1);
@ -4849,10 +4737,8 @@ som_bfd_fill_in_ar_symbols (abfd, lst_header, syms)
goto error_return;
}
if (bfd_read (set->name, 1, len, abfd) != len)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
set->name[len] = 0;
/* Fill in the file offset. Note that the "location" field points
@ -4867,33 +4753,20 @@ som_bfd_fill_in_ar_symbols (abfd, lst_header, syms)
while (lst_symbol.next_entry)
{
/* Seek to the next symbol and read it in. */
if (bfd_seek (abfd, lst_filepos + lst_symbol.next_entry, SEEK_SET)
< 0)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
if (bfd_seek (abfd, lst_filepos + lst_symbol.next_entry, SEEK_SET) <0)
goto error_return;
if (bfd_read ((PTR) & lst_symbol, 1, sizeof (lst_symbol), abfd)
!= sizeof (lst_symbol))
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Seek to the name length & string and read them in. */
if (bfd_seek (abfd, lst_filepos + lst_header->string_loc
+ lst_symbol.name.n_strx - 4, SEEK_SET) < 0)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
if (bfd_read (&len, 1, 4, abfd) != 4)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Allocate space for the name and null terminate it too. */
set->name = bfd_zalloc (abfd, len + 1);
@ -4902,11 +4775,9 @@ som_bfd_fill_in_ar_symbols (abfd, lst_header, syms)
bfd_set_error (bfd_error_no_memory);
goto error_return;
}
if (bfd_read (set->name, 1, len, abfd) != len)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
set->name[len] = 0;
/* Fill in the file offset. Note that the "location" field points
@ -4953,10 +4824,7 @@ som_slurp_armap (abfd)
return false;
if (bfd_seek (abfd, (file_ptr) - 16, SEEK_CUR) < 0)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* For archives without .o files there is no symbol table. */
if (strncmp (nextname, "/ ", 16))
@ -4968,10 +4836,7 @@ som_slurp_armap (abfd)
/* Read in and sanity check the archive header. */
if (bfd_read ((PTR) &ar_header, 1, sizeof (struct ar_hdr), abfd)
!= sizeof (struct ar_hdr))
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
if (strncmp (ar_header.ar_fmag, ARFMAG, 2))
{
@ -4995,10 +4860,7 @@ som_slurp_armap (abfd)
in just a minute. */
if (bfd_read ((PTR) & lst_header, 1, sizeof (struct lst_header), abfd)
!= sizeof (struct lst_header))
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Sanity check. */
if (lst_header.a_magic != LIBMAGIC)
@ -5015,10 +4877,7 @@ som_slurp_armap (abfd)
/* Get back to the start of the library symbol table. */
if (bfd_seek (abfd, ardata->first_file_filepos - parsed_size
+ sizeof (struct lst_header), SEEK_SET) < 0)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Initializae the cache and allocate space for the library symbols. */
ardata->cache = 0;
@ -5039,10 +4898,7 @@ som_slurp_armap (abfd)
/* Seek back to the "first" file in the archive. Note the "first"
file may be the extended name table. */
if (bfd_seek (abfd, ardata->first_file_filepos, SEEK_SET) < 0)
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Notify the generic archive code that we have a symbol map. */
bfd_has_map (abfd) = true;
@ -5393,34 +5249,22 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst)
/* Now scribble out the hash table. */
if (bfd_write ((PTR) hash_table, lst.hash_size, 4, abfd)
!= lst.hash_size * 4)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* Then the SOM dictionary. */
if (bfd_write ((PTR) som_dict, lst.module_count,
sizeof (struct som_entry), abfd)
!= lst.module_count * sizeof (struct som_entry))
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* The library symbols. */
if (bfd_write ((PTR) lst_syms, nsyms, sizeof (struct lst_symbol_record), abfd)
!= nsyms * sizeof (struct lst_symbol_record))
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
/* And finally the strings. */
if (bfd_write ((PTR) strings, string_size, 1, abfd) != string_size)
{
bfd_set_error (bfd_error_system_call);
goto error_return;
}
goto error_return;
if (hash_table != NULL)
free (hash_table);
@ -5555,18 +5399,12 @@ som_write_armap (abfd)
/* Scribble out the ar header. */
if (bfd_write ((PTR) &hdr, 1, sizeof (struct ar_hdr), abfd)
!= sizeof (struct ar_hdr))
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Now scribble out the lst header. */
if (bfd_write ((PTR) &lst, 1, sizeof (struct lst_header), abfd)
!= sizeof (struct lst_header))
{
bfd_set_error (bfd_error_system_call);
return false;
}
return false;
/* Build and write the armap. */
if (som_bfd_ar_write_symbol_stuff (abfd, nsyms, stringsize, lst) == false)