How is .gnu.version resolved?
Peng Yu
pengyu.ut@gmail.com
Sat May 1 01:07:47 GMT 2021
$ readelf -W -a puts_helloworld.exe
...
Version symbols section '.gnu.version' contains 7 entries:
Addr: 0x000000000000045a Offset: 0x00045a Link: 5 (.dynsym)
000: 0 (*local*) 0 (*local*) 2 (GLIBC_2.2.5) 2 (GLIBC_2.2.5)
004: 0 (*local*) 0 (*local*) 2 (GLIBC_2.2.5)
...
I see the .gnu.version above. Which contains 7 numbers 0, 0, 2, 2, 0,
0 and 2. The 2's seems to be the numbers in the numbers in () below.
Is it so? What do these 2's mean?
$ readelf -W --dyn-syms puts_helloworld.exe
Symbol table '.dynsym' contains 7 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
_ITM_deregisterTMCloneTable
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND
__libc_start_main@GLIBC_2.2.5 (2)
4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND
_ITM_registerTMCloneTable
6: 0000000000000000 0 FUNC WEAK DEFAULT UND
__cxa_finalize@GLIBC_2.2.5 (2)
The raw data in .gnu.version is just a bunch of uint16_t if I
understand it correctly. How these numbers are resolved to "*local*"
and GLIBC_2.2.5?
$ readelf -x .gnu.version puts_helloworld.exe
Hex dump of section '.gnu.version':
0x0000045a 00000000 02000200 00000000 0200 ..............
The input file is generated as below.
$ cat puts_helloworld.c
#include <stdio.h>
int main() {
puts("Hello World!");
return 0;
}
$ gcc -o puts_helloworld.exe puts_helloworld.c
$ gcc --version
gcc (Debian 10.2.1-6) 10.2.1 20210110
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
--
Regards,
Peng
More information about the Binutils
mailing list