On 8/12/25 7:27 PM, 赵佳炜 wrote:
Sure.
The usdt_rip.c source code:
```C
// the usdt_rip.c file
#include <stddef.h>
#include <stdint.h>
#include "sdt.h"
static volatile char ti = 0;
int add(int a, int b) {
return a + b;
}
int (*add_ptr)(int, int) = add;
struct st{
int a;
char b;
};
volatile struct st t1 = {.a = 1, .b = 'a'};
static void __always_inline trigger_func() {
STAP_PROBE4(usdt_rip, rip_global_var, ti, add_ptr, t1.b, ti);
}
int main() {
trigger_func();
return 0;
}
```
The test/usdt_rip.c source code:
```C
// The test/usdt_rip.c file
static volatile char ti = 0;
```
The compiler option is `gcc -O2 -g usdt_rip.c test/usdt_rip.c -o usdt_rip`
My compiler version:
```bash
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu
13.3.0-6ubuntu2~24.04' --with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs
--enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr
--with-gcc-major-version-only --program-suffix=-13
--program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id
--libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-libstdcxx-backtrace
--enable-gnu-unique-object --disable-vtable-verify --enable-plugin
--enable-default-pie --with-system-zlib --enable-libphobos-checking=release
--with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch
--disable-werror --enable-cet --with-arch-32=i686 --with-abi=m64
--with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-13-fG75Ri/gcc-13-13.3.0/debian/tmp-gcn/usr
--enable-offload-defaulted --without-cuda-driver --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
--with-build-config=bootstrap-lto-lean --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04)
```
Thanks for the code. I compiled with gcc14 compiler and the below is the asm
code for 'main' function:
0000000000401020 <main>:
401020: 90 nop
401021: 31 c0 xor %eax,%eax
401023: c3 ret
401024: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
40102b: 00 00 00
40102e: 66 90 xchg %ax,%ax
stapsdt note:
Displaying notes found in: .note.stapsdt
Owner Data size Description
stapsdt 0x00000066 NT_STAPSDT (SystemTap probe
descriptors)
Provider: usdt_rip
Name: rip_global_var
Location: 0x0000000000401020, Base: 0x0000000000402010, Semaphore:
0x0000000000000000
Arguments: -1@ti(%rip) 8@add_ptr(%rip) -1@t1+4(%rip) -1@ti(%rip)
$ readelf -s usdt_rip | grep ti
4: 0000000000404019 1 OBJECT LOCAL DEFAULT 24 ti
14: 000000000040401a 1 OBJECT LOCAL DEFAULT 24 ti
So yet, it would be hard to find which 'ti' should be used to resolve usdt
arguments.
I then tried with clang21. The 'main' function:
0000000000001140 <main>:
1140: 0f b6 05 f2 2e 00 00 movzbl 0x2ef2(%rip),%eax # 4039
<ti>
1147: 48 8b 0d da 2e 00 00 mov 0x2eda(%rip),%rcx # 4028
<add_ptr>
114e: 0f b6 15 df 2e 00 00 movzbl 0x2edf(%rip),%edx # 4034
<t1+0x4>
1155: 0f b6 35 dd 2e 00 00 movzbl 0x2edd(%rip),%esi # 4039
<ti>
115c: 88 44 24 f7 mov %al,-0x9(%rsp)
1160: 48 89 4c 24 f8 mov %rcx,-0x8(%rsp)
1165: 88 54 24 f6 mov %dl,-0xa(%rsp)
1169: 40 88 74 24 f5 mov %sil,-0xb(%rsp)
116e: 90 nop
116f: 31 c0 xor %eax,%eax
1171: c3 ret
1172: 66 90 xchg %ax,%ax
For this case, usdt should work properly. The following is related symbol table:
74: 0000000000004028 8 OBJECT GLOBAL DEFAULT 26 add_ptr
64: 0000000000004030 8 OBJECT GLOBAL DEFAULT 26 t1
50: 0000000000004039 1 OBJECT LOCAL DEFAULT 27 ti <=== for '# 4039
<ti>'.
And for llvm21, only one 'ti' in the symbol table.
$ readelf -s usdt_rip | grep ti
50: 0000000000004039 1 OBJECT LOCAL DEFAULT 27 ti
The stapsdt note:
Displaying notes found in: .note.stapsdt
Owner Data size Description
stapsdt 0x00000061 NT_STAPSDT (SystemTap probe
descriptors)
Provider: usdt_rip
Name: rip_global_var
Location: 0x000000000000116e, Base: 0x0000000000002004, Semaphore:
0x0000000000000000
Arguments: -1@-9(%rsp) 8@-8(%rsp) -1@-10(%rsp) -1@-11(%rsp)
It looks like clang optimized away the following:
// The test/usdt_rip.c file
static volatile char ti = 0;
but gcc does not. But even if the above 'ti' is preserved for clang,
clang generated code should still be fine since the argument
is -1@-9(%rsp) 8@-8(%rsp) -1@-10(%rsp) -1@-11(%rsp).
I think you can file a bug for gcc community.
At 2025-08-13 00:11:45, "Yonghong Song" <yonghong.s...@linux.dev> wrote:
On 8/12/25 12:02 AM, 赵佳炜 wrote:
Yes, I've tried that but it didn't help. FYI:
$ readelf -nsr usdt_rip
Relocation section '.rela.dyn' at offset 0x530 contains 9 entries:
Offset Info Type Sym. Value Sym. Name +
Addend
000000003df0 000000000008 R_X86_64_RELATIVE 1150
000000003df8 000000000008 R_X86_64_RELATIVE 1110
000000004008 000000000008 R_X86_64_RELATIVE 4008
000000004018 000000000008 R_X86_64_RELATIVE 1160
000000003fd8 000100000006 R_X86_64_GLOB_DAT 0000000000000000
__libc_start_main@GLIBC_2.34 + 0
000000003fe0 000200000006 R_X86_64_GLOB_DAT 0000000000000000
_ITM_deregisterTM[...] + 0
000000003fe8 000300000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
000000003ff0 000400000006 R_X86_64_GLOB_DAT 0000000000000000
_ITM_registerTMCl[...] + 0
000000003ff8 000500000006 R_X86_64_GLOB_DAT 0000000000000000
__cxa_finalize@GLIBC_2.2.5 + 0
Symbol table '.dynsym' contains 6 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _[...]@GLIBC_2.34
(2)
2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
_ITM_deregisterT[...]
3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
_ITM_registerTMC[...]
5: 0000000000000000 0 FUNC WEAK DEFAULT UND [...]@GLIBC_2.2.5
(3)
Symbol table '.symtab' contains 42 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS Scrt1.o
2: 000000000000038c 32 OBJECT LOCAL DEFAULT 4 __abi_tag
3: 0000000000000000 0 FILE LOCAL DEFAULT ABS usdt_rip.c
4: 0000000000004021 1 OBJECT LOCAL DEFAULT 25 ti
5: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
6: 00000000000010a0 0 FUNC LOCAL DEFAULT 14
deregister_tm_clones
7: 00000000000010d0 0 FUNC LOCAL DEFAULT 14 register_tm_clones
8: 0000000000001110 0 FUNC LOCAL DEFAULT 14
__do_global_dtors_aux
9: 0000000000004020 1 OBJECT LOCAL DEFAULT 25 completed.0
10: 0000000000003df8 0 OBJECT LOCAL DEFAULT 21
__do_global_dtor[...]
11: 0000000000001150 0 FUNC LOCAL DEFAULT 14 frame_dummy
12: 0000000000003df0 0 OBJECT LOCAL DEFAULT 20
__frame_dummy_in[...]
13: 0000000000000000 0 FILE LOCAL DEFAULT ABS damo.c
14: 0000000000004022 1 OBJECT LOCAL DEFAULT 25 ti
15: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
16: 00000000000020d8 0 OBJECT LOCAL DEFAULT 19 __FRAME_END__
17: 0000000000000000 0 FILE LOCAL DEFAULT ABS
18: 0000000000003e00 0 OBJECT LOCAL DEFAULT 22 _DYNAMIC
19: 0000000000002008 0 NOTYPE LOCAL DEFAULT 18 __GNU_EH_FRAME_HDR
20: 0000000000003fc0 0 OBJECT LOCAL DEFAULT 23
_GLOBAL_OFFSET_TABLE_
21: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
__libc_start_mai[...]
22: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
_ITM_deregisterT[...]
23: 0000000000004000 0 NOTYPE WEAK DEFAULT 24 data_start
24: 0000000000001160 8 FUNC GLOBAL DEFAULT 14 add
25: 0000000000004020 0 NOTYPE GLOBAL DEFAULT 24 _edata
26: 0000000000002004 1 NOTYPE WEAK HIDDEN 17 _.stapsdt.base
27: 0000000000004010 8 OBJECT GLOBAL DEFAULT 24 t1
28: 0000000000001168 0 FUNC GLOBAL HIDDEN 15 _fini
29: 0000000000004000 0 NOTYPE GLOBAL DEFAULT 24 __data_start
30: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
31: 0000000000004008 0 OBJECT GLOBAL HIDDEN 24 __dso_handle
32: 0000000000002000 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used
33: 0000000000004028 0 NOTYPE GLOBAL DEFAULT 25 _end
34: 0000000000001070 38 FUNC GLOBAL DEFAULT 14 _start
35: 0000000000004020 0 NOTYPE GLOBAL DEFAULT 25 __bss_start
36: 0000000000001040 48 FUNC GLOBAL DEFAULT 14 main
37: 0000000000004018 8 OBJECT GLOBAL DEFAULT 24 add_ptr
38: 0000000000004020 0 OBJECT GLOBAL HIDDEN 24 __TMC_END__
39: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
_ITM_registerTMC[...]
40: 0000000000000000 0 FUNC WEAK DEFAULT UND
__cxa_finalize@G[...]
41: 0000000000001000 0 FUNC GLOBAL HIDDEN 11 _init
Displaying notes found in: .note.gnu.property
Owner Data size Description
GNU 0x00000020 NT_GNU_PROPERTY_TYPE_0
Properties: x86 feature: IBT, SHSTK
x86 ISA needed: x86-64-baseline
Displaying notes found in: .note.gnu.build-id
Owner Data size Description
GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID
bitstring)
Build ID: eb615daa575687cc44edc1d339b27890c12c27f1
Displaying notes found in: .note.ABI-tag
Owner Data size Description
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
OS: Linux, ABI: 3.2.0
Displaying notes found in: .note.stapsdt
Owner Data size Description
stapsdt 0x00000066 NT_STAPSDT (SystemTap probe
descriptors)
Provider: usdt_rip
Name: rip_global_var
Location: 0x0000000000001058, Base: 0x0000000000002004, Semaphore:
0x0000000000000000
Arguments: -1@ti(%rip) 8@add_ptr(%rip) -1@4+t1(%rip) -1@ti(%rip)
Could you share the complete source codes and compiler options which
reproduce the above result?
At 2025-08-12 13:06:40, "Yonghong Song" <yonghong.s...@linux.dev> wrote:
On 8/10/25 1:55 AM, 赵佳炜 wrote:
Hi Yonghong,
I found another issue where symbols can be duplicated, and I’m not sure how to
tell them apart.
For example, I created two C files named usdt_rip.c and hello.c. Both define
their own static ti variables, like:`static volatile char ti = 0;`.
After compiling, I obtained an ELF file usdt_rip whose .symtab contains the
following entries:
$ readelf -s usdt_rip
Symbol table '.symtab' contains 42 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS Scrt1.o
2: 000000000000038c 32 OBJECT LOCAL DEFAULT 4 __abi_tag
3: 0000000000000000 0 FILE LOCAL DEFAULT ABS usdt_rip.c
4: 0000000000004021 1 OBJECT LOCAL DEFAULT 25 ti
5: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
6: 00000000000010a0 0 FUNC LOCAL DEFAULT 14
deregister_tm_clones
7: 00000000000010d0 0 FUNC LOCAL DEFAULT 14
register_tm_clones
8: 0000000000001110 0 FUNC LOCAL DEFAULT 14
__do_global_dtors_aux
9: 0000000000004020 1 OBJECT LOCAL DEFAULT 25 completed.0
10: 0000000000003df8 0 OBJECT LOCAL DEFAULT 21
__do_global_dtor[...]
11: 0000000000001150 0 FUNC LOCAL DEFAULT 14 frame_dummy
12: 0000000000003df0 0 OBJECT LOCAL DEFAULT 20
__frame_dummy_in[...]
13: 0000000000000000 0 FILE LOCAL DEFAULT ABS damo.c
14: 0000000000004022 1 OBJECT LOCAL DEFAULT 25 ti
15: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c
16: 00000000000020d8 0 OBJECT LOCAL DEFAULT 19 __FRAME_END__
As you can see, there are two ti variables in the .symtab section. Their values
are very close, making them hard to distinguish.
I’m unsure how to handle this situation. Do you have any suggestions?
Did you check relocations? Relocaitons should be able to point exact which
symbol.
Thanks,
Jiawei Zhao
[...]