diff --git a/bfd/archive.c b/bfd/archive.c index 90c3766..00045a3 100644 --- a/bfd/archive.c +++ b/bfd/archive.c @@ -121,7 +121,7 @@ DESCRIPTION Regular files with long names (or embedded spaces, for BSD variants): "/18 " - SVR4 style, name at offset 18 in name table. - "#1/23 " - Long name (or embedded paces) 23 characters long, + "#1/23 " - Long name (or embedded spaces) 23 characters long, BSD 4.4 style, full name follows header. Implemented for reading, not writing. " 18 " - Long name 18 characters long, extended pseudo-BSD. @@ -174,7 +174,11 @@ static struct areltdata *bfd_ar_hdr_from_filesystem PARAMS ((bfd *abfd, const char *, bfd *member)); void -_bfd_ar_spacepad (char *p, size_t n, const char *fmt, long val) +_bfd_ar_spacepad (p, n, fmt, val) + char *p; + size_t n; + const char *fmt; + long val; { static char buf[20]; size_t len; diff --git a/bfd/archive64.c b/bfd/archive64.c index 6267e68..0f99400 100644 --- a/bfd/archive64.c +++ b/bfd/archive64.c @@ -158,7 +158,6 @@ bfd_elf64_archive_write_armap (arch, elength, map, symbol_count, stridx) bfd *current = arch->archive_head; unsigned int count; struct ar_hdr hdr; - unsigned int i; int padding; bfd_byte buf[8]; @@ -171,19 +170,17 @@ bfd_elf64_archive_write_armap (arch, elength, map, symbol_count, stridx) + sizeof (struct ar_hdr) + SARMAG); - memset ((char *) (&hdr), 0, sizeof (struct ar_hdr)); - strcpy (hdr.ar_name, "/SYM64/"); - sprintf (hdr.ar_size, "%-10d", (int) mapsize); - sprintf (hdr.ar_date, "%ld", (long) time (NULL)); + memset (&hdr, ' ', sizeof (struct ar_hdr)); + memcpy (hdr.ar_name, "/SYM64/", strlen ("/SYM64/")); + _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld", + mapsize); + _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld", + time (NULL)); /* This, at least, is what Intel coff sets the values to.: */ - sprintf ((hdr.ar_uid), "%d", 0); - sprintf ((hdr.ar_gid), "%d", 0); - sprintf ((hdr.ar_mode), "%-7o", (unsigned) 0); - strncpy (hdr.ar_fmag, ARFMAG, 2); - - for (i = 0; i < sizeof (struct ar_hdr); i++) - if (((char *) (&hdr))[i] == '\0') - (((char *) (&hdr))[i]) = ' '; + _bfd_ar_spacepad (hdr.ar_uid, sizeof (hdr.ar_uid), "%ld", 0); + _bfd_ar_spacepad (hdr.ar_gid, sizeof (hdr.ar_gid), "%ld", 0); + _bfd_ar_spacepad (hdr.ar_mode, sizeof (hdr.ar_mode), "%-7lo", 0); + memcpy (hdr.ar_fmag, ARFMAG, 2); /* Write the ar header for this item and the number of symbols */ diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index 726883c..978abc0 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -173,6 +173,8 @@ bfd_boolean coff_write_armap extern PTR _bfd_generic_read_ar_hdr PARAMS ((bfd *)); +extern void _bfd_ar_spacepad + PARAMS ((char *, size_t, const char *, long)); extern PTR _bfd_generic_read_ar_hdr_mag PARAMS ((bfd *, const char *)); diff --git a/bfd/libbfd.h b/bfd/libbfd.h index c44bcc0..de0465b 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -178,6 +178,8 @@ bfd_boolean coff_write_armap extern PTR _bfd_generic_read_ar_hdr PARAMS ((bfd *)); +extern void _bfd_ar_spacepad + PARAMS ((char *, size_t, const char *, long)); extern PTR _bfd_generic_read_ar_hdr_mag PARAMS ((bfd *, const char *));