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

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

    <bug>
          <bug_id>48617</bug_id>
          
          <creation_ts>2023-11-28 19:49:31 +0300</creation_ts>
          <short_desc>/usr/bin/qemu-aarch64.static /sbin/ldconfig Segmentation fault (core dumped)</short_desc>
          <delta_ts>2023-11-29 10:55:45 +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>glibc-core</component>
          <version>unstable</version>
          <rep_platform>x86</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></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="Gleb F-Malinovskiy">glebfm</assigned_to>
          <cc>glebfm</cc>
    
    <cc>iv</cc>
    
    <cc>ldv</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>237982</commentid>
    <comment_count>0</comment_count>
    <who name="Vitaly Chikunov">vt</who>
    <bug_when>2023-11-28 19:49:31 +0300</bug_when>
    <thetext>На x86_64 в hasher с p10 aarch64 под qemu-user-aarch64 (из Сизифа) ldconfig из p10 падает с Segmentation fault, при этом другие бинарники не падают.

Trace сисколлов средствами qemu-user:

bash-4.4$ /usr/bin/qemu-aarch64.static -strace /sbin/ldconfig
475550 brk(NULL) = 0x00007f4f0b759000
475550 brk(0x00007f4f0b759b38) = 0x00007f4f0b759000
--- SIGSEGV {si_signo=SIGSEGV, si_code=1, si_addr=0x0000000000000038} ---
Segmentation fault (core dumped)

Сисколлы завершаются успешно, при этом второй вызов brk не выделяет память, после этого ldconfig падает.

Gdb:

1. Подкладываем /usr/bin/qemu-aarch64.static из системы внутрь хэшера, чтоб можно было его запустить. Затем
   hasher$ /usr/bin/qemu-aarch64.static -g 7777 /sbin/ldconfig

2. На aarch64 хосте (так как у нашего gdb на x86-64 нет архитектуры aarch64):
  aarch64$ hsh --ini
  aarch64$ hsh-install glibc-core-debuginfo
  aarch64$ gdb
  (gdb) set sysroot /home/vt/hasher/chroot
  (gdb) set substitute-path / /home/vt/hasher/chroot/
  (gdb) file /home/vt/hasher/chroot/sbin/ldconfig
  (gdb) target remote x.x.x.x:7777
```
_start () at ../sysdeps/aarch64/start.S:46
46      ENTRY(_start)
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x00007fe814288fe8 in __brk (addr=&lt;optimized out&gt;) at ../sysdeps/unix/sysv/linux/generic/brk.c:37
37            __set_errno (ENOMEM);
(gdb) bt
#0  0x00007fe814288fe8 in __brk (addr=&lt;optimized out&gt;) at ../sysdeps/unix/sysv/linux/generic/brk.c:37
#1  0x00007fe81426a0d8 in __sbrk (increment=2872) at sbrk.c:70
#2  __sbrk (increment=2872) at sbrk.c:32
#3  0x00007fe8142426c4 in __libc_setup_tls () at ../csu/libc-tls.c:148
#4  0x00007fe814242348 in __libc_start_main (main=0x7fe81423cfbc &lt;_start+60&gt;, argc=1, argv=0x400000800d88, init=0x7fe8142427f0 &lt;__libc_csu_init&gt;,
    fini=0x7fe8142428b0 &lt;__libc_csu_fini&gt;, rtld_fini=0x0, stack_end=&lt;optimized out&gt;) at ../csu/libc-start.c:197
#5  0x00007fe81423cfb8 in _start () at ../sysdeps/aarch64/start.S:91

(gdb) disas/s __brk
Dump of assembler code for function __brk:
../sysdeps/unix/sysv/linux/generic/brk.c:
33      {
34        __curbrk = (void *) INTERNAL_SYSCALL_CALL (brk, addr);
   0x00007fe814288fb0 &lt;+0&gt;:     mov     x1, x0
   0x00007fe814288fb4 &lt;+4&gt;:     mov     x8, #0xd6                       // #214
   0x00007fe814288fb8 &lt;+8&gt;:     svc     #0x0
   0x00007fe814288fbc &lt;+12&gt;:    adrp    x2, 0x7fe8142e3000 &lt;initial+728&gt;
   0x00007fe814288fc0 &lt;+16&gt;:    str     x0, [x2, #1104]

35        if (__curbrk &lt; addr)
   0x00007fe814288fc4 &lt;+20&gt;:    cmp     x0, x1
   0x00007fe814288fc8 &lt;+24&gt;:    b.cc    0x7fe814288fd4 &lt;__brk+36&gt;  // b.lo, b.ul, b.last

39          }
40
41        return 0;
   0x00007fe814288fcc &lt;+28&gt;:    mov     w0, #0x0                        // #0

42      }
   0x00007fe814288fd0 &lt;+32&gt;:    ret

37            __set_errno (ENOMEM);
   0x00007fe814288fd4 &lt;+36&gt;:    adrp    x1, 0x7fe8142df000 &lt;_nl_C_locobj+16&gt;
   0x00007fe814288fd8 &lt;+40&gt;:    ldr     x1, [x1, #3504]
   0x00007fe814288fdc &lt;+44&gt;:    mrs     x2, tpidr_el0
   0x00007fe814288fe0 &lt;+48&gt;:    mov     w3, #0xc                        // #12

38            return -1;
   0x00007fe814288fe4 &lt;+52&gt;:    mov     w0, #0xffffffff                 // #-1

37            __set_errno (ENOMEM);
=&gt; 0x00007fe814288fe8 &lt;+56&gt;:    str     w3, [x2, x1]

38            return -1;
   0x00007fe814288fec &lt;+60&gt;:    ret
End of assembler dump.

(gdb) i r w3 x1 x2
w3             0xc                 12
x1             0x38                56
x2             0x0                 0

```

Падает на инструкции `str     w3, [x2, x1]`

`12` это ENOMEM, `x2+x1` видимо адрес errno.

```
(gdb) p errno
Cannot access memory at address 0x38
```

То есть когда brk возвращает __curbrk &lt; addr происходит SIGSEGV в `__set_errno (ENOMEM)` так как адрес errno недоступен.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>237987</commentid>
    <comment_count>1</comment_count>
    <who name="Dmitry V. Levin">ldv</who>
    <bug_when>2023-11-28 20:19:22 +0300</bug_when>
    <thetext>(In reply to Vitaly Chikunov from comment #0)
&gt; На x86_64 в hasher с p10 aarch64 под qemu-user-aarch64 (из Сизифа) ldconfig
&gt; из p10 падает с Segmentation fault, при этом другие бинарники не падают.
[...]
&gt; Program received signal SIGSEGV, Segmentation fault.
&gt; 0x00007fe814288fe8 in __brk (addr=&lt;optimized out&gt;) at
&gt; ../sysdeps/unix/sysv/linux/generic/brk.c:37
&gt; 37            __set_errno (ENOMEM);
&gt; (gdb) bt
&gt; #0  0x00007fe814288fe8 in __brk (addr=&lt;optimized out&gt;) at
&gt; ../sysdeps/unix/sysv/linux/generic/brk.c:37
&gt; #1  0x00007fe81426a0d8 in __sbrk (increment=2872) at sbrk.c:70
&gt; #2  __sbrk (increment=2872) at sbrk.c:32
&gt; #3  0x00007fe8142426c4 in __libc_setup_tls () at ../csu/libc-tls.c:148

https://sourceware.org/cgit/glibc/commit/?id=f787e138aa0</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>