Selected observed output: x86-64, GCC 14.2.0, binutils 2.44, glibc 2.41
Paths shortened; ASLR addresses vary. No timing results.

NORMAL RUN (before maps)
calling scan twice, then local_scan
scan(7)=8
scan(7)=8
local_scan(7)=8
DEFAULT scan belongs to /lab/libwork.so
handle scan belongs to /lab/libwork.so
DEFAULT call=8; handle call=8
object bias=0x55c257bde000 name=<main>
object bias=0x7f73bc95f000 name=linux-vdso.so.1
object bias=0x7f73bc952000 name=/lab/libwork.so
object bias=0x7f73bc73b000 name=/lib/x86_64-linux-gnu/libc.so.6
object bias=0x7f73bc961000 name=/lib64/ld-linux-x86-64.so.2

PRELOADED RUN (before maps)
calling scan twice, then local_scan
scan(7)=108
scan(7)=108
local_scan(7)=8
DEFAULT scan belongs to /lab/libagent.so
handle scan belongs to /lab/libwork.so
DEFAULT call=108; handle call=8
object bias=0x55e0f9a9a000 name=<main>
object bias=0x7fe426277000 name=linux-vdso.so.1
object bias=0x7fe42626a000 name=/lab/libagent.so
object bias=0x7fe426265000 name=/lab/libwork.so
object bias=0x7fe42604e000 name=/lib/x86_64-linux-gnu/libc.so.6
object bias=0x7fe426279000 name=/lib64/ld-linux-x86-64.so.2

PRELOADED MAP ROWS FOR THE APP AND TWO LAB LIBRARIES
55e0f9a9a000-55e0f9a9b000 r--p 00000000 00:1b 272853                     /lab/app
55e0f9a9b000-55e0f9a9c000 r-xp 00001000 00:1b 272853                     /lab/app
55e0f9a9c000-55e0f9a9d000 r--p 00002000 00:1b 272853                     /lab/app
55e0f9a9d000-55e0f9a9e000 r--p 00002000 00:1b 272853                     /lab/app
55e0f9a9e000-55e0f9a9f000 rw-p 00003000 00:1b 272853                     /lab/app
7fe426265000-7fe426266000 r--p 00000000 00:1b 272852                     /lab/libwork.so
7fe426266000-7fe426267000 r-xp 00001000 00:1b 272852                     /lab/libwork.so
7fe426267000-7fe426268000 r--p 00002000 00:1b 272852                     /lab/libwork.so
7fe426268000-7fe426269000 r--p 00002000 00:1b 272852                     /lab/libwork.so
7fe426269000-7fe42626a000 rw-p 00003000 00:1b 272852                     /lab/libwork.so
7fe42626a000-7fe42626b000 r--p 00000000 00:1b 272856                     /lab/libagent.so
7fe42626b000-7fe42626c000 r-xp 00001000 00:1b 272856                     /lab/libagent.so
7fe42626c000-7fe42626d000 r--p 00002000 00:1b 272856                     /lab/libagent.so
7fe42626d000-7fe42626e000 r--p 00002000 00:1b 272856                     /lab/libagent.so
7fe42626e000-7fe42626f000 rw-p 00003000 00:1b 272856                     /lab/libagent.so

SLOT OBSERVATION (separate run, different addresses)
before:       0x55a308ddc086
dlsym result: 0x7ff08f4f3100
after dlsym:  0x55a308ddc086
after call:   0x7ff08f4f3100
result: 8; lookup left slot unchanged: yes

$ readelf -lW app

Elf file type is DYN (Position-Independent Executable file)
Entry point 0x1390
There are 14 program headers, starting at offset 64

Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  PHDR           0x000040 0x0000000000000040 0x0000000000000040 0x000310 0x000310 R   0x8
  INTERP         0x000394 0x0000000000000394 0x0000000000000394 0x00001c 0x00001c R   0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x000000 0x0000000000000000 0x0000000000000000 0x000ab0 0x000ab0 R   0x1000
  LOAD           0x001000 0x0000000000001000 0x0000000000001000 0x000515 0x000515 R E 0x1000
  LOAD           0x002000 0x0000000000002000 0x0000000000002000 0x0002e4 0x0002e4 R   0x1000
  LOAD           0x002db0 0x0000000000003db0 0x0000000000003db0 0x0002f0 0x000320 RW  0x1000
  DYNAMIC        0x002dc0 0x0000000000003dc0 0x0000000000003dc0 0x000200 0x000200 RW  0x8
  NOTE           0x000350 0x0000000000000350 0x0000000000000350 0x000020 0x000020 R   0x8
  NOTE           0x000370 0x0000000000000370 0x0000000000000370 0x000024 0x000024 R   0x4
  NOTE           0x0022c4 0x00000000000022c4 0x00000000000022c4 0x000020 0x000020 R   0x4
  GNU_PROPERTY   0x000350 0x0000000000000350 0x0000000000000350 0x000020 0x000020 R   0x8
  GNU_EH_FRAME   0x002134 0x0000000000002134 0x0000000000002134 0x00004c 0x00004c R   0x4
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10
  GNU_RELRO      0x002db0 0x0000000000003db0 0x0000000000003db0 0x000250 0x000250 R   0x1

 Section to Segment mapping:
  Segment Sections...
   00     
   01     .interp 
   02     .note.gnu.property .note.gnu.build-id .interp .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt 
   03     .init .plt .plt.got .text .fini 
   04     .rodata .eh_frame_hdr .eh_frame .note.ABI-tag 
   05     .init_array .fini_array .dynamic .got .got.plt .data .bss 
   06     .dynamic 
   07     .note.gnu.property 
   08     .note.gnu.build-id 
   09     .note.ABI-tag 
   10     .note.gnu.property 
   11     .eh_frame_hdr 
   12     
   13     .init_array .fini_array .dynamic .got 

$ readelf -dW app

Dynamic section at offset 0x2dc0 contains 28 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libwork.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000001d (RUNPATH)            Library runpath: [$ORIGIN]
 0x000000000000000c (INIT)               0x1000
 0x000000000000000d (FINI)               0x150c
 0x0000000000000019 (INIT_ARRAY)         0x3db0
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x3db8
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x3b0
 0x0000000000000005 (STRTAB)             0x670
 0x0000000000000006 (SYMTAB)             0x3e8
 0x000000000000000a (STRSZ)              289 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x3fe8
 0x0000000000000002 (PLTRELSZ)           432 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x900
 0x0000000000000007 (RELA)               0x7f8
 0x0000000000000008 (RELASZ)             264 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffb (FLAGS_1)            Flags: PIE
 0x000000006ffffffe (VERNEED)            0x7c8
 0x000000006fffffff (VERNEEDNUM)         1
 0x000000006ffffff0 (VERSYM)             0x792
 0x000000006ffffff9 (RELACOUNT)          3
 0x0000000000000000 (NULL)               0x0

$ readelf -rW app

Relocation section '.rela.dyn' at offset 0x7f8 contains 11 entries:
    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
0000000000003db0  0000000000000008 R_X86_64_RELATIVE                         1470
0000000000003db8  0000000000000008 R_X86_64_RELATIVE                         1430
0000000000004098  0000000000000008 R_X86_64_RELATIVE                         4098
0000000000003fc0  0000000300000006 R_X86_64_GLOB_DAT      0000000000000000 __libc_start_main@GLIBC_2.34 + 0
0000000000003fc8  0000000400000006 R_X86_64_GLOB_DAT      0000000000000000 _ITM_deregisterTMCloneTable + 0
0000000000003fd0  0000000e00000006 R_X86_64_GLOB_DAT      0000000000000000 __gmon_start__ + 0
0000000000003fd8  0000001400000006 R_X86_64_GLOB_DAT      0000000000000000 _ITM_registerTMCloneTable + 0
0000000000003fe0  0000001800000006 R_X86_64_GLOB_DAT      0000000000000000 __cxa_finalize@GLIBC_2.2.5 + 0
00000000000040a0  0000001700000005 R_X86_64_COPY          00000000000040a0 stdout@GLIBC_2.2.5 + 0
00000000000040b0  0000001900000005 R_X86_64_COPY          00000000000040b0 stdin@GLIBC_2.2.5 + 0
00000000000040c0  0000001a00000005 R_X86_64_COPY          00000000000040c0 stderr@GLIBC_2.2.5 + 0

Relocation section '.rela.plt' at offset 0x900 contains 18 entries:
    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
0000000000004000  0000000100000007 R_X86_64_JUMP_SLOT     0000000000000000 dl_iterate_phdr@GLIBC_2.2.5 + 0
0000000000004008  0000000200000007 R_X86_64_JUMP_SLOT     0000000000000000 dlerror@GLIBC_2.34 + 0
0000000000004010  0000000500000007 R_X86_64_JUMP_SLOT     0000000000000000 puts@GLIBC_2.2.5 + 0
0000000000004018  0000000600000007 R_X86_64_JUMP_SLOT     0000000000000000 fclose@GLIBC_2.2.5 + 0
0000000000004020  0000000700000007 R_X86_64_JUMP_SLOT     0000000000000000 dladdr@GLIBC_2.34 + 0
0000000000004028  0000000800000007 R_X86_64_JUMP_SLOT     0000000000000000 printf@GLIBC_2.2.5 + 0
0000000000004030  0000000900000007 R_X86_64_JUMP_SLOT     0000000000000000 fputs@GLIBC_2.2.5 + 0
0000000000004038  0000000a00000007 R_X86_64_JUMP_SLOT     0000000000000000 fgets@GLIBC_2.2.5 + 0
0000000000004040  0000000b00000007 R_X86_64_JUMP_SLOT     0000000000000000 strcmp@GLIBC_2.2.5 + 0
0000000000004048  0000000c00000007 R_X86_64_JUMP_SLOT     0000000000000000 dlopen@GLIBC_2.34 + 0
0000000000004050  0000000d00000007 R_X86_64_JUMP_SLOT     0000000000000000 fprintf@GLIBC_2.2.5 + 0
0000000000004058  0000000f00000007 R_X86_64_JUMP_SLOT     0000000000000000 scan + 0
0000000000004060  0000001000000007 R_X86_64_JUMP_SLOT     0000000000000000 fopen@GLIBC_2.2.5 + 0
0000000000004068  0000001100000007 R_X86_64_JUMP_SLOT     0000000000000000 perror@GLIBC_2.2.5 + 0
0000000000004070  0000001200000007 R_X86_64_JUMP_SLOT     0000000000000000 dlsym@GLIBC_2.34 + 0
0000000000004078  0000001300000007 R_X86_64_JUMP_SLOT     0000000000000000 exit@GLIBC_2.2.5 + 0
0000000000004080  0000001500000007 R_X86_64_JUMP_SLOT     0000000000000000 dlclose@GLIBC_2.34 + 0
0000000000004088  0000001600000007 R_X86_64_JUMP_SLOT     0000000000000000 getc@GLIBC_2.2.5 + 0

$ readelf --dyn-syms -W libwork.so

Symbol table '.dynsym' contains 6 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __cxa_finalize
     2: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
     3: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable
     4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     5: 0000000000001100     4 FUNC    GLOBAL DEFAULT    9 scan
