#define S_IXOTH 0001 /* Execute by others. */
#endif
+/*
+SECTION
+ Opening and closing BFDs
+
+SUBSECTION
+ Functions for opening and closing
+*/
+
/* Counters used to initialize the bfd identifier. */
static unsigned int bfd_id_counter = 0;
return true;
}
-/*
-SECTION
- Opening and closing BFDs
-
-SUBSECTION
- Functions for opening and closing
-*/
-
/*
FUNCTION
bfd_fopen
unsigned int crc_offset;
char *name;
bfd_size_type size;
- ufile_ptr file_size;
BFD_ASSERT (abfd);
BFD_ASSERT (crc32_out);
sect = bfd_get_section_by_name (abfd, GNU_DEBUGLINK);
- if (sect == NULL)
+ if (sect == NULL || (sect->flags & SEC_HAS_CONTENTS) == 0)
return NULL;
size = bfd_section_size (sect);
- file_size = bfd_get_size (abfd);
/* PR 22794: Make sure that the section has a reasonable size. */
- if (size < 8 || (file_size != 0 && size >= file_size))
+ if (size < 8)
return NULL;
if (!bfd_malloc_and_get_section (abfd, sect, &contents))
- {
- free (contents);
- return NULL;
- }
+ return NULL;
/* CRC value is stored after the filename, aligned up to 4 bytes. */
name = (char *) contents;
crc_offset = strnlen (name, size) + 1;
crc_offset = (crc_offset + 3) & ~3;
if (crc_offset + 4 > size)
- return NULL;
+ {
+ free (name);
+ return NULL;
+ }
*crc32 = bfd_get_32 (abfd, contents + crc_offset);
return name;
unsigned int buildid_offset;
char *name;
bfd_size_type size;
- ufile_ptr file_size;
BFD_ASSERT (abfd);
BFD_ASSERT (buildid_len);
sect = bfd_get_section_by_name (abfd, GNU_DEBUGALTLINK);
- if (sect == NULL)
+ if (sect == NULL || (sect->flags & SEC_HAS_CONTENTS) == 0)
return NULL;
size = bfd_section_size (sect);
- file_size = bfd_get_size (abfd);
- if (size < 8 || (file_size != 0 && size >= file_size))
+ if (size < 8)
return NULL;
if (!bfd_malloc_and_get_section (abfd, sect, & contents))
- {
- free (contents);
- return NULL;
- }
+ return NULL;
/* BuildID value is stored after the filename. */
name = (char *) contents;
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.
+ specified @var{filename}. The filename should be absolute or
+ relative to the current directory.
<<TRUE>> is returned if all is ok. Otherwise <<FALSE>> is returned
and bfd_error is set.
return false;
}
- /* Make sure that we can read the file.
- XXX - Should we attempt to locate the debug info file using the same
- algorithm as gdb ? At the moment, since we are creating the
- .gnu_debuglink section, we insist upon the user providing us with a
- correct-for-section-creation-time path, but this need not conform to
- the gdb location algorithm. */
+ /* Open the linked file so that we can compute a CRC. */
handle = _bfd_real_fopen (filename, FOPEN_RB);
if (handle == NULL)
{
return (struct bfd_build_id *) abfd->build_id;
sect = bfd_get_section_by_name (abfd, ".note.gnu.build-id");
- if (sect == NULL)
+ if (sect == NULL
+ || (sect->flags & SEC_HAS_CONTENTS) == 0)
{
bfd_set_error (bfd_error_no_debug_section);
return NULL;
}
if (!bfd_malloc_and_get_section (abfd, sect, & contents))
- {
- free (contents);
- return NULL;
- }
+ return NULL;
/* FIXME: Paranoia - allow for compressed build-id sections.
Maybe we should complain if this size is different from