在glibc中,“_L_lock_%=”如何变成“_L_lock_432”

How does `_L_lock_%=` become `_L_lock_432` in glibc?

本文关键字:lock 何变成 glibc      更新时间:2023-10-16

我正在阅读glibc源代码,试图调试死锁。

在我的堆栈跟踪中,我看到:

#0  0x00007ff58b449eec in __lll_lock_wait_private () from /lib64/libc.so.6
#1  0x00007ff58b3bda31 in _L_lock_423 () from /lib64/libc.so.6
#2  0x00007ff58b3bbca8 in __GI__IO_link_in () from /lib64/libc.so.6
#3  0x00007ff58b3bab92 in __GI__IO_file_init () from /lib64/libc.so.6

但是查看代码,对_L_lock_的唯一引用是在lowlevellock.h中的宏lll_lock中。

在那里,我在内联程序集语句中看到一个字符串:

".type _L_lock_%=, @functionn"

这以某种方式成为我的调用堆栈中_L_lock_423的函数。423从哪里出现?什么是%=符号?%= 在汇编中是什么意思?

如 gcc 文档中所述:

'%=' - 输出一个数字,该数字对于整个编译中 asm 语句的每个实例是唯一的。当创建本地标签并在生成多个汇编程序指令的单个模板中多次引用它们时,此选项很有用。