Commit 73f41491 by Ian Lance Taylor Committed by Ian Lance Taylor

re PR other/55087 (bogus "linux-vdso.so.1: No such file or directory" caused by libbacktrace)

	PR other/55087
	* posix.c (backtrace_open): Add does_not_exist parameter.
	* elf.c (phdr_callback): Do not warn if shared library could not
	be opened.
	* fileline.c (fileline_initialize): Update calls to
	backtrace_open.
	* internal.h (backtrace_open): Update declaration.

From-SVN: r192861
parent 9430b7ba
2012-10-26 Ian Lance Taylor <iant@google.com>
PR other/55087
* posix.c (backtrace_open): Add does_not_exist parameter.
* elf.c (phdr_callback): Do not warn if shared library could not
be opened.
* fileline.c (fileline_initialize): Update calls to
backtrace_open.
* internal.h (backtrace_open): Update declaration.
2012-10-26 Jack Howarth <howarth@bromo.med.uc.edu> 2012-10-26 Jack Howarth <howarth@bromo.med.uc.edu>
PR target/55061 PR target/55061
......
...@@ -810,6 +810,7 @@ phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED, ...@@ -810,6 +810,7 @@ phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED,
{ {
struct phdr_data *pd = (struct phdr_data *) pdata; struct phdr_data *pd = (struct phdr_data *) pdata;
int descriptor; int descriptor;
int does_not_exist;
fileline elf_fileline_fn; fileline elf_fileline_fn;
int found_dwarf; int found_dwarf;
...@@ -821,7 +822,8 @@ phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED, ...@@ -821,7 +822,8 @@ phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED,
|| info->dlpi_addr == 0) || info->dlpi_addr == 0)
return 0; return 0;
descriptor = backtrace_open (info->dlpi_name, pd->error_callback, pd->data); descriptor = backtrace_open (info->dlpi_name, pd->error_callback, pd->data,
&does_not_exist);
if (descriptor < 0) if (descriptor < 0)
return 0; return 0;
......
...@@ -80,9 +80,9 @@ fileline_initialize (struct backtrace_state *state, ...@@ -80,9 +80,9 @@ fileline_initialize (struct backtrace_state *state,
/* We have not initialized the information. Do it now. */ /* We have not initialized the information. Do it now. */
if (state->filename != NULL) if (state->filename != NULL)
descriptor = backtrace_open (state->filename, error_callback, data); descriptor = backtrace_open (state->filename, error_callback, data, NULL);
else else
descriptor = backtrace_open ("/proc/self/exe", error_callback, data); descriptor = backtrace_open ("/proc/self/exe", error_callback, data, NULL);
if (descriptor < 0) if (descriptor < 0)
failed = 1; failed = 1;
......
...@@ -109,10 +109,16 @@ struct backtrace_state ...@@ -109,10 +109,16 @@ struct backtrace_state
struct backtrace_freelist_struct *freelist; struct backtrace_freelist_struct *freelist;
}; };
/* Open a file for reading. Returns -1 on error. */ /* Open a file for reading. Returns -1 on error. If DOES_NOT_EXIST
is not NULL, *DOES_NOT_EXIST will be set to 0 normally and set to 1
if the file does not exist. If the file does not exist and
DOES_NOT_EXIST is not NULL, the function will return -1 and will
not call ERROR_CALLBACK. On other errors, or if DOES_NOT_EXIST is
NULL, the function will call ERROR_CALLBACK before returning. */
extern int backtrace_open (const char *filename, extern int backtrace_open (const char *filename,
backtrace_error_callback error_callback, backtrace_error_callback error_callback,
void *data); void *data,
int *does_not_exist);
/* A view of the contents of a file. This supports mmap when /* A view of the contents of a file. This supports mmap when
available. A view will remain in memory even after backtrace_close available. A view will remain in memory even after backtrace_close
......
...@@ -57,14 +57,20 @@ POSSIBILITY OF SUCH DAMAGE. */ ...@@ -57,14 +57,20 @@ POSSIBILITY OF SUCH DAMAGE. */
int int
backtrace_open (const char *filename, backtrace_error_callback error_callback, backtrace_open (const char *filename, backtrace_error_callback error_callback,
void *data) void *data, int *does_not_exist)
{ {
int descriptor; int descriptor;
if (does_not_exist != NULL)
*does_not_exist = 0;
descriptor = open (filename, O_RDONLY | O_BINARY | O_CLOEXEC); descriptor = open (filename, O_RDONLY | O_BINARY | O_CLOEXEC);
if (descriptor < 0) if (descriptor < 0)
{ {
error_callback (data, filename, errno); if (does_not_exist != NULL && errno == ENOENT)
*does_not_exist = 1;
else
error_callback (data, filename, errno);
return -1; return -1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment