mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-20 18:08:24 +08:00
Fix building the BFD library for Win64 by reqorking the find_separate_debug_file interface.
* opncls.c (bfd_get_debug_link_info): Rename to... (bfd_get_debug_link_info_1): ... this. Change type of second parameter to void pointer. Adjust. (bfd_get_debug_link_info): Reimplement on top of bfd_get_debug_link_info_1. (separate_debug_file_exists, separate_alt_debug_file_exists): Change type of second parameter to void pointer. Adjust. (get_func_type, check_func_type): Change type of second parameter to void pointer. (find_separate_debug_file): Add 'func_data' parameter. Pass it to the callback functions instead of passing the address of a local. (bfd_follow_gnu_debuglink): Pass address of unsigned long local to find_separate_debug_file. (get_alt_debug_link_info_shim): Change type of second parameter to void pointer. Adjust. (bfd_follow_gnu_debugaltlink): Adjust to pass NULL to find_separate_debug_file. (get_build_id_name, bfd_boolean check_build_id_file): Change type of second parameter to void pointer. Adjust. (bfd_follow_build_id_debuglink): Pass address of bfd_build_id pointer local to find_separate_debug_file.
This commit is contained in:

committed by
Nick Clifton

parent
ae3f8c2813
commit
49f4617bf4
@ -1,4 +1,28 @@
|
|||||||
2017-04-07 gingold <gingold@gingold-Precision-7510>
|
2017-04-07 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
* opncls.c (bfd_get_debug_link_info): Rename to...
|
||||||
|
(bfd_get_debug_link_info_1): ... this. Change type of second
|
||||||
|
parameter to void pointer. Adjust.
|
||||||
|
(bfd_get_debug_link_info): Reimplement on top of
|
||||||
|
bfd_get_debug_link_info_1.
|
||||||
|
(separate_debug_file_exists, separate_alt_debug_file_exists):
|
||||||
|
Change type of second parameter to void pointer. Adjust.
|
||||||
|
(get_func_type, check_func_type): Change type of second parameter
|
||||||
|
to void pointer.
|
||||||
|
(find_separate_debug_file): Add 'func_data' parameter. Pass it to
|
||||||
|
the callback functions instead of passing the address of a local.
|
||||||
|
(bfd_follow_gnu_debuglink): Pass address of unsigned long local to
|
||||||
|
find_separate_debug_file.
|
||||||
|
(get_alt_debug_link_info_shim): Change type of second parameter to
|
||||||
|
void pointer. Adjust.
|
||||||
|
(bfd_follow_gnu_debugaltlink): Adjust to pass NULL to
|
||||||
|
find_separate_debug_file.
|
||||||
|
(get_build_id_name, bfd_boolean check_build_id_file): Change type
|
||||||
|
of second parameter to void pointer. Adjust.
|
||||||
|
(bfd_follow_build_id_debuglink): Pass address of bfd_build_id
|
||||||
|
pointer local to find_separate_debug_file.
|
||||||
|
|
||||||
|
2017-04-07 Tristan Gingold <gingold@gingold-Precision-7510>
|
||||||
|
|
||||||
* coffgen.c (_bfd_coff_gc_mark_hook): Handle PE weak
|
* coffgen.c (_bfd_coff_gc_mark_hook): Handle PE weak
|
||||||
external symbols with a definition.
|
external symbols with a definition.
|
||||||
|
221
bfd/opncls.c
221
bfd/opncls.c
@ -366,10 +366,10 @@ FUNCTION
|
|||||||
bfd_openstreamr
|
bfd_openstreamr
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
bfd *bfd_openstreamr (const char * filename, const char * target, void * stream);
|
bfd *bfd_openstreamr (const char * filename, const char * target,
|
||||||
|
void * stream);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
|
||||||
Open a BFD for read access on an existing stdio stream. When
|
Open a BFD for read access on an existing stdio stream. When
|
||||||
the BFD is passed to <<bfd_close>>, the stream will be closed.
|
the BFD is passed to <<bfd_close>>, the stream will be closed.
|
||||||
|
|
||||||
@ -431,7 +431,6 @@ SYNOPSIS
|
|||||||
struct stat *sb));
|
struct stat *sb));
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
|
||||||
Create and return a BFD backed by a read-only @var{stream}.
|
Create and return a BFD backed by a read-only @var{stream}.
|
||||||
The @var{stream} is created using @var{open_func}, accessed using
|
The @var{stream} is created using @var{open_func}, accessed using
|
||||||
@var{pread_func} and destroyed using @var{close_func}.
|
@var{pread_func} and destroyed using @var{close_func}.
|
||||||
@ -502,6 +501,7 @@ opncls_bread (struct bfd *abfd, void *buf, file_ptr nbytes)
|
|||||||
{
|
{
|
||||||
struct opncls *vec = (struct opncls *) abfd->iostream;
|
struct opncls *vec = (struct opncls *) abfd->iostream;
|
||||||
file_ptr nread = (vec->pread) (abfd, vec->stream, buf, nbytes, vec->where);
|
file_ptr nread = (vec->pread) (abfd, vec->stream, buf, nbytes, vec->where);
|
||||||
|
|
||||||
if (nread < 0)
|
if (nread < 0)
|
||||||
return nread;
|
return nread;
|
||||||
vec->where += nread;
|
vec->where += nread;
|
||||||
@ -523,6 +523,7 @@ opncls_bclose (struct bfd *abfd)
|
|||||||
/* Since the VEC's memory is bound to the bfd deleting the bfd will
|
/* Since the VEC's memory is bound to the bfd deleting the bfd will
|
||||||
free it. */
|
free it. */
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
|
||||||
if (vec->close != NULL)
|
if (vec->close != NULL)
|
||||||
status = (vec->close) (abfd, vec->stream);
|
status = (vec->close) (abfd, vec->stream);
|
||||||
abfd->iostream = NULL;
|
abfd->iostream = NULL;
|
||||||
@ -560,7 +561,8 @@ opncls_bmmap (struct bfd *abfd ATTRIBUTE_UNUSED,
|
|||||||
return (void *) -1;
|
return (void *) -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct bfd_iovec opncls_iovec = {
|
static const struct bfd_iovec opncls_iovec =
|
||||||
|
{
|
||||||
&opncls_bread, &opncls_bwrite, &opncls_btell, &opncls_bseek,
|
&opncls_bread, &opncls_bwrite, &opncls_btell, &opncls_bseek,
|
||||||
&opncls_bclose, &opncls_bflush, &opncls_bstat, &opncls_bmmap
|
&opncls_bclose, &opncls_bflush, &opncls_bstat, &opncls_bmmap
|
||||||
};
|
};
|
||||||
@ -700,7 +702,6 @@ _maybe_make_executable (bfd * abfd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
FUNCTION
|
FUNCTION
|
||||||
bfd_close
|
bfd_close
|
||||||
|
|
||||||
@ -708,7 +709,6 @@ SYNOPSIS
|
|||||||
bfd_boolean bfd_close (bfd *abfd);
|
bfd_boolean bfd_close (bfd *abfd);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
|
||||||
Close a BFD. If the BFD was open for writing, then pending
|
Close a BFD. If the BFD was open for writing, then pending
|
||||||
operations are completed and the file written out and closed.
|
operations are completed and the file written out and closed.
|
||||||
If the created file is executable, then <<chmod>> is called
|
If the created file is executable, then <<chmod>> is called
|
||||||
@ -723,7 +723,6 @@ RETURNS
|
|||||||
<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
|
<<TRUE>> is returned if all is ok, otherwise <<FALSE>>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
bfd_boolean
|
bfd_boolean
|
||||||
bfd_close (bfd *abfd)
|
bfd_close (bfd *abfd)
|
||||||
{
|
{
|
||||||
@ -1157,25 +1156,35 @@ bfd_calc_gnu_debuglink_crc32 (unsigned long crc,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
FUNCTION
|
INTERNAL_FUNCTION
|
||||||
bfd_get_debug_link_info
|
bfd_get_debug_link_info_1
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
char *bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out);
|
char *bfd_get_debug_link_info_1 (bfd *abfd, void *crc32_out);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Fetch the filename and CRC32 value for any separate debuginfo
|
Extracts the filename and CRC32 value for any separate debug
|
||||||
associated with @var{abfd}. Return NULL if no such info found,
|
information file associated with @var{abfd}.
|
||||||
otherwise return filename and update @var{crc32_out}. The
|
|
||||||
returned filename is allocated with @code{malloc}; freeing it
|
The @var{crc32_out} parameter is an untyped pointer because
|
||||||
is the responsibility of the caller.
|
this routine is used as a @code{get_func_type} function, but it
|
||||||
|
is expected to be an unsigned long pointer.
|
||||||
|
|
||||||
|
RETURNS
|
||||||
|
The filename of the associated debug information file, or NULL
|
||||||
|
if there is no such file. If the filename was found then the
|
||||||
|
contents of @var{crc32_out} are updated to hold the corresponding
|
||||||
|
CRC32 value for the file.
|
||||||
|
|
||||||
|
The returned filename is allocated with @code{malloc}; freeing
|
||||||
|
it is the responsibility of the caller.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *
|
static char *
|
||||||
bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
|
bfd_get_debug_link_info_1 (bfd *abfd, void *crc32_out)
|
||||||
{
|
{
|
||||||
asection *sect;
|
asection *sect;
|
||||||
unsigned long crc32;
|
unsigned long *crc32 = (unsigned long *) crc32_out;
|
||||||
bfd_byte *contents;
|
bfd_byte *contents;
|
||||||
unsigned int crc_offset;
|
unsigned int crc_offset;
|
||||||
char *name;
|
char *name;
|
||||||
@ -1203,12 +1212,38 @@ bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
|
|||||||
if (crc_offset >= bfd_get_section_size (sect))
|
if (crc_offset >= bfd_get_section_size (sect))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
crc32 = bfd_get_32 (abfd, contents + crc_offset);
|
*crc32 = bfd_get_32 (abfd, contents + crc_offset);
|
||||||
|
|
||||||
*crc32_out = crc32;
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
FUNCTION
|
||||||
|
bfd_get_debug_link_info
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
char *bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out);
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Extracts the filename and CRC32 value for any separate debug
|
||||||
|
information file associated with @var{abfd}.
|
||||||
|
|
||||||
|
RETURNS
|
||||||
|
The filename of the associated debug information file, or NULL
|
||||||
|
if there is no such file. If the filename was found then the
|
||||||
|
contents of @var{crc32_out} are updated to hold the corresponding
|
||||||
|
CRC32 value for the file.
|
||||||
|
|
||||||
|
The returned filename is allocated with @code{malloc}; freeing
|
||||||
|
it is the responsibility of the caller.
|
||||||
|
*/
|
||||||
|
|
||||||
|
char *
|
||||||
|
bfd_get_debug_link_info (bfd *abfd, unsigned long *crc32_out)
|
||||||
|
{
|
||||||
|
return bfd_get_debug_link_info_1 (abfd, crc32_out);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
FUNCTION
|
FUNCTION
|
||||||
bfd_get_alt_debug_link_info
|
bfd_get_alt_debug_link_info
|
||||||
@ -1223,8 +1258,8 @@ DESCRIPTION
|
|||||||
associated with @var{abfd}. Return NULL if no such info found,
|
associated with @var{abfd}. Return NULL if no such info found,
|
||||||
otherwise return filename and update @var{buildid_len} and
|
otherwise return filename and update @var{buildid_len} and
|
||||||
@var{buildid_out}. The returned filename and build_id are
|
@var{buildid_out}. The returned filename and build_id are
|
||||||
allocated with @code{malloc}; freeing them is the
|
allocated with @code{malloc}; freeing them is the responsibility
|
||||||
responsibility of the caller.
|
of the caller.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *
|
char *
|
||||||
@ -1271,22 +1306,30 @@ INTERNAL_FUNCTION
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
bfd_boolean separate_debug_file_exists
|
bfd_boolean separate_debug_file_exists
|
||||||
(char *name, unsigned long crc32);
|
(char *name, void *crc32_p);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Checks to see if @var{name} is a file and if its contents
|
Checks to see if @var{name} is a file and if its contents
|
||||||
match @var{crc32}.
|
match @var{crc32}, which is a pointer to an @code{unsigned
|
||||||
|
long} containing a CRC32.
|
||||||
|
|
||||||
|
The @var{crc32_p} parameter is an untyped pointer because
|
||||||
|
this routine is used as a @code{check_func_type} function.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
separate_debug_file_exists (const char *name, const unsigned long crc)
|
separate_debug_file_exists (const char *name, void *crc32_p)
|
||||||
{
|
{
|
||||||
static unsigned char buffer [8 * 1024];
|
static unsigned char buffer [8 * 1024];
|
||||||
unsigned long file_crc = 0;
|
unsigned long file_crc = 0;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
bfd_size_type count;
|
bfd_size_type count;
|
||||||
|
unsigned long crc;
|
||||||
|
|
||||||
BFD_ASSERT (name);
|
BFD_ASSERT (name);
|
||||||
|
BFD_ASSERT (crc32_p);
|
||||||
|
|
||||||
|
crc = *(unsigned long *) crc32_p;
|
||||||
|
|
||||||
f = _bfd_real_fopen (name, FOPEN_RB);
|
f = _bfd_real_fopen (name, FOPEN_RB);
|
||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
@ -1306,16 +1349,14 @@ INTERNAL_FUNCTION
|
|||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
bfd_boolean separate_alt_debug_file_exists
|
bfd_boolean separate_alt_debug_file_exists
|
||||||
(char *name, unsigned long buildid);
|
(char *name, void *unused);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Checks to see if @var{name} is a file and if its BuildID
|
Checks to see if @var{name} is a file.
|
||||||
matches @var{buildid}.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
separate_alt_debug_file_exists (const char *name,
|
separate_alt_debug_file_exists (const char *name, void *unused ATTRIBUTE_UNUSED)
|
||||||
const unsigned long buildid ATTRIBUTE_UNUSED)
|
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
@ -1325,8 +1366,6 @@ separate_alt_debug_file_exists (const char *name,
|
|||||||
if (f == NULL)
|
if (f == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* FIXME: Add code to check buildid. */
|
|
||||||
|
|
||||||
fclose (f);
|
fclose (f);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -1339,36 +1378,43 @@ INTERNAL_FUNCTION
|
|||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
char *find_separate_debug_file
|
char *find_separate_debug_file
|
||||||
(bfd *abfd, const char *dir, bfd_boolean include_dirs,
|
(bfd *abfd, const char *dir, bfd_boolean include_dirs,
|
||||||
get_func_type get, check_func_type check);
|
get_func_type get, check_func_type check, void *data);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Searches for a debug information file corresponding to @var{abfd}.
|
Searches for a debug information file corresponding to @var{abfd}.
|
||||||
The name of the separate debug info file is returned by the @var{get}
|
|
||||||
function. This function scans various fixed locations in the
|
|
||||||
filesystem, including the file tree rooted at @var{dir}. If the
|
|
||||||
@var{include_dirs} parameter is true then the directory components of
|
|
||||||
@var{abfd}'s filename will be included in the searched locations.
|
|
||||||
|
|
||||||
Returns the filename of the first file to be found which receives a
|
The name of the separate debug info file is returned by the
|
||||||
TRUE result from the @var{check} function. Returns NULL if no valid
|
@var{get} function. This function scans various fixed locations
|
||||||
file could be found.
|
in the filesystem, including the file tree rooted at @var{dir}.
|
||||||
|
If the @var{include_dirs} parameter is true then the directory
|
||||||
|
components of @var{abfd}'s filename will be included in the
|
||||||
|
searched locations.
|
||||||
|
|
||||||
|
@var{data} is passed unmodified to the @var{get} and @var{check}
|
||||||
|
functions. It is generally used to implement build-id-like
|
||||||
|
matching in the callback functions.
|
||||||
|
|
||||||
|
RETURNS
|
||||||
|
Returns the filename of the first file to be found which
|
||||||
|
receives a TRUE result from the @var{check} function.
|
||||||
|
Returns NULL if no valid file could be found.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef char * (* get_func_type) (bfd *, unsigned long *);
|
typedef char * (* get_func_type) (bfd *, void *);
|
||||||
typedef bfd_boolean (* check_func_type) (const char *, const unsigned long);
|
typedef bfd_boolean (* check_func_type) (const char *, void *);
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
find_separate_debug_file (bfd * abfd,
|
find_separate_debug_file (bfd * abfd,
|
||||||
const char * debug_file_directory,
|
const char * debug_file_directory,
|
||||||
bfd_boolean include_dirs,
|
bfd_boolean include_dirs,
|
||||||
get_func_type get_func,
|
get_func_type get_func,
|
||||||
check_func_type check_func)
|
check_func_type check_func,
|
||||||
|
void * func_data)
|
||||||
{
|
{
|
||||||
char *base;
|
char *base;
|
||||||
char *dir;
|
char *dir;
|
||||||
char *debugfile;
|
char *debugfile;
|
||||||
char *canon_dir;
|
char *canon_dir;
|
||||||
unsigned long crc32;
|
|
||||||
size_t dirlen;
|
size_t dirlen;
|
||||||
size_t canon_dirlen;
|
size_t canon_dirlen;
|
||||||
|
|
||||||
@ -1383,7 +1429,7 @@ find_separate_debug_file (bfd * abfd,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
base = get_func (abfd, & crc32);
|
base = get_func (abfd, func_data);
|
||||||
|
|
||||||
if (base == NULL)
|
if (base == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1457,19 +1503,19 @@ find_separate_debug_file (bfd * abfd,
|
|||||||
a file into the root filesystem. (See binutils/testsuite/
|
a file into the root filesystem. (See binutils/testsuite/
|
||||||
binutils-all/objdump.exp for the test). */
|
binutils-all/objdump.exp for the test). */
|
||||||
sprintf (debugfile, "%s%s", dir, base);
|
sprintf (debugfile, "%s%s", dir, base);
|
||||||
if (check_func (debugfile, crc32))
|
if (check_func (debugfile, func_data))
|
||||||
goto found;
|
goto found;
|
||||||
|
|
||||||
/* Then try in a subdirectory called .debug. */
|
/* Then try in a subdirectory called .debug. */
|
||||||
sprintf (debugfile, "%s.debug/%s", dir, base);
|
sprintf (debugfile, "%s.debug/%s", dir, base);
|
||||||
if (check_func (debugfile, crc32))
|
if (check_func (debugfile, func_data))
|
||||||
goto found;
|
goto found;
|
||||||
|
|
||||||
#ifdef EXTRA_DEBUG_ROOT1
|
#ifdef EXTRA_DEBUG_ROOT1
|
||||||
/* Try the first extra debug file root. */
|
/* Try the first extra debug file root. */
|
||||||
sprintf (debugfile, "%s%s%s", EXTRA_DEBUG_ROOT1,
|
sprintf (debugfile, "%s%s%s", EXTRA_DEBUG_ROOT1,
|
||||||
include_dirs ? canon_dir : "/", base);
|
include_dirs ? canon_dir : "/", base);
|
||||||
if (check_func (debugfile, crc32))
|
if (check_func (debugfile, func_data))
|
||||||
goto found;
|
goto found;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1477,7 +1523,7 @@ find_separate_debug_file (bfd * abfd,
|
|||||||
/* Try the second extra debug file root. */
|
/* Try the second extra debug file root. */
|
||||||
sprintf (debugfile, "%s%s%s", EXTRA_DEBUG_ROOT2,
|
sprintf (debugfile, "%s%s%s", EXTRA_DEBUG_ROOT2,
|
||||||
include_dirs ? canon_dir : "/", base);
|
include_dirs ? canon_dir : "/", base);
|
||||||
if (check_func (debugfile, crc32))
|
if (check_func (debugfile, func_data))
|
||||||
goto found;
|
goto found;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1499,7 +1545,7 @@ find_separate_debug_file (bfd * abfd,
|
|||||||
}
|
}
|
||||||
strcat (debugfile, base);
|
strcat (debugfile, base);
|
||||||
|
|
||||||
if (check_func (debugfile, crc32))
|
if (check_func (debugfile, func_data))
|
||||||
goto found;
|
goto found;
|
||||||
|
|
||||||
/* Failed to find the file. */
|
/* Failed to find the file. */
|
||||||
@ -1513,7 +1559,6 @@ find_separate_debug_file (bfd * abfd,
|
|||||||
return debugfile;
|
return debugfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
FUNCTION
|
FUNCTION
|
||||||
bfd_follow_gnu_debuglink
|
bfd_follow_gnu_debuglink
|
||||||
@ -1522,7 +1567,6 @@ SYNOPSIS
|
|||||||
char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
|
char *bfd_follow_gnu_debuglink (bfd *abfd, const char *dir);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
|
||||||
Takes a BFD and searches it for a .gnu_debuglink section. If this
|
Takes a BFD and searches it for a .gnu_debuglink section. If this
|
||||||
section is found, it examines the section for the name and checksum
|
section is found, it examines the section for the name and checksum
|
||||||
of a '.debug' file containing auxiliary debugging information. It
|
of a '.debug' file containing auxiliary debugging information. It
|
||||||
@ -1542,24 +1586,23 @@ RETURNS
|
|||||||
char *
|
char *
|
||||||
bfd_follow_gnu_debuglink (bfd *abfd, const char *dir)
|
bfd_follow_gnu_debuglink (bfd *abfd, const char *dir)
|
||||||
{
|
{
|
||||||
|
unsigned long crc32;
|
||||||
|
|
||||||
return find_separate_debug_file (abfd, dir, TRUE,
|
return find_separate_debug_file (abfd, dir, TRUE,
|
||||||
bfd_get_debug_link_info,
|
bfd_get_debug_link_info_1,
|
||||||
separate_debug_file_exists);
|
separate_debug_file_exists, &crc32);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper for bfd_follow_gnu_debugaltlink. It just pretends to return
|
/* Helper for bfd_follow_gnu_debugaltlink. It just returns the name
|
||||||
a CRC. .gnu_debugaltlink supplies a build-id, which is different,
|
of the separate debug file. */
|
||||||
but this is ok because separate_alt_debug_file_exists ignores the
|
|
||||||
CRC anyway. */
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
get_alt_debug_link_info_shim (bfd * abfd, unsigned long *crc32_out)
|
get_alt_debug_link_info_shim (bfd * abfd, void *unused ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
bfd_size_type len;
|
bfd_size_type len;
|
||||||
bfd_byte *buildid = NULL;
|
bfd_byte *buildid = NULL;
|
||||||
char *result = bfd_get_alt_debug_link_info (abfd, &len, &buildid);
|
char *result = bfd_get_alt_debug_link_info (abfd, &len, &buildid);
|
||||||
|
|
||||||
*crc32_out = 0;
|
|
||||||
free (buildid);
|
free (buildid);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -1573,7 +1616,6 @@ SYNOPSIS
|
|||||||
char *bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir);
|
char *bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
|
||||||
Takes a BFD and searches it for a .gnu_debugaltlink section. If this
|
Takes a BFD and searches it for a .gnu_debugaltlink section. If this
|
||||||
section is found, it examines the section for the name of a file
|
section is found, it examines the section for the name of a file
|
||||||
containing auxiliary debugging information. It then searches the
|
containing auxiliary debugging information. It then searches the
|
||||||
@ -1595,7 +1637,8 @@ bfd_follow_gnu_debugaltlink (bfd *abfd, const char *dir)
|
|||||||
{
|
{
|
||||||
return find_separate_debug_file (abfd, dir, TRUE,
|
return find_separate_debug_file (abfd, dir, TRUE,
|
||||||
get_alt_debug_link_info_shim,
|
get_alt_debug_link_info_shim,
|
||||||
separate_alt_debug_file_exists);
|
separate_alt_debug_file_exists,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1607,13 +1650,13 @@ SYNOPSIS
|
|||||||
(bfd *abfd, const char *filename);
|
(bfd *abfd, const char *filename);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
Takes a @var{BFD} and adds a .gnu_debuglink section to it. The
|
||||||
Takes a @var{BFD} and adds a .gnu_debuglink section to it. The section is sized
|
section is sized to be big enough to contain a link to the specified
|
||||||
to be big enough to contain a link to the specified @var{filename}.
|
@var{filename}.
|
||||||
|
|
||||||
RETURNS
|
RETURNS
|
||||||
A pointer to the new section is returned if all is ok. Otherwise <<NULL>> is
|
A pointer to the new section is returned if all is ok. Otherwise
|
||||||
returned and bfd_error is set.
|
<<NULL>> is returned and bfd_error is set.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
asection *
|
asection *
|
||||||
@ -1674,7 +1717,6 @@ SYNOPSIS
|
|||||||
(bfd *abfd, struct bfd_section *sect, const char *filename);
|
(bfd *abfd, struct bfd_section *sect, const char *filename);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
|
||||||
Takes a @var{BFD} and containing a .gnu_debuglink section @var{SECT}
|
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
|
and fills in the contents of the section to contain a link to the
|
||||||
specified @var{filename}. The filename should be relative to the
|
specified @var{filename}. The filename should be relative to the
|
||||||
@ -1761,8 +1803,7 @@ INTERNAL_FUNCTION
|
|||||||
get_build_id
|
get_build_id
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
struct bfd_build_id * get_build_id
|
struct bfd_build_id * get_build_id (bfd *abfd);
|
||||||
(bfd *abfd);
|
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Finds the build-id associated with @var{abfd}. If the build-id is
|
Finds the build-id associated with @var{abfd}. If the build-id is
|
||||||
@ -1770,6 +1811,7 @@ DESCRIPTION
|
|||||||
for it, using memory allocated to @var{abfd}, and this is then
|
for it, using memory allocated to @var{abfd}, and this is then
|
||||||
attached to the @var{abfd}.
|
attached to the @var{abfd}.
|
||||||
|
|
||||||
|
RETURNS
|
||||||
Returns a pointer to the build-id structure if a build-id could be
|
Returns a pointer to the build-id structure if a build-id could be
|
||||||
found. If no build-id is found NULL is returned and error code is
|
found. If no build-id is found NULL is returned and error code is
|
||||||
set.
|
set.
|
||||||
@ -1849,24 +1891,26 @@ INTERNAL_FUNCTION
|
|||||||
get_build_id_name
|
get_build_id_name
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
char * get_build_id_name
|
char * get_build_id_name (bfd *abfd, void *build_id_out_p)
|
||||||
(bfd *abfd, unsigned long *build_id_out)
|
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Searches @var{abfd} for a build-id, and then constructs a pathname
|
Searches @var{abfd} for a build-id, and then constructs a pathname
|
||||||
from it. The path is computed as .build-id/NN/NN+NN.debug where
|
from it. The path is computed as .build-id/NN/NN+NN.debug where
|
||||||
NNNN+NN is the build-id value as a hexadecimal string.
|
NNNN+NN is the build-id value as a hexadecimal string.
|
||||||
|
|
||||||
|
RETURNS
|
||||||
Returns the constructed filename or NULL upon error.
|
Returns the constructed filename or NULL upon error.
|
||||||
It is the caller's responsibility to free the memory used to hold the
|
It is the caller's responsibility to free the memory used to hold the
|
||||||
filename.
|
filename.
|
||||||
If a filename is returned then the @var{build_id_out} parameter is
|
If a filename is returned then the @var{build_id_out_p}
|
||||||
set to a pointer to the build_id structure.
|
parameter (which points to a @code{struct bfd_build_id}
|
||||||
|
pointer) is set to a pointer to the build_id structure.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
get_build_id_name (bfd *abfd, unsigned long *build_id_out)
|
get_build_id_name (bfd *abfd, void *build_id_out_p)
|
||||||
{
|
{
|
||||||
|
struct bfd_build_id **build_id_out = build_id_out_p;
|
||||||
struct bfd_build_id *build_id;
|
struct bfd_build_id *build_id;
|
||||||
char *name;
|
char *name;
|
||||||
char *n;
|
char *n;
|
||||||
@ -1901,7 +1945,7 @@ get_build_id_name (bfd *abfd, unsigned long *build_id_out)
|
|||||||
n += sprintf (n, "%02x", (unsigned) *d++);
|
n += sprintf (n, "%02x", (unsigned) *d++);
|
||||||
n += sprintf (n, ".debug");
|
n += sprintf (n, ".debug");
|
||||||
|
|
||||||
* build_id_out = (unsigned long) build_id;
|
*build_id_out = build_id;
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1910,20 +1954,20 @@ INTERNAL_FUNCTION
|
|||||||
check_build_id_file
|
check_build_id_file
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
bfd_boolean check_build_id_file
|
bfd_boolean check_build_id_file (char *name, void *buildid_p);
|
||||||
(char *name, unsigned long buildid);
|
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Checks to see if @var{name} is a readable file and if its build-id
|
Checks to see if @var{name} is a readable file and if its build-id
|
||||||
matches @var{buildid}.
|
matches @var{buildid}.
|
||||||
|
|
||||||
Returns TRUE if the file exists, is readable, and contains a build-id
|
RETURNS
|
||||||
which matches @var{build-id}.
|
Returns TRUE if the file exists, is readable, and contains a
|
||||||
|
build-id which matches the build-id pointed at by
|
||||||
|
@var{build_id_p} (which is really a @code{struct bfd_build_id **}).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
check_build_id_file (const char *name,
|
check_build_id_file (const char *name, void *buildid_p)
|
||||||
const unsigned long buildid)
|
|
||||||
{
|
{
|
||||||
struct bfd_build_id *orig_build_id;
|
struct bfd_build_id *orig_build_id;
|
||||||
struct bfd_build_id *build_id;
|
struct bfd_build_id *build_id;
|
||||||
@ -1931,7 +1975,7 @@ check_build_id_file (const char *name,
|
|||||||
bfd_boolean result;
|
bfd_boolean result;
|
||||||
|
|
||||||
BFD_ASSERT (name);
|
BFD_ASSERT (name);
|
||||||
BFD_ASSERT (buildid);
|
BFD_ASSERT (buildid_p);
|
||||||
|
|
||||||
file = bfd_openr (name, NULL);
|
file = bfd_openr (name, NULL);
|
||||||
if (file == NULL)
|
if (file == NULL)
|
||||||
@ -1951,7 +1995,7 @@ check_build_id_file (const char *name,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
orig_build_id = (struct bfd_build_id *) buildid;
|
orig_build_id = *(struct bfd_build_id **) buildid_p;
|
||||||
|
|
||||||
result = build_id->size == orig_build_id->size
|
result = build_id->size == orig_build_id->size
|
||||||
&& memcmp (build_id->data, orig_build_id->data, build_id->size) == 0;
|
&& memcmp (build_id->data, orig_build_id->data, build_id->size) == 0;
|
||||||
@ -1969,7 +2013,6 @@ SYNOPSIS
|
|||||||
char *bfd_follow_build_id_debuglink (bfd *abfd, const char *dir);
|
char *bfd_follow_build_id_debuglink (bfd *abfd, const char *dir);
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
|
|
||||||
Takes @var{abfd} and searches it for a .note.gnu.build-id section.
|
Takes @var{abfd} and searches it for a .note.gnu.build-id section.
|
||||||
If this section is found, it extracts the value of the NT_GNU_BUILD_ID
|
If this section is found, it extracts the value of the NT_GNU_BUILD_ID
|
||||||
note, which should be a hexadecimal value @var{NNNN+NN} (for
|
note, which should be a hexadecimal value @var{NNNN+NN} (for
|
||||||
@ -1993,7 +2036,9 @@ RETURNS
|
|||||||
char *
|
char *
|
||||||
bfd_follow_build_id_debuglink (bfd *abfd, const char *dir)
|
bfd_follow_build_id_debuglink (bfd *abfd, const char *dir)
|
||||||
{
|
{
|
||||||
|
struct bfd_build_id *build_id;
|
||||||
|
|
||||||
return find_separate_debug_file (abfd, dir, FALSE,
|
return find_separate_debug_file (abfd, dir, FALSE,
|
||||||
get_build_id_name,
|
get_build_id_name,
|
||||||
check_build_id_file);
|
check_build_id_file, &build_id);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user