[binutils] Handle absolute DW_AT_dwo_name
authorTom de Vries <tdevries@suse.de>
Wed, 10 Feb 2021 16:26:50 +0000 (17:26 +0100)
committerTom de Vries <tdevries@suse.de>
Wed, 10 Feb 2021 16:26:50 +0000 (17:26 +0100)
With an exec:
...
$ pwd
/home/vries/tmp
$ gcc /home/vries/tmp/src/hello.c -gsplit-dwarf -c \
  -o /home/vries/tmp/obj/hello.o
...
I get:
...
$ readelf -w obj/hello.o > READELF
readelf: Warning: Unable to load dwo file: \
  /home/vries/tmp//home/vries/tmp/obj/hello.dwo
...

The dwo file name is listed here:
...
    <20>   DW_AT_GNU_dwo_name: /home/vries/tmp/obj/hello.dwo
    <24>   DW_AT_comp_dir    : /home/vries/tmp
...

The standard states about the DW_AT_dwo_name attribute:
...
value is a null-terminated string containing the full or relative path name
(relative to the value of the DW_AT_comp_dir attribute, see below) of the
object file that contains the full compilation unit.
...

So, readelf shouldn't try to prefix an absolute path with DW_AT_comp_dir.

Fix this in load_dwo_file by handling the absolute path case.

binutils/ChangeLog:

2021-02-10  Tom de Vries  <tdevries@suse.de>

PR binutils/27391
* dwarf.c (load_dwo_file): Handle case that name is absolute path.

binutils/ChangeLog
binutils/dwarf.c

index 1d6b9675dc2de22699f768c6274375caa816d2dd..594fbffdd669294c832d6fb00997a9afcc3dd5c8 100644 (file)
@@ -1,3 +1,8 @@
+2021-02-10  Tom de Vries  <tdevries@suse.de>
+
+       PR binutils/27391
+       * dwarf.c (load_dwo_file): Handle case that name is absolute path.
+
 2021-02-10  Tom de Vries  <tdevries@suse.de>
 
        PR binutils/27371
index 84d63f63366e7e5bcda819f077f1b225d75a3b0f..3cbd19710d78bbe3725f485d0defa2fdaa74be88 100644 (file)
@@ -11092,8 +11092,11 @@ load_dwo_file (const char * main_filename, const char * name, const char * dir,
   char * separate_filename;
   void * separate_handle;
 
-  /* FIXME: Skip adding / if dwo_dir ends in /.  */
-  separate_filename = concat (dir, "/", name, NULL);
+  if (IS_ABSOLUTE_PATH (name))
+    separate_filename = strdup (name);
+  else
+    /* FIXME: Skip adding / if dwo_dir ends in /.  */
+    separate_filename = concat (dir, "/", name, NULL);
   if (separate_filename == NULL)
     {
       warn (_("Out of memory allocating dwo filename\n"));