<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>39175</bug_id>
          
          <creation_ts>2020-11-02 06:33:55 +0300</creation_ts>
          <short_desc>debugedit: invalid path for source file (for elfutils/eu-stack)</short_desc>
          <delta_ts>2020-11-19 19:21:41 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>rpm-build</component>
          <version>unstable</version>
          <rep_platform>x86</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Vitaly Chikunov">vt</reporter>
          <assigned_to name="placeholder@altlinux.org">placeholder</assigned_to>
          <cc>arseny</cc>
    
    <cc>glebfm</cc>
    
    <cc>imz</cc>
    
    <cc>iv</cc>
    
    <cc>ldv</cc>
    
    <cc>placeholder</cc>
    
    <cc>vt</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>193701</commentid>
    <comment_count>0</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2020-11-02 06:33:55 +0300</bug_when>
    <thetext>Не правильный путь к исходному файлу!

  # 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       &lt;built-in&gt;: Нет такого файла или каталога.

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

  # gdb --batch -ex &apos;i sources&apos; /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: невозможно получить доступ к &apos;/usr/src/debug/elfutils-0.182-alt2/build-x86_64-alt-linux/src/../../src/stack.c&apos;: Нет такого файла или каталога

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

  # 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 &apos; &apos; &apos;\n&apos; | 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
      &lt;a1&gt;   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        (&quot;../../src/stack.c&quot;)
                DW_AT_decl_file (&quot;/usr/src/debug/elfutils-0.182-alt2/build-x86_64-alt-linux/src/../../src/stack.c&quot;)

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

  0x0000009b: DW_TAG_compile_unit
     DW_AT_producer    (&quot;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&quot;)
     DW_AT_language    (DW_LANG_C99)
     DW_AT_name        (&quot;../../src/stack.c&quot;)
     DW_AT_comp_dir    (&quot;/usr/src/debug/elfutils-0.182-alt2/build-x86_64-alt-linux/src&quot;)
     DW_AT_ranges      (0x00000940
        [0x0000000000402830, 0x0000000000403a15)
        [0x0000000000402440, 0x000000000040244a)
        [0x0000000000402450, 0x0000000000402745))
     DW_AT_low_pc      (0x0000000000000000)
     DW_AT_stmt_list   (0x000000ea)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193702</commentid>
    <comment_count>1</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2020-11-02 08:40:58 +0300</bug_when>
    <thetext>Несколько пакетов, которые я посмотрел - собранные autotools не прямо в $RPM_BUILD_DIR, а в подкаталоге - так. А с cmake - собранные в BUILD - проблем нет.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193703</commentid>
    <comment_count>2</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2020-11-02 08:51:57 +0300</bug_when>
    <thetext>(In reply to Vitaly Chikunov from comment #1)
&gt; Несколько пакетов, которые я посмотрел - собранные autotools не прямо в
&gt; $RPM_BUILD_DIR, а в подкаталоге - так. А с cmake - собранные в BUILD -
&gt; проблем нет.

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

  x86_64-alt-linux-gcc -D_GNU_SOURCE -DHAVE_CONFIG_H -DLOCALEDIR=&apos;&quot;/usr/share/locale&quot;&apos;  -DDEBUGPRED=0 -DSRCDIR=\&quot;/usr/src/RPM/BUILD/elfutils-0.182-alt2/src\&quot; -DOBJDIR=\&quot;/usr/src/RPM/BUILD/elfutils-0.182-alt2/build-x86_64-alt-linux/src\&quot; -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=\&quot;20201102\&quot; -DBUILD_VERSION=\&quot;\&quot; -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</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193760</commentid>
    <comment_count>3</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2020-11-04 08:36:12 +0300</bug_when>
    <thetext>Чтоб понять исправлена ли эта ошибка в апстриме debugiedit, нашел пакет собранный с ../configure в Федоре -- gnuplot. У них тоже остается &quot;../../src&quot; в Directory Table (в .debug_line), так что пути к исходникам его содержат. Но, в отличии от нас, нужные пустые диры запакованы. Таким образом путь с &quot;../../src&quot; не дает ошибки.

% 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
...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194157</commentid>
    <comment_count>4</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2020-11-12 23:50:56 +0300</bug_when>
    <thetext>Задание #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       &lt;built-in&gt;: Нет такого файла или каталога.
(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 &quot;/lib64/libthread_db.so.1&quot;.

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&apos;ом из задания:

# 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       &lt;built-in&gt;: Нет такого файла или каталога.
(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 &quot;/lib64/libthread_db.so.1&quot;.

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 &lt;built-in&gt; не понятно. Думаю, это какая-то другая проблема.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194158</commentid>
    <comment_count>5</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2020-11-13 00:01:52 +0300</bug_when>
    <thetext>`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) &lt; 0)
621             error (EXIT_BAD, 0, &quot;dwfl_pid: %s\n&quot;, dwfl_errmsg (-1));
622           break;
623
624         default:
625           return ARGP_ERR_UNKNOWN;
626         }
627       return 0;
(gdb) i line
Line 618 of &quot;stack.c&quot; is at address 0x302e &lt;parse_opt+286&gt; 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, но из правильного исходника.

А у нас, если так сделать, то &quot;показывает&quot; `Line 1 of &quot;../sysdeps/x86_64/start.S&quot;`.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194164</commentid>
    <comment_count>6</comment_count>
    <who name="Repository Robot">repository-robot</who>
    <bug_when>2020-11-13 04:24:41 +0300</bug_when>
    <thetext>rpm-build-4.0.4-alt155 -&gt; sisyphus:

 Thu Nov 12 2020 Vitaly Chikunov &lt;vt@altlinux&gt; 4.0.4-alt155
 - debugedit: Fix &apos;Unhandled relocation 0 in .debug_info section&apos; on e2k.
 - debuginfo: Fix source paths with `..` by creating appropriate empty dirs
   under `/usr/src/debug` tree (closes: #39175).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194356</commentid>
    <comment_count>7</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2020-11-19 19:21:41 +0300</bug_when>
    <thetext>JFYI. В gdb-10 list по-умолчанию стал показывать (вместо &apos;1 &lt;built-in&gt;: Нет такого файла или каталога.&apos;) часть исходника рядом с 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) &lt; 0)
621             error (EXIT_BAD, 0, &quot;dwfl_pid: %s\n&quot;, dwfl_errmsg (-1));
622           break;
623
624         default:
625           return ARGP_ERR_UNKNOWN;
626         }
627       return 0;</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>