Step 2: base tools: devel/binutils
This commit is contained in:
70
devel/binutils/patches/patch-bfd_archive.c
Normal file
70
devel/binutils/patches/patch-bfd_archive.c
Normal file
@@ -0,0 +1,70 @@
|
||||
$NetBSD$
|
||||
|
||||
--- bfd/archive.c.orig Mon Mar 25 08:06:19 2013
|
||||
+++ bfd/archive.c
|
||||
@@ -157,6 +157,9 @@ struct ar_cache
|
||||
#define ar_maxnamelen(abfd) ((abfd)->xvec->ar_max_namelen)
|
||||
|
||||
#define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data))
|
||||
+
|
||||
+static const char * normalize (bfd *, const char *);
|
||||
+
|
||||
#define arch_hdr(bfd) ((struct ar_hdr *) arch_eltdata (bfd)->arch_header)
|
||||
|
||||
/* True iff NAME designated a BSD 4.4 extended name. */
|
||||
@@ -760,7 +763,9 @@ bfd_generic_openr_next_archived_file (bfd *archive, bf
|
||||
/* Pad to an even boundary...
|
||||
Note that last_file->origin can be odd in the case of
|
||||
BSD-4.4-style element with a long odd size. */
|
||||
- filestart += filestart % 2;
|
||||
+ if (!strncmp(arch_hdr (last_file)->ar_name, "#1/", 3))
|
||||
+ size += strlen(normalize(last_file, last_file->filename));
|
||||
+ filestart += size % 2;
|
||||
}
|
||||
|
||||
return _bfd_get_elt_at_filepos (archive, filestart);
|
||||
@@ -2180,11 +2185,22 @@ _bfd_write_archive_contents (bfd *arch)
|
||||
current = current->archive_next)
|
||||
{
|
||||
char buffer[DEFAULT_BUFFERSIZE];
|
||||
- bfd_size_type remaining = arelt_size (current);
|
||||
+ bfd_size_type saved_size = arelt_size (current);
|
||||
+ bfd_size_type remaining = saved_size;
|
||||
+ struct ar_hdr *hdr = arch_hdr (current);
|
||||
|
||||
/* Write ar header. */
|
||||
if (!_bfd_write_ar_hdr (arch, current))
|
||||
- return FALSE;
|
||||
+ return FALSE;
|
||||
+ /* Write filename if it is a 4.4BSD extended file, and add to size. */
|
||||
+ if (!strncmp (hdr->ar_name, "#1/", 3))
|
||||
+ {
|
||||
+ const char *normal = normalize (current, current->filename);
|
||||
+ unsigned int thislen = strlen (normal);
|
||||
+ if (bfd_write (normal, 1, thislen, arch) != thislen)
|
||||
+ return FALSE;
|
||||
+ saved_size += thislen;
|
||||
+ }
|
||||
if (bfd_is_thin_archive (arch))
|
||||
continue;
|
||||
if (bfd_seek (current, (file_ptr) 0, SEEK_SET) != 0)
|
||||
@@ -2457,11 +2473,19 @@ bsd_write_armap (bfd *arch,
|
||||
{
|
||||
do
|
||||
{
|
||||
+#if 1
|
||||
+ bfd_size_type size = arelt_size (current);
|
||||
+ if (!strncmp(arch_hdr (current)->ar_name, "#1/", 3))
|
||||
+ size += strlen(normalize(current, current->filename));
|
||||
+ firstreal += size + sizeof (struct ar_hdr);
|
||||
+ firstreal += size % 2;
|
||||
+#else
|
||||
struct areltdata *ared = arch_eltdata (current);
|
||||
|
||||
firstreal += (ared->parsed_size + ared->extra_size
|
||||
+ sizeof (struct ar_hdr));
|
||||
firstreal += firstreal % 2;
|
||||
+#endif
|
||||
current = current->archive_next;
|
||||
}
|
||||
while (current != map[count].u.abfd);
|
||||
Reference in New Issue
Block a user