Issue 170810
Summary Step into in a function call from a shared library steps to the plt record, not to the corresponding code
Labels lldb
Assignees
Reporter samolisov
    I tried to debug the following C++ code:

```c++
   1675 std::vector<int> x = {1, 2, 3};
-> 1676         std::sort(x.begin(), x.end());
```

compiled with `g++ 11.4.0-2ubuntu1~20.04` and linked against `libstdc++` into a shared library (`.so` file).

LLDB version:
```
(lldb) version
lldb version 21.1.5 (https://github.com/llvm/llvm-project.git revision 8e2cd28cd4ba46613a46467b0c91b1cabead26cd)
  clang revision 8e2cd28cd4ba46613a46467b0c91b1cabead26cd
  llvm revision 8e2cd28cd4ba46613a46467b0c91b1cabead26cd
```

The `target.process.thread.step-avoid-regexp` option is totally disabled:

```
(lldb)  settings show target.process.thread.step-avoid-regexp
target.process.thread.step-avoid-regexp (regex) = ""
```

I'm trying to get into the `std::sort` function, the `s` command doesn't work due to the absence of the debug information for the standard library. I'm trying to step info with force and get to the corresponding `plt` (`.plt.got`, actually):

```
(lldb) s -a false
Process 3327735 stopped
* thread #7, name = 'JIT Thread', stop reason = step in
    frame #0: 0x00007ffff46f3890 libarkcompiler.so`___lldb_unnamed_symbol_a1d900 + 200592
libarkcompiler.so`___lldb_unnamed_symbol_a1d900:
->  0x7ffff46f3890 <+200592>: endbr64
    0x7ffff46f3894 <+200596>: jmpq   *0xf68f2e(%rip) ; _GLOBAL_OFFSET_TABLE_ + 100320
    0x7ffff46f389a <+200602>: nopw (%rax,%rax)
    0x7ffff46f38a0 <+200608>: endbr64
```

I get into the deserved sources only after pressing `s` two times more:

```
* thread #7, name = 'JIT Thread', stop reason = instruction step into
    frame #0: 0x00007ffff699a3f2 libarkruntime.so`std::vector<int, std::allocator<int>>::end(this=size=0) at stl_vector.h:829:7
   826 *  element order.
   827         */
   828        iterator
-> 829 end() _GLIBCXX_NOEXCEPT
   830        { return iterator(this->_M_impl._M_finish); }
   831
```

What I see, when I'm trying to find all the available `std::vector<int, std::allocator<int>>::end()` symbols in my images:

```
(lldb) im look -r -s "std::vector<int, std::allocator<int>>::end\(\)$"
1 symbols match the regular _expression_ 'std::vector<int, std::allocator<int>>::end\(\)$' in .../out/dbg-llvm/lib/libarkbase.so:
        Address: libarkbase.so[0x0000000000071f54] (libarkbase.so.PT_LOAD[1]..text + 337396)
 Summary: libarkbase.so`std::vector<int, std::allocator<int>>::end() at stl_vector.h:829:7

2 symbols match the regular _expression_ 'std::vector<int, std::allocator<int>>::end\(\)$' in .../out/dbg-llvm/lib/libarkcompiler.so:
        Address: libarkcompiler.so[0x0000000000b302c4] (libarkcompiler.so.PT_LOAD[1]..text + 473828)
        Summary: libarkcompiler.so`std::vector<int, std::allocator<int>>::end() at stl_vector.h:829:7
        Address: libarkcompiler.so[0x00000000009aefc0] (libarkcompiler.so.PT_LOAD[1]..plt + 200608)
        Summary: libarkcompiler.so`symbol stub for: std::vector<int, std::allocator<int>>::end()

2 symbols match the regular _expression_ 'std::vector<int, std::allocator<int>>::end\(\)$' in .../out/dbg-llvm/lib/libarkruntime.so:
        Address: libarkruntime.so[0x00000000012de3f2] (libarkruntime.so.PT_LOAD[1]..text + 863346)
        Summary: libarkruntime.so`std::vector<int, std::allocator<int>>::end() at stl_vector.h:829:7
        Address: libarkruntime.so[0x000000000112ecf0] (libarkruntime.so.PT_LOAD[1]..plt + 195792)
        Summary: libarkruntime.so`symbol stub for: std::vector<int, std::allocator<int>>::end()
```

I believe, the deserved symbol is:

```
2 symbols match the regular _expression_ 'std::vector<int, std::allocator<int>>::end\(\)$' in .../out/dbg-llvm/lib/libarkcompiler.so:
...
        Address: libarkcompiler.so[0x00000000009aefc0] (libarkcompiler.so.PT_LOAD[1]..plt + 200608)
        Summary: libarkcompiler.so`symbol stub for: std::vector<int, std::allocator<int>>::end()
```
instead of the corresponding record in `.text`.

What confused me a bit and may be related to the root cause. In the output of `(lldb) im look -r -s "std::vector<int, std::allocator<int>>::end\(\)$"` I see `libarkcompiler.so.PT_LOAD[1]..plt + 200608` what looks as true:

`200608` is `0x30fa0`, `0x000000000112ecf0 - 0x30fa0 = 97ea020`, this the start of the `.plt` section in the elf file `libarkcompiler.so`:

```
$ readelf -S lib/libarkcompiler.so

[Nr] Name Type             Address           Offset   Size EntSize           Flags  Link  Info  Align
[11] .plt              PROGBITS 000000000097e020  0097e020 000000000009eef0  0000000000000010  AX 0     0     16
[12] .plt.got          PROGBITS         0000000000a1cf10 00a1cf10 00000000000009f0  0000000000000010  AX       0     0 16
```

But in the debug session, once I've done `s -a false`, I got the following:

```
(lldb) s -a false
Process 3360935 stopped
* thread #7, name = 'JIT Thread', stop reason = step in
    frame #0: 0x00007ffff46f3890 libarkcompiler.so`___lldb_unnamed_symbol_a1d900 + 200592
libarkcompiler.so`___lldb_unnamed_symbol_a1d900:
->  0x7ffff46f3890 <+200592>: endbr64
```

`200592 (0x30f90)` is the offset to `$rip (0x7ffff46f3890)`, the pc at the start of the corresponding PLT record, from the start of the **loaded** `.plt.got` section:

```
(lldb) im dump sections libarkcompiler.so
0x00000006 libarkcompiler.so.PT_LOAD[1]..plt
 0x000000000000000c code [0x00007ffff46c1f10-0x00007ffff46c2900)
 7ffff46f3890

0x00000006 libarkcompiler.so.PT_LOAD[1]..plt.got
  0x000000000000000d code [0x00007ffff46c2900-0x00007ffff47617e0)
 7ffff46f3890
 yep, 30f90 or 200592

0x00000006 libarkcompiler.so.PT_LOAD[1]..plt.sec
  0x000000000000000e code [0x00007ffff47617e0-0x00007ffff51116b8)  r-x  0x00abc7e0 0x009afed8
```

Actually, `___lldb_unnamed_symbol_a1d900` is the start of the **loaded** `plt.got` section while `a1d900` is the file address of the start of the `.plt.sec`:

```
$ readelf -S lib/libarkcompiler.so | grep 1d900
 [13] .plt.sec          PROGBITS         0000000000a1d900 00a1d900
```

How it looks in the debugger:

```
(lldb) disassemble -c 30
libarkcompiler.so`___lldb_unnamed_symbol_a1d900:
    0x7ffff46c2900 <+0>:   endbr64
    0x7ffff46c2904 <+4>:   jmpq   *0xf816f6(%rip) ; _GLOBAL_OFFSET_TABLE_ + 24
    0x7ffff46c290a <+10>:  nopw (%rax,%rax)
...
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to