static unsigned int
 get_directory_table_entry (const char *dirname,
+                          const char *file0_dirname,
                           size_t dirlen,
                           bool can_use_zero)
 {
     {
       if (dirs == NULL || dirs[0] == NULL)
        {
-         const char * pwd = getpwd ();
+         const char * pwd = file0_dirname ? file0_dirname : getpwd ();
 
          if (dwarf_level >= 5 && strcmp (dirname, pwd) != 0)
            {
                 directory).  Since we are about to create a directory entry that
                 is not the same, allocate the current directory first.
                 FIXME: Alternatively we could generate an error message here.  */
-             (void) get_directory_table_entry (pwd, strlen (pwd), true);
+             (void) get_directory_table_entry (pwd, NULL, strlen (pwd),
+                                               true);
              d = 1;
            }
          else
   file = get_basename (pathname);
   dir_len = file - pathname;
 
-  dir = get_directory_table_entry (pathname, dir_len, false);
+  dir = get_directory_table_entry (pathname, NULL, dir_len, false);
 
   /* Do not use slot-0.  That is specifically reserved for use by
      the '.file 0 "name"' directive.  */
   const char *file;
   size_t dirlen;
   unsigned int i, d;
+  const char *file0_dirname = dirname;
 
   /* Short circuit the common case of adding the same pathname
      as last time.  */
       file = filename;
     }
 
-  d = get_directory_table_entry (dirname, dirlen, num == 0);
+  d = get_directory_table_entry (dirname, file0_dirname, dirlen,
+                                num == 0);
   i = num;
 
   if (! assign_file_to_slot (i, file, d))
 
--- /dev/null
+#as: --gdwarf-5
+#name: DWARF5 .file 0 dir file
+#readelf: -wl
+
+#...
+ The Directory Table \(offset 0x.*, lines 1, columns 1\):
+  Entry        Name
+#...
+  0    \(indirect line string, offset: 0x.*\): /example
+
+ The File Name Table \(offset 0x.*, lines 2, columns 2\):
+  Entry        Dir     Name
+  0    0       \(indirect line string, offset: 0x.*\): test.c
+  1    0       \(indirect line string, offset: 0x.*\): test.c
+#pass
 
--- /dev/null
+       .file   "test.c"
+       .text
+.Ltext0:
+       .file 0 "/example" "test.c"
+       .globl  x
+       .section        .bss
+       .balign 4
+       .type   x, @object
+       .size   x, 4
+x:
+       .zero   4
+       .text
+.Letext0:
+       .file 1 "test.c"
+       .section        .debug_info,"",%progbits
+.Ldebug_info0:
+       .long   0x32
+       .2byte  0x5
+       .byte   0x1
+       .byte   0x4
+       .long   .Ldebug_abbrev0
+       .uleb128 0x1
+       .long   .LASF2
+       .byte   0x1d
+       .long   .LASF0
+       .long   .LASF1
+       .long   .Ldebug_line0
+       .uleb128 0x2
+       .string "x"
+       .byte   0x1
+       .byte   0x1
+       .byte   0x5
+       .long   0x2e
+       .uleb128 0x5
+       .byte   0x3
+       .long   x
+       .uleb128 0x3
+       .byte   0x4
+       .byte   0x5
+       .string "int"
+       .byte   0
+       .section        .debug_abbrev,"",%progbits
+.Ldebug_abbrev0:
+       .uleb128 0x1
+       .uleb128 0x11
+       .byte   0x1
+       .uleb128 0x25
+       .uleb128 0xe
+       .uleb128 0x13
+       .uleb128 0xb
+       .uleb128 0x3
+       .uleb128 0x1f
+       .uleb128 0x1b
+       .uleb128 0x1f
+       .uleb128 0x10
+       .uleb128 0x17
+       .byte   0
+       .byte   0
+       .uleb128 0x2
+       .uleb128 0x34
+       .byte   0
+       .uleb128 0x3
+       .uleb128 0x8
+       .uleb128 0x3a
+       .uleb128 0xb
+       .uleb128 0x3b
+       .uleb128 0xb
+       .uleb128 0x39
+       .uleb128 0xb
+       .uleb128 0x49
+       .uleb128 0x13
+       .uleb128 0x3f
+       .uleb128 0x19
+       .uleb128 0x2
+       .uleb128 0x18
+       .byte   0
+       .byte   0
+       .uleb128 0x3
+       .uleb128 0x24
+       .byte   0
+       .uleb128 0xb
+       .uleb128 0xb
+       .uleb128 0x3e
+       .uleb128 0xb
+       .uleb128 0x3
+       .uleb128 0x8
+       .byte   0
+       .byte   0
+       .byte   0
+       .section        .debug_aranges,"",%progbits
+       .long   0x14
+       .2byte  0x2
+       .long   .Ldebug_info0
+       .byte   0x4
+       .byte   0
+       .2byte  0
+       .2byte  0
+       .long   0
+       .long   0
+       .section        .debug_line,"",%progbits
+.Ldebug_line0:
+       .section        .debug_str,"MS",%progbits,1
+.LASF2:
+       .string "GNU C17 11.2.1 -g"
+       .section        .debug_line_str,"MS",%progbits,1
+.LASF1:
+       .string "/example"
+.LASF0:
+       .string "test.c"
+       .ident  "GCC: (GNU) 11.2.1"
+       .section        .note.GNU-stack,"",%progbits
 
     run_dump_test "dwarf2-19" $dump_opts
     run_dump_test "dwarf2-20" $dump_opts
     run_dump_test "dwarf-5-file0" $dump_opts
+    run_dump_test "dwarf-5-file0-2" $dump_opts
     run_dump_test "dwarf-5-dir0" $dump_opts
     run_dump_test "dwarf-4-cu" $dump_opts
     run_dump_test "dwarf-5-cu" $dump_opts