re PR other/55087 (bogus "linux-vdso.so.1: No such file or directory" caused by libba...
authorIan Lance Taylor <iant@google.com>
Fri, 26 Oct 2012 20:08:29 +0000 (20:08 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 26 Oct 2012 20:08:29 +0000 (20:08 +0000)
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

libbacktrace/ChangeLog
libbacktrace/elf.c
libbacktrace/fileline.c
libbacktrace/internal.h
libbacktrace/posix.c

index 7a39adccecd2ec0e9e204ccadadca2ae89c4b211..4850d9de37bd3a5a37cb35de4f24f5d341beeff1 100644 (file)
@@ -1,3 +1,13 @@
+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>
 
        PR target/55061
index b396c47ef294ccc01d8aee5b7f31efad803a0651..8433a72fcd6ddcc31e06485c702dd6cf5fa12468 100644 (file)
@@ -810,6 +810,7 @@ phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED,
 {
   struct phdr_data *pd = (struct phdr_data *) pdata;
   int descriptor;
+  int does_not_exist;
   fileline elf_fileline_fn;
   int found_dwarf;
 
@@ -821,7 +822,8 @@ phdr_callback (struct dl_phdr_info *info, size_t size ATTRIBUTE_UNUSED,
       || info->dlpi_addr == 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)
     return 0;
 
index 4efd19b059501e66445efe78e621974a750a8e43..e577ecc9061602a48def60d1fddaa02845a2ed6c 100644 (file)
@@ -80,9 +80,9 @@ fileline_initialize (struct backtrace_state *state,
   /* We have not initialized the information.  Do it now.  */
 
   if (state->filename != NULL)
-    descriptor = backtrace_open (state->filename, error_callback, data);
+    descriptor = backtrace_open (state->filename, error_callback, data, NULL);
   else
-    descriptor = backtrace_open ("/proc/self/exe", error_callback, data);
+    descriptor = backtrace_open ("/proc/self/exe", error_callback, data, NULL);
   if (descriptor < 0)
     failed = 1;
 
index b1afca0a2d993d6b87fb67c63a60b4fd40d25892..5e0dba44a8560998f632fc8b3cc61f693ce04b0e 100644 (file)
@@ -109,10 +109,16 @@ struct backtrace_state
   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,
                           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
    available.  A view will remain in memory even after backtrace_close
index 01afc42b08e3f4f11f84684bf524115307d8d26a..4d6c852b7813feb580e191f980ca032dc457c814 100644 (file)
@@ -57,14 +57,20 @@ POSSIBILITY OF SUCH DAMAGE.  */
 
 int
 backtrace_open (const char *filename, backtrace_error_callback error_callback,
-               void *data)
+               void *data, int *does_not_exist)
 {
   int descriptor;
 
+  if (does_not_exist != NULL)
+    *does_not_exist = 0;
+
   descriptor = open (filename, O_RDONLY | O_BINARY | O_CLOEXEC);
   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;
     }