* targets.c (BFD_JUMP_TABLE_ARCHIVE): Add case for

_construct_extended_name_table.
	(bfd_target): Add _bfd_construct_extended_name_table.
	* archive.c (_bfd_archive_bsd_construct_extended_name_table): New
	function.
	(_bfd_archive_coff_construct_extended_name_table): New function.
	(_bfd_construct_extended_name_table): Renamed by adding a leading
	underscore, and made externally visible.  Added trailing_slash
	argument, and used it instead of elf_style.  Changed type of
	tablen to bfd_size_type *.
	(_bfd_write_archive_contents): Use BFD_SEND to call
	construct_extended_name_table.  Use the returned name.
	* libbfd-in.h (_bfd_construct_extended_name_table): Declare.
	(_bfd_noarchive_construct_extended_name_table): Define.
	(_bfd_archive_bsd_construct_extended_name_table): Declare.
	(_bfd_archive_coff_construct_extended_name_table): Declare.
	* bfd-in2.h: Rebuild.
	* libbfd.h: Rebuild.
	* som.c (som_construct_extended_name_table): New static function.
	* aout-target.h (MY_construct_extended_name_table): Define.
	* coff-rs6000.c (rs6000coff_construct_extended_name_table):
	Define.
	* ieee.c (ieee_construct_extended_name_table): Define.
	* libecoff.h (_bfd_ecoff_construct_extended_name_table): Define.
	* oasys.c (oasys_construct_extended_name_table): Define.
This commit is contained in:
Ian Lance Taylor 1994-10-21 23:43:29 +00:00
parent f93fc38995
commit cd9782e8fd
3 changed files with 108 additions and 40 deletions

View File

@ -1,5 +1,31 @@
Fri Oct 21 17:13:07 1994 Ian Lance Taylor <ian@sanguine.cygnus.com>
* targets.c (BFD_JUMP_TABLE_ARCHIVE): Add case for
_construct_extended_name_table.
(bfd_target): Add _bfd_construct_extended_name_table.
* archive.c (_bfd_archive_bsd_construct_extended_name_table): New
function.
(_bfd_archive_coff_construct_extended_name_table): New function.
(_bfd_construct_extended_name_table): Renamed by adding a leading
underscore, and made externally visible. Added trailing_slash
argument, and used it instead of elf_style. Changed type of
tablen to bfd_size_type *.
(_bfd_write_archive_contents): Use BFD_SEND to call
construct_extended_name_table. Use the returned name.
* libbfd-in.h (_bfd_construct_extended_name_table): Declare.
(_bfd_noarchive_construct_extended_name_table): Define.
(_bfd_archive_bsd_construct_extended_name_table): Declare.
(_bfd_archive_coff_construct_extended_name_table): Declare.
* bfd-in2.h: Rebuild.
* libbfd.h: Rebuild.
* som.c (som_construct_extended_name_table): New static function.
* aout-target.h (MY_construct_extended_name_table): Define.
* coff-rs6000.c (rs6000coff_construct_extended_name_table):
Define.
* ieee.c (ieee_construct_extended_name_table): Define.
* libecoff.h (_bfd_ecoff_construct_extended_name_table): Define.
* oasys.c (oasys_construct_extended_name_table): Define.
Fix the ELF linker to not require an interpreter if no dynamic
objects were seen, even when linking PIC code.
* libelf.h (ELF_LINK_HASH_NEEDS_PLT): Define.

View File

@ -176,9 +176,6 @@ static char *get_extended_arelt_filename PARAMS ((bfd *arch,
static boolean do_slurp_bsd_armap PARAMS ((bfd *abfd));
static boolean do_slurp_coff_armap PARAMS ((bfd *abfd));
static const char *normalize PARAMS ((const char *file));
static boolean bfd_construct_extended_name_table PARAMS ((bfd *abfd,
char **tabloc,
unsigned int *));
static struct areltdata *bfd_ar_hdr_from_filesystem PARAMS ((bfd *abfd,
const char *));
static boolean compute_and_write_armap PARAMS ((bfd *arch,
@ -1155,6 +1152,32 @@ normalize (file)
}
#endif
/* Build a BFD style extended name table. */
boolean
_bfd_archive_bsd_construct_extended_name_table (abfd, tabloc, tablen, name)
bfd *abfd;
char **tabloc;
bfd_size_type *tablen;
const char **name;
{
*name = "ARFILENAMES/";
return _bfd_construct_extended_name_table (abfd, false, tabloc, tablen);
}
/* Build an SVR4 style extended name table. */
boolean
_bfd_archive_coff_construct_extended_name_table (abfd, tabloc, tablen, name)
bfd *abfd;
char **tabloc;
bfd_size_type *tablen;
const char **name;
{
*name = "//";
return _bfd_construct_extended_name_table (abfd, true, tabloc, tablen);
}
/* Follows archive_head and produces an extended name table if
necessary. Returns (in tabloc) a pointer to an extended name
table, and in tablen the length of the table. If it makes an entry
@ -1163,11 +1186,12 @@ normalize (file)
something went wrong. A successful return may still involve a
zero-length tablen! */
static boolean
bfd_construct_extended_name_table (abfd, tabloc, tablen)
boolean
_bfd_construct_extended_name_table (abfd, trailing_slash, tabloc, tablen)
bfd *abfd;
boolean trailing_slash;
char **tabloc;
unsigned int *tablen;
bfd_size_type *tablen;
{
unsigned int maxname = abfd->xvec->ar_max_namelen;
unsigned int total_namelen = 0;
@ -1189,7 +1213,15 @@ bfd_construct_extended_name_table (abfd, tabloc, tablen)
}
thislen = strlen (normal);
if (thislen > maxname)
total_namelen += thislen + 1; /* leave room for \n */
{
/* Add one to leave room for \n. */
total_namelen += thislen + 1;
if (trailing_slash)
{
/* Leave room for trailing slash. */
++total_namelen;
}
}
}
if (total_namelen == 0)
@ -1224,7 +1256,13 @@ bfd_construct_extended_name_table (abfd, tabloc, tablen)
generalise this hack. */
struct ar_hdr *hdr = arch_hdr (current);
strcpy (strptr, normal);
strptr[thislen] = '\012';
if (! trailing_slash)
strptr[thislen] = '\012';
else
{
strptr[thislen] = '/';
strptr[thislen + 1] = '\012';
}
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). */
@ -1238,6 +1276,8 @@ bfd_construct_extended_name_table (abfd, tabloc, tablen)
*temp = ' ';
}
strptr += thislen + 1;
if (trailing_slash)
++strptr;
}
}
@ -1459,7 +1499,8 @@ _bfd_write_archive_contents (arch)
{
bfd *current;
char *etable = NULL;
unsigned int elength = 0;
bfd_size_type elength = 0;
const char *ename = NULL;
boolean makemap = bfd_has_map (arch);
boolean hasobjects = false; /* if no .o's, don't bother to make a map */
bfd_size_type wrote;
@ -1500,7 +1541,8 @@ _bfd_write_archive_contents (arch)
}
}
if (!bfd_construct_extended_name_table (arch, &etable, &elength))
if (!BFD_SEND (arch, _bfd_construct_extended_name_table,
(arch, &etable, &elength, &ename)))
return false;
if (bfd_seek (arch, (file_ptr) 0, SEEK_SET) != 0)
@ -1524,10 +1566,7 @@ _bfd_write_archive_contents (arch)
struct ar_hdr hdr;
memset ((char *) (&hdr), 0, sizeof (struct ar_hdr));
if (ar_padchar (arch) == '/')
sprintf (&(hdr.ar_name[0]), "//");
else
sprintf (&(hdr.ar_name[0]), "ARFILENAMES/");
strcpy (hdr.ar_name, ename);
sprintf (&(hdr.ar_size[0]), "%-10d", (int) elength);
strncpy (hdr.ar_fmag, ARFMAG, 2);
for (i = 0; i < sizeof (struct ar_hdr); i++)
@ -1578,23 +1617,24 @@ _bfd_write_archive_contents (arch)
}
}
/* Verify the timestamp in the archive file. If it would not be
accepted by the linker, rewrite it until it would be. If
anything odd happens, break out and just return. (The Berkeley
linker checks the timestamp and refuses to read the
table-of-contents if it is >60 seconds less than the file's
modified-time. That painful hack requires this painful hack. */
tries = 1;
do
if (makemap && hasobjects)
{
if (bfd_update_armap_timestamp (arch) == true) /* FIXME!!! Vector it */
break;
if (tries > 0)
fprintf (stderr,
"Warning: writing archive was slow: rewriting timestamp\n");
/* Verify the timestamp in the archive file. If it would not be
accepted by the linker, rewrite it until it would be. If
anything odd happens, break out and just return. (The
Berkeley linker checks the timestamp and refuses to read the
table-of-contents if it is >60 seconds less than the file's
modified-time. That painful hack requires this painful hack. */
tries = 1;
do
{
if (bfd_update_armap_timestamp (arch))
break;
fprintf (stderr,
"Warning: writing archive was slow: rewriting timestamp\n");
}
while (++tries < 6);
}
while (++tries < 6);
return true;
}
@ -1759,14 +1799,14 @@ bsd_write_armap (arch, elength, map, orl_count, stridx)
int stridx;
{
int padit = stridx & 1;
unsigned int ranlibsize = orl_count * sizeof (struct ranlib);
unsigned int ranlibsize = orl_count * BSD_SYMDEF_SIZE;
unsigned int stringsize = stridx + padit;
/* Include 8 bytes to store ranlibsize and stringsize in output. */
unsigned int mapsize = ranlibsize + stringsize + 8;
file_ptr firstreal;
bfd *current = arch->archive_head;
bfd *last_elt = current; /* last element arch seen */
int temp;
bfd_byte temp[4];
int count;
struct ar_hdr hdr;
struct stat statbuf;
@ -1792,14 +1832,13 @@ bsd_write_armap (arch, elength, map, orl_count, stridx)
if (bfd_write ((char *) &hdr, 1, sizeof (struct ar_hdr), arch)
!= sizeof (struct ar_hdr))
return false;
bfd_h_put_32 (arch, (bfd_vma) ranlibsize, (PTR) &temp);
if (bfd_write (&temp, 1, sizeof (temp), arch) != sizeof (temp))
bfd_h_put_32 (arch, (bfd_vma) ranlibsize, temp);
if (bfd_write (temp, 1, sizeof (temp), arch) != sizeof (temp))
return false;
for (count = 0; count < orl_count; count++)
{
struct symdef outs;
struct symdef *outp = &outs;
bfd_byte buf[BSD_SYMDEF_SIZE];
if (((bfd *) (map[count]).pos) != last_elt)
{
@ -1813,15 +1852,15 @@ bsd_write_armap (arch, elength, map, orl_count, stridx)
} /* if new archive element */
last_elt = current;
bfd_h_put_32 (arch, ((map[count]).namidx), (PTR) &outs.s.string_offset);
bfd_h_put_32 (arch, firstreal, (PTR) &outs.file_offset);
if (bfd_write ((char *) outp, 1, sizeof (outs), arch) != sizeof (outs))
bfd_h_put_32 (arch, map[count].namidx, buf);
bfd_h_put_32 (arch, firstreal, buf + BSD_SYMDEF_OFFSET_SIZE);
if (bfd_write (buf, BSD_SYMDEF_SIZE, 1, arch) != BSD_SYMDEF_SIZE)
return false;
}
/* now write the strings themselves */
bfd_h_put_32 (arch, stringsize, (PTR) &temp);
if (bfd_write ((PTR) &temp, 1, sizeof (temp), arch) != sizeof (temp))
bfd_h_put_32 (arch, stringsize, temp);
if (bfd_write (temp, 1, sizeof (temp), arch) != sizeof (temp))
return false;
for (count = 0; count < orl_count; count++)
{

View File

@ -283,6 +283,7 @@ The general target vector.
.#define BFD_JUMP_TABLE_ARCHIVE(NAME)\
.CAT(NAME,_slurp_armap),\
.CAT(NAME,_slurp_extended_name_table),\
.CAT(NAME,_construct_extended_name_table),\
.CAT(NAME,_truncate_arname),\
.CAT(NAME,_write_armap),\
.CAT(NAME,_openr_next_archived_file),\
@ -290,6 +291,8 @@ The general target vector.
.CAT(NAME,_update_armap_timestamp)
. boolean (*_bfd_slurp_armap) PARAMS ((bfd *));
. boolean (*_bfd_slurp_extended_name_table) PARAMS ((bfd *));
. boolean (*_bfd_construct_extended_name_table)
. PARAMS ((bfd *, char **, bfd_size_type *, const char **));
. void (*_bfd_truncate_arname) PARAMS ((bfd *, CONST char *, char *));
. boolean (*write_armap) PARAMS ((bfd *arch,
. unsigned int elength,