]> git.ipfire.org Git - thirdparty/glibc.git/blame - scripts/abilist.awk
* scripts/abilist.awk: When given -v combine=1, do parse_names and
[thirdparty/glibc.git] / scripts / abilist.awk
CommitLineData
6e3d59bc
RM
1# This awk script processes the output of objdump --dynamic-syms
2# into a simple format that should not change when the ABI is not changing.
3
15a686af 4BEGIN {
7e30918b
RM
5 if (combine_fullname)
6 combine = 1;
7 if (combine)
8 parse_names = 1;
15a686af
RM
9}
10
11# Per-file header.
12/[^ :]+\.so\.[0-9]+:[ ]+.file format .*$/ {
13 if (parse_names && soname != "")
14 emit(1);
15
16 sofullname = $1;
17 sub(/:$/, "", sofullname);
18 soname = sofullname;
19 sub(/^.*\//, "", soname);
20 sub(/\.so\.[0-9]+$/, "", soname);
21
22 next
23}
24
6e3d59bc
RM
25# Normalize columns.
26/^[0-9a-fA-F]+ / { sub(/ /, " - ") }
27
28# Skip undefineds.
29$4 == "*UND*" { next }
30
31# Skip locals.
32$2 == "l" { next }
33
34$2 == "g" || $2 == "w" && NF == 7 {
c823a4d2 35 weak = $2;
6e3d59bc 36 type = $3;
56c71d45
RM
37 size = $5;
38 sub(/^0*/, "", size);
c823a4d2 39 size = " 0x" size;
6e3d59bc
RM
40 version = $6;
41 symbol = $7;
42 gsub(/[()]/, "", version);
43
44 if (version == "GLIBC_PRIVATE") next;
45
7e30918b 46 desc = "";
6e3d59bc 47 if (type == "D" && $4 == ".tbss") {
c823a4d2 48 type = "T";
6e3d59bc 49 }
5d0bbaaf 50 else if (type == "D" && $4 == ".opd") {
c823a4d2
RM
51 type = "O";
52 size = "";
5d0bbaaf 53 }
7e30918b 54 else if ($4 == "*ABS*") {
c823a4d2
RM
55 type = "A";
56 size = "";
6e3d59bc
RM
57 }
58 else if (type == "DO") {
c823a4d2 59 type = "D";
6e3d59bc
RM
60 }
61 else if (type == "DF") {
c823a4d2
RM
62 type = "F";
63 size = "";
6e3d59bc
RM
64 }
65 else {
7e30918b 66 desc = symbol " " version " " weak " ? " type " " $4 " " $5;
6e3d59bc 67 }
620656a3 68 if (size == " 0x") {
7e30918b 69 desc = symbol " " version " " weak " ? " type " " $4 " " $5;
620656a3 70 }
6e3d59bc 71
44aeb486
RM
72 # Disabled -- weakness should not matter to shared library ABIs any more.
73 #if (weak == "w") type = tolower(type);
7e30918b
RM
74 if (desc == "")
75 desc = " " symbol " " type size;
c823a4d2
RM
76
77 if (version in versions) {
78 versions[version] = versions[version] "\n" desc;
79 }
80 else {
81 versions[version] = desc;
82 }
6e3d59bc
RM
83 next;
84}
85
86# Header crapola.
87NF == 0 || /DYNAMIC SYMBOL TABLE/ || /file format/ { next }
88
89{
7e30918b 90 print "Don't grok this line:", $0
6e3d59bc 91}
c823a4d2 92
15a686af 93function emit(tofile) {
7e30918b 94 nverslist = 0;
c823a4d2
RM
95 for (version in versions) {
96 if (nverslist == 0) {
97 verslist = version;
98 nverslist = 1;
99 continue;
100 }
101 split(verslist, s, "\n");
102 if (version < s[1]) {
103 verslist = version;
104 for (i = 1; i <= nverslist; ++i) {
105 verslist = verslist "\n" s[i];
106 }
107 }
108 else {
109 verslist = s[1];
110 for (i = 2; i <= nverslist; ++i) {
111 if (version < s[i]) break;
112 verslist = verslist "\n" s[i];
113 }
114 verslist = verslist "\n" version;
115 for (; i <= nverslist; ++i) {
116 verslist = verslist "\n" s[i];
117 }
118 }
119 ++nverslist;
120 }
121
7e30918b
RM
122 if (combine)
123 tofile = 0;
124
374d9002
RM
125 if (tofile) {
126 out = prefix soname ".symlist";
127 if (soname in outfiles)
128 out = out "." ++outfiles[soname];
129 else
130 outfiles[soname] = 1;
131 printf "" > out;
132 }
133
c823a4d2
RM
134 split(verslist, order, "\n");
135 for (i = 1; i <= nverslist; ++i) {
136 version = order[i];
137
374d9002
RM
138 if (tofile) {
139 print version >> out;
140 close(out);
141 outpipe = "sort >> " out;
142 }
7e30918b
RM
143 else {
144 if (combine_fullname)
145 print prefix soname, version, sofullname;
146 else if (combine)
147 print prefix soname, version;
148 else
149 print version;
374d9002 150 outpipe = "sort";
7e30918b 151 }
c823a4d2
RM
152 print versions[version] | outpipe;
153 close(outpipe);
15a686af
RM
154
155 delete versions[version];
156 }
374d9002
RM
157 for (version in versions)
158 delete versions[version];
15a686af
RM
159
160 if (tofile)
161 print "wrote", out, "for", sofullname;
162}
163
164END {
165 if (! parse_names)
166 emit(0);
167 else if (soname != "") {
168 emit(1);
c823a4d2
RM
169 }
170}