Fix --add-gnu-debuglink

This commit is contained in:
Nick Clifton 2003-06-27 08:01:28 +00:00
parent 72b4917c07
commit e7c81c254c
5 changed files with 114 additions and 34 deletions

View file

@ -1,3 +1,12 @@
2003-06-27 Nick Clifton <nickc@redhat.com>
* opncls.c (bfd_add_gnu_debuglink_section): Rename to
bfd_add_gnu_debuglink_section and only create the section, do not
fill in its contents.
(bfd_fill_in_gnu_debuglink_section): New function. Fill in the
contents of a .gnu-debuglink section.
* bfd-in2.h: Regenerate.
2003-06-27 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
* elfxx-mips.c: Revert .got alignment to 2**4.

View file

@ -911,8 +911,11 @@ bfd_calc_gnu_debuglink_crc32 PARAMS ((unsigned long crc, const unsigned char *bu
char *
bfd_follow_gnu_debuglink PARAMS ((bfd *abfd, const char *dir));
struct sec *
bfd_create_gnu_debuglink_section PARAMS ((bfd * abfd, const char * filename));
bfd_boolean
bfd_add_gnu_debuglink PARAMS ((bfd * abfd, const char * filename));
bfd_fill_in_gnu_debuglink_section PARAMS ((bfd * abfd, struct sec * sect, const char * filename));
/* Extracted from libbfd.c. */

View file

@ -1058,16 +1058,82 @@ bfd_follow_gnu_debuglink (abfd, dir)
/*
FUNCTION
bfd_add_gnu_debuglink
bfd_create_gnu_debuglink_section
SYNOPSIS
bfd_boolean bfd_add_gnu_debuglink (bfd * abfd, const char * filename);
struct sec * bfd_create_gnu_debuglink_section (bfd * abfd, const char * filename);
DESCRIPTION
Takes a @var{BFD} and adds a .gnu_debuglink section containing a link
to the specified @var{filename}. The filename should be relative to
the current directory.
Takes a @var{BFD} and adds a .gnu_debuglink section to it. The section is sized
to be big enough to contain a link to the specified @var{filename}.
RETURNS
A pointer to the new section is returned if all is ok. Otherwise <<NULL>> is
returned and bfd_error is set.
*/
asection *
bfd_create_gnu_debuglink_section
(bfd * abfd,
const char * filename)
{
asection * sect;
bfd_size_type debuglink_size;
if (abfd == NULL || filename == NULL)
{
bfd_set_error (bfd_error_invalid_operation);
return NULL;
}
/* Strip off any path components in filename. */
filename = lbasename (filename);
sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
if (sect)
{
/* Section already exists. */
bfd_set_error (bfd_error_invalid_operation);
return NULL;
}
sect = bfd_make_section (abfd, GNU_DEBUGLINK);
if (sect == NULL)
return NULL;
if (! bfd_set_section_flags (abfd, sect,
SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING))
/* XXX Should we delete the section from the bfd ? */
return NULL;
debuglink_size = strlen (filename) + 1;
debuglink_size += 3;
debuglink_size &= ~3;
debuglink_size += 4;
if (! bfd_set_section_size (abfd, sect, debuglink_size))
/* XXX Should we delete the section from the bfd ? */
return NULL;
return sect;
}
/*
FUNCTION
bfd_fill_in_gnu_debuglink_section
SYNOPSIS
bfd_boolean bfd_fill_in_gnu_debuglink_section (bfd * abfd, struct sec * sect, const char * filename);
DESCRIPTION
Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
and fills in the contents of the section to contain a link to the
specified @var{filename}. The filename should be relative to the
current directory.
RETURNS
<<TRUE>> is returned if all is ok. Otherwise <<FALSE>> is returned
@ -1075,11 +1141,11 @@ RETURNS
*/
bfd_boolean
bfd_add_gnu_debuglink (abfd, filename)
bfd *abfd;
const char * filename;
bfd_fill_in_gnu_debuglink_section
(bfd * abfd,
struct sec * sect,
const char * filename)
{
asection * sect;
bfd_size_type debuglink_size;
unsigned long crc32;
char * contents;
@ -1088,7 +1154,7 @@ bfd_add_gnu_debuglink (abfd, filename)
static char buffer[8 * 1024];
size_t count;
if (abfd == NULL || filename == NULL)
if (abfd == NULL || sect == NULL || filename == NULL)
{
bfd_set_error (bfd_error_invalid_operation);
return FALSE;
@ -1116,33 +1182,11 @@ bfd_add_gnu_debuglink (abfd, filename)
now that we no longer need them. */
filename = lbasename (filename);
sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
if (sect)
{
/* Section already exists. */
bfd_set_error (bfd_error_invalid_operation);
return FALSE;
}
sect = bfd_make_section (abfd, GNU_DEBUGLINK);
if (sect == NULL)
return FALSE;
if (! bfd_set_section_flags (abfd, sect,
SEC_HAS_CONTENTS | SEC_DEBUGGING))
/* XXX Should we delete the section from the bfd ? */
return FALSE;
debuglink_size = strlen (filename) + 1;
debuglink_size += 3;
debuglink_size &= ~3;
debuglink_size += 4;
if (! bfd_set_section_size (abfd, sect, debuglink_size))
/* XXX Should we delete the section from the bfd ? */
return FALSE;
contents = malloc (debuglink_size);
if (contents == NULL)
{

View file

@ -1,3 +1,11 @@
2003-06-27 Nick Clifton <nickc@redhat.com>
* objcopy.c (copy_object): Replace call to
bfd_create_gnu_debuglink_section with seperate calls to
bfd_add_gnu_debuglink_section and
bfd_fill_in_gnu_debuglink_section, seperated by a walk over the
symbol tables.
2003-06-26 Roland McGrath <roland@redhat.com>
* readelf.c (loadaddr): Variable removed.

View file

@ -1132,6 +1132,7 @@ copy_object (ibfd, obfd)
bfd_vma start;
long symcount;
asection **osections = NULL;
asection * gnu_debuglink_section = NULL;
bfd_size_type *gaps = NULL;
bfd_size_type max_gap = 0;
long symsize;
@ -1249,8 +1250,13 @@ copy_object (ibfd, obfd)
if (gnu_debuglink_filename != NULL)
{
if (! bfd_add_gnu_debuglink (obfd, gnu_debuglink_filename))
gnu_debuglink_section = bfd_create_gnu_debuglink_section (obfd, gnu_debuglink_filename);
if (gnu_debuglink_section == NULL)
{
fprintf (stderr, "UGG\n");
RETURN_NONFATAL (gnu_debuglink_filename);
}
}
if (gap_fill_set || pad_to_set)
@ -1413,6 +1419,16 @@ copy_object (ibfd, obfd)
}
}
if (gnu_debuglink_filename != NULL)
{
if (! bfd_fill_in_gnu_debuglink_section
(obfd, gnu_debuglink_section, gnu_debuglink_filename))
{
fprintf (stderr, "UGG 2\n");
RETURN_NONFATAL (gnu_debuglink_filename);
}
}
if (gap_fill_set || pad_to_set)
{
bfd_byte *buf;