(amiga_ardata_type): Add new member.

(amiga_read_ar_hdr): Strip path part from read hunk name. If object file does
not have a valid hunk name, fake an unique object name to match expectations
of eg. the GCC build machinery about extracted object names from a link lib.
This commit is contained in:
Gunther Nikl
2008-11-25 20:53:47 +00:00
parent 13c70d6ec5
commit 96fb56c052
+27 -10
View File
@@ -146,6 +146,7 @@ typedef struct amiga_ardata_struct {
unsigned long filesize;
struct arch_syms *defsyms;
unsigned long defsym_count;
unsigned long outnum;
} amiga_ardata_type;
#define amiga_ardata(bfd) (*(amiga_ardata_type **)(void *)&(bfd)->tdata.aout_ar_data)
@@ -3011,7 +3012,7 @@ amiga_read_ar_hdr (abfd)
{
struct areltdata *ared;
unsigned long start_pos,len;
char buf[8];
char buf[8],*base,*name;
start_pos = bfd_tell (abfd);
if (start_pos >= amiga_ardata(abfd)->filesize) {
@@ -3033,16 +3034,32 @@ amiga_read_ar_hdr (abfd)
return NULL;
len = GL (&buf[4]) << 2;
if (len) {
ared->filename = bfd_alloc (abfd, len+1);
if (ared->filename == NULL)
return NULL;
if (bfd_bread (ared->filename, len, abfd) != len)
return NULL;
ared->filename[len] = '\0';
ared->filename = bfd_alloc (abfd, len+1 > 16 ? len+1 : 16);
if (ared->filename == NULL)
return NULL;
switch (len) {
default:
if (bfd_bread (ared->filename, len, abfd) != len)
return NULL;
ared->filename[len] = '\0';
/* strip path part */
base = strchr (name = ared->filename, ':');
if (base != NULL)
name = base + 1;
for (base = name; *name; ++name)
if (*name == '/')
base = name + 1;
if (*base != '\0') {
ared->filename = base;
break;
}
/* Fall through */
case 0: /* fake a name */
sprintf (ared->filename, "obj-%08lu.o", ++amiga_ardata(abfd)->outnum);
break;
}
else
ared->filename = "(no name)";
if (bfd_seek (abfd, start_pos+4, SEEK_SET))
return NULL;