Bug 39175 - debugedit: invalid path for source file (for elfutils/eu-stack)
Summary: debugedit: invalid path for source file (for elfutils/eu-stack)
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: rpm-build (show other bugs)
Version: unstable
Hardware: x86 Linux
: P5 normal
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-11-02 06:33 MSK by Vitaly Chikunov
Modified: 2020-11-19 19:21 MSK (History)
7 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vitaly Chikunov 2020-11-02 06:33:55 MSK
Не правильный путь к исходному файлу!

  # gdb -q eu-stack
  Reading symbols from eu-stack...
  Reading symbols from /usr/lib/debug/usr/bin/eu-stack.debug...
  (gdb) b main
  Breakpoint 1 at 0x402450: file ../../src/stack.c, line 632.
  (gdb) list
  1       <built-in>: Нет такого файла или каталога.

Нет удобной утилиты посмотреть список исходников (*), поэтому так:

  # gdb --batch -ex 'i sources' /usr/lib/debug/usr/bin/eu-stack.debug
  Source files for which symbols have been read in:

  Source files for which symbols will be read in on demand:

  /usr/src/debug/glibc-2.30-alt2/csu/../sysdeps/x86_64/crtn.S, /usr/src/debug/glibc-2.30-alt2/csu/elf-init.c, /usr/include/bits/stdio2.h, /usr/src/debug/elfutils-0.182-alt2/build-x86_64-alt-linux/lib/../../lib/printversion.c, /usr/include/bits/fcntl2.h, /usr/include/stdlib.h, /usr/include/bits/error.h, /usr/src/debug/elfutils-0.182-alt2/build-x86_64-alt-linux/src/../../src/stack.c, /usr/src/debug/glibc-2.30-alt2/csu/../sysdeps/x86_64/crti.S, /usr/src/debug/glibc-2.30-alt2/csu/init.c, /usr/src/debug/glibc-2.30-alt2/csu/../sysdeps/x86_64/start.S

Нам нужен stack.c, в том виде как его показал gdb его нет:

  # ls -l /usr/src/debug/elfutils-0.182-alt2/build-x86_64-alt-linux/src/../../src/stack.c
  ls: невозможно получить доступ к '/usr/src/debug/elfutils-0.182-alt2/build-x86_64-alt-linux/src/../../src/stack.c': Нет такого файла или каталога

Сам исходник, при этом, есть где надо:

  # find /usr/src/debug -name stack.c | grep elfutils
  /usr/src/debug/elfutils-0.182-alt2/src/stack.c

С точки зрения debugedit путь правильный:

  /usr/lib/debug/usr/bin# /usr/lib/rpm/debugedit -l /dev/stdout ./eu-stack.debug | xargs -0 | tr ' ' '\n' | grep stack
  /usr/src/debug/elfutils-0.182-alt2/src/stack.c

* Как показывают путь другие утилиты:

  # objdump -Wi /usr/lib/debug/usr/bin/eu-stack.debug | fgrep stack.c
      <a1>   DW_AT_name        : (косвенная строка, смещение: 0x19ec): ../../src/stack.c

  # /usr/bin/llvm-dwarfdump -debug-info /usr/lib/debug/usr/bin/eu-stack.debug | fgrep stack.c | head -2
              DW_AT_name        ("../../src/stack.c")
                DW_AT_decl_file ("/usr/src/debug/elfutils-0.182-alt2/build-x86_64-alt-linux/src/../../src/stack.c")

Более полный вывод llvm-dwarfdump для этого объекта:

  0x0000009b: DW_TAG_compile_unit
     DW_AT_producer    ("GNU C99 9.3.1 20200518 (ALT Sisyphus 9.3.1-alt1) -fstack-protector-strong -mtune=generic -march=x86-64 -g -O2 -std=gnu99 -fre
switches -fexceptions")
     DW_AT_language    (DW_LANG_C99)
     DW_AT_name        ("../../src/stack.c")
     DW_AT_comp_dir    ("/usr/src/debug/elfutils-0.182-alt2/build-x86_64-alt-linux/src")
     DW_AT_ranges      (0x00000940
        [0x0000000000402830, 0x0000000000403a15)
        [0x0000000000402440, 0x000000000040244a)
        [0x0000000000402450, 0x0000000000402745))
     DW_AT_low_pc      (0x0000000000000000)
     DW_AT_stmt_list   (0x000000ea)
Comment 1 Vitaly Chikunov 2020-11-02 08:40:58 MSK
Несколько пакетов, которые я посмотрел - собранные autotools не прямо в $RPM_BUILD_DIR, а в подкаталоге - так. А с cmake - собранные в BUILD - проблем нет.
Comment 2 Vitaly Chikunov 2020-11-02 08:51:57 MSK
(In reply to Vitaly Chikunov from comment #1)
> Несколько пакетов, которые я посмотрел - собранные autotools не прямо в
> $RPM_BUILD_DIR, а в подкаталоге - так. А с cmake - собранные в BUILD -
> проблем нет.

Потому что autotools собирает так (относительный путь к stack.c):

  x86_64-alt-linux-gcc -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR='"/usr/share/locale"'  -DDEBUGPRED=0 -DSRCDIR=\"/usr/src/RPM/BUILD/elfutils-0.182-alt2/src\" -DOBJDIR=\"/usr/src/RPM/BUILD/elfutils-0.182-alt2/build-x86_64-alt-linux/src\" -I. -I../../src -I..  -I. -I../../src -I../../lib -I.. -I../../src/../libelf -I../../src/../libebl -I../../src/../libdw -I../../src/../libdwelf -I../../src/../libdwfl -I../../src/../libasm  -std=gnu99 -Wall -Wshadow -Wformat=2 -Wold-style-definition -Wstrict-prototypes -Wtrampolines -Wlogical-op -Wduplicated-cond -Wnull-dereference -Wimplicit-fallthrough=5 -Werror -Wunused -Wextra -Wstack-usage=262144   -D_FORTIFY_SOURCE=2 -pipe -frecord-gcc-switches -Wall -g -O2 -fexceptions -MT stack.o -MD -MP -MF .deps/stack.Tpo -c -o stack.o ../../src/stack.c

А cmake так (абсолютный путь к main.cpp):

  /usr/bin/clang++ -DBUILD_DATE=\"20201102\" -DBUILD_VERSION=\"\" -DISPC_ANDROID_TARGET_OFF -DISPC_FREEBSD_TARGET_OFF -DISPC_IOS_TARGET_OFF -DISPC_MACOS_TARGET_OFF -DISPC_NO_DUMPS -DISPC_PS4_TARGET_OFF -DISPC_WINDOWS_TARGET_OFF -DISPC_X86_ENABLED -DLLVM_10_0 -D_FORTIFY_SOURCE=2 -I/include -I/usr/src/RPM/BUILD/ispc-1.14.1/src -I/usr/src/RPM/BUILD/ispc-1.14.1/BUILD/. -pipe -frecord-gcc-switches -Wall -g -O2 -O2 -g  -Wall -Wno-sign-compare -Wno-unused-function -Werror -I/usr/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -fstack-protector-strong -fdata-sections -ffunction-sections -fno-delete-null-pointer-checks -Wformat -Wformat-security -fpie -fwrapv -Wno-c99-extensions -Wno-deprecated-register -fno-rtti -std=c++14 -o CMakeFiles/ispc.dir/src/main.cpp.o -c /usr/src/RPM/BUILD/ispc-1.14.1/src/main.cpp
Comment 3 Vitaly Chikunov 2020-11-04 08:36:12 MSK
Чтоб понять исправлена ли эта ошибка в апстриме debugiedit, нашел пакет собранный с ../configure в Федоре -- gnuplot. У них тоже остается "../../src" в Directory Table (в .debug_line), так что пути к исходникам его содержат. Но, в отличии от нас, нужные пустые диры запакованы. Таким образом путь с "../../src" не дает ошибки.

% objdump -Wl ./usr/lib/debug/usr/bin/gnuplot-qt-5.2.8-6.fc33.x86_64.debug
...
 The Directory Table (offset 0x1b):
  1     ../../src
  2     ../../term
  3     /usr/include/bits
  4     /usr/include
...

(gdb) i sources
...
/usr/src/debug/gnuplot-5.2.8-6.fc33.x86_64/minimal/src/../../src/qtterminal/QtGnuplotEvent.h
...

% less gnuplot-debugsource-5.2.8-6.fc33.x86_64.rpm
...
drwxr-xr-x    2 root    root                        0 авг  6 05:22 /usr/src/debug/gnuplot-5.2.8-6.fc33.x86_64
drwxr-xr-x    2 root    root                        0 авг  6 05:22 /usr/src/debug/gnuplot-5.2.8-6.fc33.x86_64/minimal
drwxr-xr-x    2 root    root                        0 авг  6 05:20 /usr/src/debug/gnuplot-5.2.8-6.fc33.x86_64/minimal/src
drwxr-xr-x    2 root    root                        0 авг  6 05:22 /usr/src/debug/gnuplot-5.2.8-6.fc33.x86_64/qt
...
-rw-r--r--    1 root    root                     5158 дек 22  2017 /usr/src/debug/gnuplot-5.2.8-6.fc33.x86_64/src/qtterminal/QtGnuplotEvent.h
...
Comment 4 Vitaly Chikunov 2020-11-12 23:50:56 MSK
Задание #261678: rpm-build.git=4.0.4-alt155 elfutils.git=0.182-alt2 - сделано как в Fedora - запакованы пустые диры в /usr/src/debug.

До изменений:

# gdb -q eu-stack
Reading symbols from eu-stack...
Reading symbols from /usr/lib/debug/usr/bin/eu-stack.debug...
(gdb) b main
Breakpoint 1 at 0x402450: file ../../src/stack.c, line 632.
(gdb) list
1       <built-in>: Нет такого файла или каталога.
(gdb) list main
627     ../../src/stack.c: Нет такого файла или каталога.
(gdb) r
Starting program: /usr/bin/eu-stack
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Breakpoint 1, main (argc=1, argv=0x7fffffffe3f8) at ../../src/stack.c:632
632     in ../../src/stack.c
(gdb) list
627     in ../../src/stack.c
(gdb)

После сборки elfutils/eu-stack rpm-build'ом из задания:

# gdb -q eu-stack
Reading symbols from eu-stack...
Reading symbols from /usr/lib/debug/usr/bin/eu-stack.debug...
(gdb) b main
Breakpoint 1 at 0x402450: file ../../src/stack.c, line 632.
(gdb) list
1       <built-in>: Нет такого файла или каталога.
(gdb) list main
627       return 0;
628     }
629
630     int
631     main (int argc, char **argv)
632     {
633       /* We use no threads here which can interfere with handling a stream.  */
634       __fsetlocking (stdin, FSETLOCKING_BYCALLER);
635       __fsetlocking (stdout, FSETLOCKING_BYCALLER);
636       __fsetlocking (stderr, FSETLOCKING_BYCALLER);
(gdb) r
Starting program: /usr/bin/eu-stack
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Breakpoint 1, main (argc=1, argv=0x7fffffffe3c8) at ../../src/stack.c:632
632     {
(gdb) list
627       return 0;
628     }
629
630     int
631     main (int argc, char **argv)
632     {
633       /* We use no threads here which can interfere with handling a stream.  */
634       __fsetlocking (stdin, FSETLOCKING_BYCALLER);
635       __fsetlocking (stdout, FSETLOCKING_BYCALLER);
636       __fsetlocking (stderr, FSETLOCKING_BYCALLER);
(gdb)

Исходники стали отображаться.

(ps. Почему у нас list по-умолчанию пытается показать некое 1 <built-in> не понятно. Думаю, это какая-то другая проблема.)
Comment 5 Vitaly Chikunov 2020-11-13 00:01:52 MSK
`list` по-умолчанию ведет себя странно и в Fedora, но иначе:

[root@a7a0fa830f90 /]# gdb -q eu-stack
Reading symbols from eu-stack...
Reading symbols from /usr/lib/debug/usr/bin/eu-stack-0.182-1.fc33.x86_64.debug...
(gdb) i line
No line number information available.
(gdb) list
618
619           /* Makes sure we are properly attached.  */
620           if (dwfl_pid (dwfl) < 0)
621             error (EXIT_BAD, 0, "dwfl_pid: %s\n", dwfl_errmsg (-1));
622           break;
623
624         default:
625           return ARGP_ERR_UNKNOWN;
626         }
627       return 0;
(gdb) i line
Line 618 of "stack.c" is at address 0x302e <parse_opt+286> but contains no code.
(gdb) list
628     }
629
630     int
631     main (int argc, char **argv)
632     {
633       /* We use no threads here which can interfere with handling a stream.  */
634       __fsetlocking (stdin, FSETLOCKING_BYCALLER);
635       __fsetlocking (stdout, FSETLOCKING_BYCALLER);
636       __fsetlocking (stderr, FSETLOCKING_BYCALLER);
637

То есть показывает какую-то строку выше main, но из правильного исходника.

А у нас, если так сделать, то "показывает" `Line 1 of "../sysdeps/x86_64/start.S"`.
Comment 6 Repository Robot 2020-11-13 04:24:41 MSK
rpm-build-4.0.4-alt155 -> sisyphus:

 Thu Nov 12 2020 Vitaly Chikunov <vt@altlinux> 4.0.4-alt155
 - debugedit: Fix 'Unhandled relocation 0 in .debug_info section' on e2k.
 - debuginfo: Fix source paths with `..` by creating appropriate empty dirs
   under `/usr/src/debug` tree (closes: #39175).
Comment 7 Vitaly Chikunov 2020-11-19 19:21:41 MSK
JFYI. В gdb-10 list по-умолчанию стал показывать (вместо '1 <built-in>: Нет такого файла или каталога.') часть исходника рядом с main. \o/

# gdb -q --args eu-stack
Reading symbols from eu-stack...
Reading symbols from /usr/lib/debug/usr/bin/eu-stack.debug...
(gdb) list
618
619           /* Makes sure we are properly attached.  */
620           if (dwfl_pid (dwfl) < 0)
621             error (EXIT_BAD, 0, "dwfl_pid: %s\n", dwfl_errmsg (-1));
622           break;
623
624         default:
625           return ARGP_ERR_UNKNOWN;
626         }
627       return 0;