mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-24 12:39:59 +00:00
* libbfd.c (bfd_read): Set bfd_error as appropriate for a short
read. (bfd_error_system_call or bfd_error_file_truncated). * som.c: Do not blindly set bfd_error_system_call after a failing bfd_read, bfd_write, or bfd_seek. In a few places (like som_object_p) override the error status set by bfd_read. * aix386-core.c, aout-encap,c archive.c, bout.c: Likewise. * coff-rs6000.c, coffgen.c ecoff.c, elf.c: Likewise. * elf32-hppa.c, elfcode.h, hp300hpux.c, i386lynx.c: Likewise. * nlm32-alpha.c, nlm32-i386.c, nlm32-sparc.c: Likewise. * som.c: Check return values from several bfd_{seek,read,write} calls that we just assumed were not failing.
This commit is contained in:
parent
649694ea87
commit
250578363e
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
110
bfd/archive.c
110
bfd/archive.c
@ -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;
|
||||
}
|
||||
|
||||
|
103
bfd/bout.c
103
bfd/bout.c
@ -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;
|
||||
|
@ -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 */
|
||||
|
199
bfd/coffgen.c
199
bfd/coffgen.c
@ -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;
|
||||
|
||||
|
13
bfd/ecoff.c
13
bfd/ecoff.c
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
711
bfd/hp300hpux.c
711
bfd/hp300hpux.c
@ -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;
|
||||
|
461
bfd/i386lynx.c
461
bfd/i386lynx.c
@ -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;
|
||||
|
@ -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. */
|
||||
|
@ -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++)
|
||||
{
|
||||
|
@ -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
338
bfd/som.c
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user