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:
Pedro Alves
2017-04-07 14:51:42 +01:00
committed by Nick Clifton
parent ae3f8c2813
commit 49f4617bf4
2 changed files with 162 additions and 93 deletions

View File

@ -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.

View File

@ -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);
} }