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.
12 /[^ :]+\.so\.[0-9]+:[ ]+.file format .*$/ {
16 sub(/:$/, "", sofullname);
18 sub(/^.*\//, "", soname);
19 sub(/\.so\.[0-9]+$/, "", soname);
21 suppress = ((filename_regexp != "" && sofullname !~ filename_regexp) \
22 || (libname_regexp != "" && soname !~ libname_regexp));
30 /^[0-9a-fA-F]+ / { sub(/ /, " - ") }
33 $4 == "*UND*" { next }
38 $2 == "g" || $2 == "w" && NF == 7 {
46 gsub(/[()]/, "", version);
48 if (version == "GLIBC_PRIVATE") next;
51 if (type == "D" && $4 == ".tbss") {
54 else if (type == "D" && $4 == ".opd") {
58 else if ($4 == "*ABS*") {
62 else if (type == "DO") {
65 else if (type == "DF") {
70 desc = symbol " " version " " weak " ? " type " " $4 " " $5;
73 desc = symbol " " version " " weak " ? " type " " $4 " " $5;
76 # Disabled -- weakness should not matter to shared library ABIs any more.
77 #if (weak == "w") type = tolower(type);
79 desc = " " symbol " " type size;
82 version = soname " " version (combine_fullname ? " " sofullname : "");
84 if (version in versions) {
85 versions[version] = versions[version] "\n" desc;
88 versions[version] = desc;
94 NF == 0 || /DYNAMIC SYMBOL TABLE/ || /file format/ { next }
97 print "Don't grok this line:", $0
101 if (! parse_names || soname == "")
108 for (version in versions) {
109 if (nverslist == 0) {
114 split(verslist, s, "\n");
115 if (version < s[1]) {
117 for (i = 1; i <= nverslist; ++i) {
118 verslist = verslist "\n" s[i];
123 for (i = 2; i <= nverslist; ++i) {
124 if (version < s[i]) break;
125 verslist = verslist "\n" s[i];
127 verslist = verslist "\n" version;
128 for (; i <= nverslist; ++i) {
129 verslist = verslist "\n" s[i];
136 out = prefix soname ".symlist";
137 if (soname in outfiles)
138 out = out "." ++outfiles[soname];
140 outfiles[soname] = 1;
144 split(verslist, order, "\n");
145 for (i = 1; i <= nverslist; ++i) {
149 print version >> out;
151 outpipe = "sort >> " out;
156 print prefix version;
159 print versions[version] | outpipe;
162 delete versions[version];
164 for (version in versions)
165 delete versions[version];
168 print "wrote", out, "for", sofullname;