about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
Diffstat (limited to 'elf')
-rw-r--r--elf/Makefile1412
-rw-r--r--elf/Versions77
-rw-r--r--elf/cache.c829
-rw-r--r--elf/chroot_canon.c177
-rw-r--r--elf/circleload1.c166
-rw-r--r--elf/circlemod1.c7
-rw-r--r--elf/circlemod1a.c1
-rw-r--r--elf/circlemod2.c9
-rw-r--r--elf/circlemod2a.c7
-rw-r--r--elf/circlemod3.c14
-rw-r--r--elf/circlemod3a.c1
-rw-r--r--elf/constload1.c32
-rw-r--r--elf/constload2.c50
-rw-r--r--elf/constload3.c8
-rw-r--r--elf/dblload.c53
-rw-r--r--elf/dblloadmod1.c8
-rw-r--r--elf/dblloadmod2.c15
-rw-r--r--elf/dblloadmod3.c8
-rw-r--r--elf/dblunload.c53
-rw-r--r--elf/dep1.c25
-rw-r--r--elf/dep2.c25
-rw-r--r--elf/dep3.c23
-rw-r--r--elf/dep4.c24
-rw-r--r--elf/dl-addr-obj.c75
-rw-r--r--elf/dl-addr.c146
-rw-r--r--elf/dl-brk.c5
-rw-r--r--elf/dl-cache.c325
-rw-r--r--elf/dl-caller.c86
-rw-r--r--elf/dl-close.c843
-rw-r--r--elf/dl-conflict.c74
-rw-r--r--elf/dl-debug.c76
-rw-r--r--elf/dl-deps.c688
-rw-r--r--elf/dl-dst.h74
-rw-r--r--elf/dl-environ.c85
-rw-r--r--elf/dl-error-minimal.c23
-rw-r--r--elf/dl-error-skeleton.c230
-rw-r--r--elf/dl-error.c27
-rw-r--r--elf/dl-execstack.c31
-rw-r--r--elf/dl-fini.c281
-rw-r--r--elf/dl-fptr.c322
-rw-r--r--elf/dl-hwcaps.c297
-rw-r--r--elf/dl-hwcaps.h30
-rw-r--r--elf/dl-init.c126
-rw-r--r--elf/dl-iteratephdr.c89
-rw-r--r--elf/dl-libc.c330
-rw-r--r--elf/dl-load.c2307
-rw-r--r--elf/dl-load.h135
-rw-r--r--elf/dl-lookup.c1129
-rw-r--r--elf/dl-machine-reject-phdr.h34
-rw-r--r--elf/dl-map-segments.h157
-rw-r--r--elf/dl-minimal.c380
-rw-r--r--elf/dl-misc.c362
-rw-r--r--elf/dl-object.c229
-rw-r--r--elf/dl-open.c737
-rw-r--r--elf/dl-origin.c50
-rw-r--r--elf/dl-profile.c596
-rw-r--r--elf/dl-profstub.c41
-rw-r--r--elf/dl-reloc.c363
-rw-r--r--elf/dl-runtime.c480
-rw-r--r--elf/dl-sbrk.c5
-rw-r--r--elf/dl-scope.c57
-rw-r--r--elf/dl-support.c389
-rw-r--r--elf/dl-sym.c274
-rw-r--r--elf/dl-symaddr.c33
-rw-r--r--elf/dl-sysdep-open.h45
-rw-r--r--elf/dl-sysdep.c360
-rw-r--r--elf/dl-tls.c953
-rw-r--r--elf/dl-trampoline.c1
-rw-r--r--elf/dl-tunable-types.h62
-rw-r--r--elf/dl-tunables.c490
-rw-r--r--elf/dl-tunables.h115
-rw-r--r--elf/dl-tunables.list87
-rw-r--r--elf/dl-unmap-segments.h35
-rw-r--r--elf/dl-version.c389
-rw-r--r--elf/dl-writev.h56
-rw-r--r--elf/do-rel.h191
-rw-r--r--elf/dynamic-link.h203
-rw-r--r--elf/elf.h3761
-rw-r--r--elf/enbl-secure.c36
-rw-r--r--elf/failobj.c10
-rw-r--r--elf/filter.c19
-rw-r--r--elf/filtmod1.c7
-rw-r--r--elf/filtmod2.c7
-rw-r--r--elf/firstobj.c10
-rw-r--r--elf/gen-trusted-dirs.awk37
-rw-r--r--elf/genrtldtbl.awk29
-rw-r--r--elf/get-dynamic-info.h184
-rw-r--r--elf/global.c7
-rw-r--r--elf/globalmod1.c17
-rw-r--r--elf/ifuncdep1.c3
-rw-r--r--elf/ifuncdep1pic.c3
-rw-r--r--elf/ifuncdep2.c59
-rw-r--r--elf/ifuncdep2pic.c3
-rw-r--r--elf/ifuncdep5.c3
-rw-r--r--elf/ifuncdep5pic.c3
-rw-r--r--elf/ifuncmain1.c64
-rw-r--r--elf/ifuncmain1pic.c3
-rw-r--r--elf/ifuncmain1picstatic.c3
-rw-r--r--elf/ifuncmain1pie.c3
-rw-r--r--elf/ifuncmain1static.c3
-rw-r--r--elf/ifuncmain1staticpic.c3
-rw-r--r--elf/ifuncmain1staticpie.c3
-rw-r--r--elf/ifuncmain1vis.c87
-rw-r--r--elf/ifuncmain1vispic.c3
-rw-r--r--elf/ifuncmain1vispie.c3
-rw-r--r--elf/ifuncmain2.c14
-rw-r--r--elf/ifuncmain2pic.c3
-rw-r--r--elf/ifuncmain2picstatic.c3
-rw-r--r--elf/ifuncmain2static.c3
-rw-r--r--elf/ifuncmain3.c129
-rw-r--r--elf/ifuncmain4.c4
-rw-r--r--elf/ifuncmain4picstatic.c3
-rw-r--r--elf/ifuncmain4static.c3
-rw-r--r--elf/ifuncmain5.c38
-rw-r--r--elf/ifuncmain5pic.c3
-rw-r--r--elf/ifuncmain5picstatic.c3
-rw-r--r--elf/ifuncmain5pie.c3
-rw-r--r--elf/ifuncmain5static.c3
-rw-r--r--elf/ifuncmain5staticpic.c3
-rw-r--r--elf/ifuncmain6pie.c65
-rw-r--r--elf/ifuncmain7.c72
-rw-r--r--elf/ifuncmain7pic.c7
-rw-r--r--elf/ifuncmain7picstatic.c7
-rw-r--r--elf/ifuncmain7pie.c7
-rw-r--r--elf/ifuncmain7static.c7
-rw-r--r--elf/ifuncmod1.c100
-rw-r--r--elf/ifuncmod3.c7
-rw-r--r--elf/ifuncmod5.c64
-rw-r--r--elf/ifuncmod6.c19
-rw-r--r--elf/initfirst.c22
-rw-r--r--elf/interp.c22
-rw-r--r--elf/lateglobal.c47
-rw-r--r--elf/ldconfig.c1418
-rw-r--r--elf/ldd.bash.in203
-rw-r--r--elf/link.h194
-rw-r--r--elf/loadfail.c42
-rw-r--r--elf/loadtest.c202
-rw-r--r--elf/ltglobmod1.c7
-rw-r--r--elf/ltglobmod2.c33
-rw-r--r--elf/multiload.c105
-rw-r--r--elf/neededobj1.c6
-rw-r--r--elf/neededobj2.c8
-rw-r--r--elf/neededobj3.c10
-rw-r--r--elf/neededobj4.c12
-rw-r--r--elf/neededobj5.c5
-rw-r--r--elf/neededobj6.c7
-rw-r--r--elf/neededtest.c125
-rw-r--r--elf/neededtest2.c118
-rw-r--r--elf/neededtest3.c129
-rw-r--r--elf/neededtest4.c158
-rw-r--r--elf/next.c43
-rw-r--r--elf/nextmod1.c30
-rw-r--r--elf/nextmod2.c10
-rw-r--r--elf/nodel2mod1.c19
-rw-r--r--elf/nodel2mod2.c7
-rw-r--r--elf/nodel2mod3.c1
-rw-r--r--elf/nodelete.c210
-rw-r--r--elf/nodelete2.c16
-rw-r--r--elf/nodelmod1.c9
-rw-r--r--elf/nodelmod2.c9
-rw-r--r--elf/nodelmod3.c8
-rw-r--r--elf/nodelmod4.c9
-rw-r--r--elf/nodlopen.c15
-rw-r--r--elf/nodlopen2.c15
-rw-r--r--elf/nodlopenmod.c1
-rw-r--r--elf/nodlopenmod2.c9
-rw-r--r--elf/noload.c81
-rw-r--r--elf/order.c25
-rw-r--r--elf/order2.c45
-rw-r--r--elf/order2mod1.c8
-rw-r--r--elf/order2mod2.c18
-rw-r--r--elf/order2mod3.c14
-rw-r--r--elf/order2mod4.c16
-rw-r--r--elf/origtest.c39
-rw-r--r--elf/pathoptobj.c8
-rw-r--r--elf/pldd-xx.c251
-rw-r--r--elf/pldd.c344
-rw-r--r--elf/preloadtest.c19
-rw-r--r--elf/readelflib.c234
-rw-r--r--elf/readlib.c212
-rw-r--r--elf/reldep.c111
-rw-r--r--elf/reldep2.c101
-rw-r--r--elf/reldep3.c101
-rw-r--r--elf/reldep4.c40
-rw-r--r--elf/reldep4mod1.c7
-rw-r--r--elf/reldep4mod2.c8
-rw-r--r--elf/reldep4mod3.c7
-rw-r--r--elf/reldep4mod4.c8
-rw-r--r--elf/reldep5.c70
-rw-r--r--elf/reldep6.c109
-rw-r--r--elf/reldep6mod0.c8
-rw-r--r--elf/reldep6mod1.c14
-rw-r--r--elf/reldep6mod2.c3
-rw-r--r--elf/reldep6mod3.c3
-rw-r--r--elf/reldep6mod4.c12
-rw-r--r--elf/reldep7.c58
-rw-r--r--elf/reldep7mod1.c12
-rw-r--r--elf/reldep7mod2.c12
-rw-r--r--elf/reldep8.c16
-rw-r--r--elf/reldep8mod1.c19
-rw-r--r--elf/reldep8mod2.c7
-rw-r--r--elf/reldep8mod3.c1
-rw-r--r--elf/reldep9.c16
-rw-r--r--elf/reldep9mod1.c23
-rw-r--r--elf/reldep9mod2.c3
-rw-r--r--elf/reldep9mod3.c1
-rw-r--r--elf/reldepmod1.c10
-rw-r--r--elf/reldepmod2.c8
-rw-r--r--elf/reldepmod3.c20
-rw-r--r--elf/reldepmod4.c37
-rw-r--r--elf/reldepmod5.c7
-rw-r--r--elf/reldepmod6.c8
-rw-r--r--elf/resolvfail.c31
-rw-r--r--elf/restest1.c57
-rw-r--r--elf/restest2.c33
-rw-r--r--elf/rtld-Rules149
-rw-r--r--elf/rtld-debugger-interface.txt122
-rw-r--r--elf/rtld.c2652
-rw-r--r--elf/setup-vdso.h121
-rw-r--r--elf/sln.c202
-rw-r--r--elf/sofini.c19
-rw-r--r--elf/soinit.c43
-rw-r--r--elf/sotruss-lib.c386
-rwxr-xr-xelf/sotruss.sh152
-rw-r--r--elf/sprof.c1436
-rw-r--r--elf/static-stubs.c46
-rw-r--r--elf/testobj.h28
-rw-r--r--elf/testobj1.c25
-rw-r--r--elf/testobj1_1.c7
-rw-r--r--elf/testobj2.c32
-rw-r--r--elf/testobj3.c26
-rw-r--r--elf/testobj4.c25
-rw-r--r--elf/testobj5.c26
-rw-r--r--elf/testobj6.c19
-rw-r--r--elf/tls-macros.h25
-rw-r--r--elf/tlsdeschtab.h164
-rw-r--r--elf/tst-_dl_addr_inside_object.c222
-rw-r--r--elf/tst-addr1.c25
-rw-r--r--elf/tst-align.c52
-rw-r--r--elf/tst-align2.c155
-rw-r--r--elf/tst-alignmod.c52
-rw-r--r--elf/tst-alignmod2.c59
-rw-r--r--elf/tst-array1-static.c1
-rw-r--r--elf/tst-array1.c103
-rw-r--r--elf/tst-array1.exp11
-rw-r--r--elf/tst-array2.c1
-rw-r--r--elf/tst-array2.exp19
-rw-r--r--elf/tst-array2dep.c71
-rw-r--r--elf/tst-array3.c1
-rw-r--r--elf/tst-array4.c18
-rw-r--r--elf/tst-array4.exp19
-rw-r--r--elf/tst-array5-static.c1
-rw-r--r--elf/tst-array5-static.exp2
-rw-r--r--elf/tst-array5.c50
-rw-r--r--elf/tst-array5.exp3
-rw-r--r--elf/tst-array5dep.c23
-rw-r--r--elf/tst-audit1.c1
-rw-r--r--elf/tst-audit11.c35
-rw-r--r--elf/tst-audit11mod1.c24
-rw-r--r--elf/tst-audit11mod2.c23
-rw-r--r--elf/tst-audit11mod2.map22
-rw-r--r--elf/tst-audit12.c48
-rw-r--r--elf/tst-audit12mod1.c24
-rw-r--r--elf/tst-audit12mod2.c23
-rw-r--r--elf/tst-audit12mod2.map22
-rw-r--r--elf/tst-audit12mod3.c23
-rw-r--r--elf/tst-audit2.c60
-rw-r--r--elf/tst-audit8.c1
-rw-r--r--elf/tst-audit9.c11
-rw-r--r--elf/tst-auditmod1.c135
-rw-r--r--elf/tst-auditmod11.c39
-rw-r--r--elf/tst-auditmod12.c43
-rw-r--r--elf/tst-auditmod9a.c15
-rw-r--r--elf/tst-auditmod9b.c6
-rw-r--r--elf/tst-auxv.c70
-rw-r--r--elf/tst-deep1.c35
-rw-r--r--elf/tst-deep1mod1.c14
-rw-r--r--elf/tst-deep1mod2.c16
-rw-r--r--elf/tst-deep1mod3.c17
-rw-r--r--elf/tst-dl-iter-static.c46
-rw-r--r--elf/tst-dlmodcount.c108
-rw-r--r--elf/tst-dlmopen1.c80
-rw-r--r--elf/tst-dlmopen1mod.c59
-rw-r--r--elf/tst-dlmopen2.c69
-rw-r--r--elf/tst-dlmopen3.c21
-rw-r--r--elf/tst-dlopen-aout.c67
-rw-r--r--elf/tst-dlopenrpath.c70
-rw-r--r--elf/tst-dlopenrpathmod.c35
-rw-r--r--elf/tst-dlsym-error.c113
-rw-r--r--elf/tst-env-setuid-tunables.c75
-rw-r--r--elf/tst-env-setuid.c296
-rw-r--r--elf/tst-execstack-mod.c30
-rw-r--r--elf/tst-execstack-needed.c34
-rw-r--r--elf/tst-execstack-prog.c33
-rw-r--r--elf/tst-execstack.c236
-rw-r--r--elf/tst-global1.c38
-rw-r--r--elf/tst-gnu2-tls1.c51
-rw-r--r--elf/tst-gnu2-tls1mod.c56
-rw-r--r--elf/tst-initorder.c7
-rw-r--r--elf/tst-initorder.exp13
-rw-r--r--elf/tst-initorder2.c20
-rw-r--r--elf/tst-initorder2.exp9
-rw-r--r--elf/tst-initordera1.c16
-rw-r--r--elf/tst-initordera2.c16
-rw-r--r--elf/tst-initordera3.c16
-rw-r--r--elf/tst-initordera4.c16
-rw-r--r--elf/tst-initorderb1.c16
-rw-r--r--elf/tst-initorderb2.c16
-rw-r--r--elf/tst-latepthread.c104
-rw-r--r--elf/tst-latepthreadmod.c33
-rw-r--r--elf/tst-ldconfig-X.sh62
-rw-r--r--elf/tst-leaks1-static.c1
-rw-r--r--elf/tst-leaks1.c27
-rw-r--r--elf/tst-linkall-static.c52
-rw-r--r--elf/tst-nodelete-dlclose-dso.c90
-rw-r--r--elf/tst-nodelete-dlclose-plugin.c40
-rw-r--r--elf/tst-nodelete-dlclose.c35
-rw-r--r--elf/tst-nodelete-opened-lib.c19
-rw-r--r--elf/tst-nodelete-opened.c68
-rw-r--r--elf/tst-nodelete-rtldmod.cc6
-rw-r--r--elf/tst-nodelete-uniquemod.cc14
-rw-r--r--elf/tst-nodelete-zmod.cc6
-rw-r--r--elf/tst-nodelete.cc50
-rw-r--r--elf/tst-nodelete2.c36
-rw-r--r--elf/tst-nodelete2mod.c7
-rw-r--r--elf/tst-noload.c72
-rw-r--r--elf/tst-null-argv-lib.c24
-rw-r--r--elf/tst-null-argv.c36
-rw-r--r--elf/tst-order-a1.c16
-rw-r--r--elf/tst-order-a2.c16
-rw-r--r--elf/tst-order-a3.c16
-rw-r--r--elf/tst-order-a4.c16
-rw-r--r--elf/tst-order-b1.c16
-rw-r--r--elf/tst-order-b2.c16
-rw-r--r--elf/tst-order-main.c12
-rw-r--r--elf/tst-pathopt.c41
-rwxr-xr-xelf/tst-pathopt.sh39
-rw-r--r--elf/tst-pie1.c5
-rw-r--r--elf/tst-pie2.c40
-rw-r--r--elf/tst-piemod1.c22
-rw-r--r--elf/tst-prelink.c29
-rw-r--r--elf/tst-prelink.exp1
-rw-r--r--elf/tst-protected1a.c234
-rw-r--r--elf/tst-protected1b.c240
-rw-r--r--elf/tst-protected1mod.h41
-rw-r--r--elf/tst-protected1moda.c92
-rw-r--r--elf/tst-protected1modb.c62
-rw-r--r--elf/tst-ptrguard1-static.c1
-rw-r--r--elf/tst-ptrguard1.c217
-rw-r--r--elf/tst-relsort1.c18
-rw-r--r--elf/tst-relsort1mod1.c7
-rw-r--r--elf/tst-relsort1mod2.c7
-rwxr-xr-xelf/tst-rtld-load-self.sh49
-rw-r--r--elf/tst-stackguard1-static.c1
-rw-r--r--elf/tst-stackguard1.c205
-rw-r--r--elf/tst-thrlock.c58
-rw-r--r--elf/tst-tls-dlinfo.c85
-rw-r--r--elf/tst-tls-manydynamic.c151
-rw-r--r--elf/tst-tls-manydynamic.h44
-rw-r--r--elf/tst-tls-manydynamicmod.c36
-rw-r--r--elf/tst-tls1-static.c1
-rw-r--r--elf/tst-tls1.c82
-rw-r--r--elf/tst-tls10.c39
-rw-r--r--elf/tst-tls10.h32
-rw-r--r--elf/tst-tls11.c28
-rw-r--r--elf/tst-tls12.c19
-rw-r--r--elf/tst-tls13.c28
-rw-r--r--elf/tst-tls14.c54
-rw-r--r--elf/tst-tls15.c32
-rw-r--r--elf/tst-tls16.c52
-rw-r--r--elf/tst-tls17.c28
-rw-r--r--elf/tst-tls18.c37
-rw-r--r--elf/tst-tls19.c26
-rw-r--r--elf/tst-tls19mod1.c15
-rw-r--r--elf/tst-tls19mod2.c13
-rw-r--r--elf/tst-tls19mod3.c16
-rw-r--r--elf/tst-tls2-static.c1
-rw-r--r--elf/tst-tls2.c82
-rw-r--r--elf/tst-tls3.c67
-rw-r--r--elf/tst-tls4.c49
-rw-r--r--elf/tst-tls5.c65
-rw-r--r--elf/tst-tls6.c84
-rw-r--r--elf/tst-tls7.c55
-rw-r--r--elf/tst-tls8.c167
-rw-r--r--elf/tst-tls9-static.c1
-rw-r--r--elf/tst-tls9.c36
-rw-r--r--elf/tst-tlsalign-extern-static.c1
-rw-r--r--elf/tst-tlsalign-extern.c73
-rw-r--r--elf/tst-tlsalign-lib.c6
-rw-r--r--elf/tst-tlsalign-static.c2
-rw-r--r--elf/tst-tlsalign-vars.c28
-rw-r--r--elf/tst-tlsalign.c84
-rw-r--r--elf/tst-tlsmod1.c62
-rw-r--r--elf/tst-tlsmod10.c1
-rw-r--r--elf/tst-tlsmod11.c4
-rw-r--r--elf/tst-tlsmod12.c12
-rw-r--r--elf/tst-tlsmod13.c7
-rw-r--r--elf/tst-tlsmod13a.c9
-rw-r--r--elf/tst-tlsmod14a.c35
-rw-r--r--elf/tst-tlsmod14b.c2
-rw-r--r--elf/tst-tlsmod15a.c6
-rw-r--r--elf/tst-tlsmod15b.c9
-rw-r--r--elf/tst-tlsmod16a.c1
-rw-r--r--elf/tst-tlsmod16b.c7
-rw-r--r--elf/tst-tlsmod17a.c23
-rw-r--r--elf/tst-tlsmod17b.c15
-rw-r--r--elf/tst-tlsmod18a.c21
-rw-r--r--elf/tst-tlsmod2.c34
-rw-r--r--elf/tst-tlsmod3.c37
-rw-r--r--elf/tst-tlsmod4.c34
-rw-r--r--elf/tst-tlsmod5.c3
-rw-r--r--elf/tst-tlsmod6.c3
-rw-r--r--elf/tst-tlsmod7.c101
-rw-r--r--elf/tst-tlsmod8.c70
-rw-r--r--elf/tst-tlsmod9.c99
-rw-r--r--elf/tst-unique1.c73
-rw-r--r--elf/tst-unique1mod1.c16
-rw-r--r--elf/tst-unique1mod2.c15
-rw-r--r--elf/tst-unique2.c27
-rw-r--r--elf/tst-unique2mod1.c8
-rw-r--r--elf/tst-unique2mod2.c15
-rw-r--r--elf/tst-unique3.cc24
-rw-r--r--elf/tst-unique3.h8
-rw-r--r--elf/tst-unique3lib.cc11
-rw-r--r--elf/tst-unique3lib2.cc12
-rw-r--r--elf/tst-unique4.cc28
-rw-r--r--elf/tst-unique4.h7
-rw-r--r--elf/tst-unique4lib.cc17
-rw-r--r--elf/unload.c91
-rw-r--r--elf/unload2.c59
-rw-r--r--elf/unload2dep.c6
-rw-r--r--elf/unload2mod.c8
-rw-r--r--elf/unload3.c41
-rw-r--r--elf/unload3mod1.c1
-rw-r--r--elf/unload3mod2.c1
-rw-r--r--elf/unload3mod3.c8
-rw-r--r--elf/unload3mod4.c13
-rw-r--r--elf/unload4.c48
-rw-r--r--elf/unload4mod1.c10
-rw-r--r--elf/unload4mod2.c8
-rw-r--r--elf/unload4mod3.c16
-rw-r--r--elf/unload4mod4.c16
-rw-r--r--elf/unload5.c42
-rw-r--r--elf/unload6.c30
-rw-r--r--elf/unload6mod1.c16
-rw-r--r--elf/unload6mod2.c23
-rw-r--r--elf/unload6mod3.c23
-rw-r--r--elf/unload7.c39
-rw-r--r--elf/unload7mod1.c11
-rw-r--r--elf/unload7mod2.c1
-rw-r--r--elf/unload8.c33
-rw-r--r--elf/unload8mod1.c7
-rw-r--r--elf/unload8mod1x.c1
-rw-r--r--elf/unload8mod2.c7
-rw-r--r--elf/unload8mod3.c27
-rw-r--r--elf/unloadmod.c4
-rw-r--r--elf/vismain.c260
-rw-r--r--elf/vismod.h27
-rw-r--r--elf/vismod1.c103
-rw-r--r--elf/vismod2.c123
-rw-r--r--elf/vismod3.c46
461 files changed, 0 insertions, 43439 deletions
diff --git a/elf/Makefile b/elf/Makefile
deleted file mode 100644
index 201b328f88..0000000000
--- a/elf/Makefile
+++ /dev/null
@@ -1,1412 +0,0 @@
-# Copyright (C) 1995-2017 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, see
-# <http://www.gnu.org/licenses/>.
-
-# Makefile for elf subdirectory of GNU C Library.
-
-subdir		:= elf
-
-include ../Makeconfig
-
-headers		= elf.h bits/elfclass.h link.h bits/link.h
-routines	= $(all-dl-routines) dl-support dl-iteratephdr \
-		  dl-addr dl-addr-obj enbl-secure dl-profstub \
-		  dl-origin dl-libc dl-sym dl-sysdep dl-error
-
-# The core dynamic linking functions are in libc for the static and
-# profiled libraries.
-dl-routines	= $(addprefix dl-,load lookup object reloc deps hwcaps \
-				  runtime init fini debug misc \
-				  version profile conflict tls origin scope \
-				  execstack caller open close trampoline)
-ifeq (yes,$(use-ldconfig))
-dl-routines += dl-cache
-endif
-
-ifneq (no,$(have-tunables))
-dl-routines += dl-tunables
-tunables-type = $(addprefix TUNABLES_FRONTEND_,$(have-tunables))
-CPPFLAGS-dl-tunables.c = -DTUNABLES_FRONTEND=$(tunables-type)
-
-# Make sure that the compiler does not insert any library calls in tunables
-# code paths.
-ifeq (yes,$(have-loop-to-function))
-CFLAGS-dl-tunables.c = -fno-tree-loop-distribute-patterns
-endif
-endif
-
-all-dl-routines = $(dl-routines) $(sysdep-dl-routines)
-# But they are absent from the shared libc, because that code is in ld.so.
-elide-routines.os = $(all-dl-routines) dl-support enbl-secure dl-origin \
-		    dl-sysdep
-shared-only-routines += dl-caller
-
-# ld.so uses those routines, plus some special stuff for being the program
-# interpreter and operating independent of libc.
-rtld-routines	= rtld $(all-dl-routines) dl-sysdep dl-environ dl-minimal \
-  dl-error-minimal
-all-rtld-routines = $(rtld-routines) $(sysdep-rtld-routines)
-
-CFLAGS-dl-runtime.c = -fexceptions -fasynchronous-unwind-tables
-CFLAGS-dl-lookup.c = -fexceptions -fasynchronous-unwind-tables
-CFLAGS-dl-iterate-phdr.c = $(uses-callbacks)
-
-# Compile rtld itself without stack protection.
-# Also compile all routines in the static library that are elided from
-# the shared libc because they are in libc.a in the same way.
-
-define elide-stack-protector
-$(if $(filter $(@F),$(patsubst %,%$(1),$(2))), $(no-stack-protector))
-endef
-
-CFLAGS-.o += $(call elide-stack-protector,.o,$(elide-routines.os))
-CFLAGS-.op += $(call elide-stack-protector,.op,$(elide-routines.os))
-CFLAGS-.os += $(call elide-stack-protector,.os,$(all-rtld-routines))
-
-ifeq ($(unwind-find-fde),yes)
-routines += unwind-dw2-fde-glibc
-shared-only-routines += unwind-dw2-fde-glibc
-endif
-
-before-compile  += $(objpfx)trusted-dirs.h
-generated	+= trusted-dirs.h trusted-dirs.st for-renamed/renamed.so
-generated-dirs	+= for-renamed
-
-ifeq ($(build-shared),yes)
-ld-map		= $(common-objpfx)ld.map
-endif
-
-ifeq (yes,$(build-shared))
-extra-objs	= $(all-rtld-routines:%=%.os) soinit.os sofini.os interp.os
-generated	+= librtld.os dl-allobjs.os ld.so ldd
-install-others	= $(inst_rtlddir)/$(rtld-installed-name)
-install-bin-script = ldd
-endif
-
-others		= sprof sln
-install-bin	= sprof
-others-static   = sln
-install-rootsbin = sln
-sln-modules	:= static-stubs
-extra-objs	+= $(sln-modules:=.o)
-
-ifeq (yes,$(use-ldconfig))
-ifeq (yes,$(build-shared))
-others-static	+= ldconfig
-others		+= ldconfig
-install-rootsbin += ldconfig
-
-ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon static-stubs
-extra-objs	+= $(ldconfig-modules:=.o)
-endif
-endif
-
-# To find xmalloc.c and xstrdup.c
-vpath %.c ../locale/programs
-
-ifeq ($(build-shared),yes)
-extra-objs += sotruss-lib.os sotruss-lib.so
-install-others += $(inst_auditdir)/sotruss-lib.so
-install-bin-script += sotruss
-generated += sotruss
-libof-sotruss-lib = extramodules
-$(objpfx)sotruss-lib.so: $(objpfx)sotruss-lib.os
-	$(build-module-asneeded)
-$(objpfx)sotruss-lib.so: $(common-objpfx)libc.so $(objpfx)ld.so \
-	$(common-objpfx)libc_nonshared.a
-
-$(objpfx)sotruss: sotruss.sh $(common-objpfx)config.make
-	sed -e 's%@BASH@%$(BASH)%g' \
-	    -e 's%@VERSION@%$(version)%g' \
-	    -e 's%@TEXTDOMAINDIR@%$(localedir)%g' \
-	    -e 's%@PREFIX@%$(prefix)%g' \
-	    -e 's|@PKGVERSION@|$(PKGVERSION)|g' \
-	    -e 's|@REPORT_BUGS_TO@|$(REPORT_BUGS_TO)|g' \
-	    < $< > $@.new
-	chmod 555 $@.new
-	mv -f $@.new $@
-$(inst_auditdir)/sotruss-lib.so: $(objpfx)sotruss-lib.so $(+force)
-	$(do-install-program)
-endif
-
-tests-static-normal := tst-leaks1-static tst-array1-static tst-array5-static \
-	       tst-dl-iter-static \
-	       tst-tlsalign-static tst-tlsalign-extern-static \
-	       tst-linkall-static tst-env-setuid tst-env-setuid-tunables
-tests-static-internal := tst-tls1-static tst-tls2-static \
-	       tst-ptrguard1-static tst-stackguard1-static
-
-tests := tst-tls9 tst-leaks1 \
-	tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 \
-	tst-auxv
-tests-internal := tst-tls1 tst-tls2 $(tests-static-internal)
-tests-static := $(tests-static-normal) $(tests-static-internal)
-
-ifeq (yes,$(build-shared))
-tests-static += tst-tls9-static
-tst-tls9-static-ENV = \
-       LD_LIBRARY_PATH=$(objpfx):$(common-objpfx):$(common-objpfx)dlfcn
-
-tests += restest1 preloadtest loadfail multiload origtest resolvfail \
-	 constload1 order noload filter \
-	 reldep reldep2 reldep3 reldep4 nodelete nodelete2 \
-	 nodlopen nodlopen2 lateglobal initfirst global \
-	 restest2 next dblload dblunload reldep5 reldep6 reldep7 reldep8 \
-	 tst-tls4 tst-tls5 \
-	 tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-tls15 \
-	 tst-tls16 tst-tls17 tst-tls18 tst-tls19 tst-tls-dlinfo \
-	 tst-align tst-align2 $(tests-execstack-$(have-z-execstack)) \
-	 tst-dlmodcount tst-dlopenrpath tst-deep1 \
-	 tst-dlmopen1 tst-dlmopen3 \
-	 unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \
-	 tst-audit1 tst-audit2 tst-audit8 tst-audit9 \
-	 tst-addr1 tst-thrlock \
-	 tst-unique1 tst-unique2 $(if $(CXX),tst-unique3 tst-unique4 \
-	 tst-nodelete) \
-	 tst-initorder tst-initorder2 tst-relsort1 tst-null-argv \
-	 tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \
-	 tst-nodelete2 tst-audit11 tst-audit12 tst-dlsym-error tst-noload \
-	 tst-latepthread tst-tls-manydynamic tst-nodelete-dlclose
-#	 reldep9
-tests-internal += loadtest unload unload2 circleload1 \
-	 neededtest neededtest2 neededtest3 neededtest4 \
-	 tst-tls3 tst-tls6 tst-tls7 tst-tls8 tst-dlmopen2 \
-	 tst-ptrguard1 tst-stackguard1
-ifeq ($(build-hardcoded-path-in-tests),yes)
-tests += tst-dlopen-aout
-LDFLAGS-tst-dlopen-aout = $(no-pie-ldflag)
-endif
-test-srcs = tst-pathopt
-selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
-ifneq ($(selinux-enabled),1)
-tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog
-endif
-endif
-ifeq ($(run-built-tests),yes)
-tests-special += $(objpfx)tst-leaks1-mem.out \
-		 $(objpfx)tst-leaks1-static-mem.out $(objpfx)noload-mem.out \
-		 $(objpfx)tst-ldconfig-X.out
-endif
-tlsmod17a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
-tlsmod18a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
-tlsmod17a-modules = $(addprefix tst-tlsmod17a, $(tlsmod17a-suffixes))
-tlsmod18a-modules = $(addprefix tst-tlsmod18a, $(tlsmod17a-suffixes))
-one-hundred = $(foreach x,0 1 2 3 4 5 6 7 8 9, \
-  0$x 1$x 2$x 3$x 4$x 5$x 6$x 7$x 8$x 9$x)
-tst-tls-many-dynamic-modules := \
-  $(foreach n,$(one-hundred),tst-tls-manydynamic$(n)mod)
-extra-test-objs += $(tlsmod17a-modules:=.os) $(tlsmod18a-modules:=.os) \
-		   tst-tlsalign-vars.o
-test-extras += tst-tlsmod17a tst-tlsmod18a tst-tlsalign-vars
-modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
-		testobj1_1 failobj constload2 constload3 unloadmod \
-		dep1 dep2 dep3 dep4 vismod1 vismod2 vismod3 \
-		nodelmod1 nodelmod2 nodelmod3 nodelmod4 \
-		nodel2mod1 nodel2mod2 nodel2mod3 \
-		nodlopenmod nodlopenmod2 filtmod1 filtmod2 \
-		reldepmod1 reldepmod2 reldepmod3 reldepmod4 nextmod1 nextmod2 \
-		reldep4mod1 reldep4mod2 reldep4mod3 reldep4mod4 \
-		neededobj1 neededobj2 neededobj3 neededobj4 \
-		neededobj5 neededobj6 firstobj globalmod1 \
-		unload2mod unload2dep ltglobmod1 ltglobmod2 pathoptobj \
-		dblloadmod1 dblloadmod2 dblloadmod3 reldepmod5 reldepmod6 \
-		reldep6mod0 reldep6mod1 reldep6mod2 reldep6mod3 reldep6mod4 \
-		reldep7mod1 reldep7mod2 \
-		tst-tlsmod1 tst-tlsmod2 tst-tlsmod3 tst-tlsmod4 \
-		tst-tlsmod5 tst-tlsmod6 tst-tlsmod7 tst-tlsmod8 \
-		tst-tlsmod9 tst-tlsmod10 tst-tlsmod11 tst-tlsmod12 \
-		tst-tlsmod13 tst-tlsmod13a tst-tlsmod14a tst-tlsmod14b \
-		tst-tlsmod15a tst-tlsmod15b tst-tlsmod16a tst-tlsmod16b \
-		$(tlsmod17a-modules) tst-tlsmod17b $(tlsmod18a-modules) \
-		tst-tls19mod1 tst-tls19mod2 tst-tls19mod3 \
-		circlemod1 circlemod1a circlemod2 circlemod2a \
-		circlemod3 circlemod3a \
-		reldep8mod1 reldep8mod2 reldep8mod3 \
-		reldep9mod1 reldep9mod2 reldep9mod3 \
-		tst-alignmod tst-alignmod2 \
-		$(modules-execstack-$(have-z-execstack)) \
-		tst-dlopenrpathmod tst-deep1mod1 tst-deep1mod2 tst-deep1mod3 \
-		tst-dlmopen1mod tst-auditmod1 \
-		unload3mod1 unload3mod2 unload3mod3 unload3mod4 \
-		unload4mod1 unload4mod2 unload4mod3 unload4mod4 \
-		unload6mod1 unload6mod2 unload6mod3 \
-		unload7mod1 unload7mod2 \
-		unload8mod1 unload8mod1x unload8mod2 unload8mod3 \
-		order2mod1 order2mod2 order2mod3 order2mod4 \
-		tst-unique1mod1 tst-unique1mod2 \
-		tst-unique2mod1 tst-unique2mod2 \
-		tst-auditmod9a tst-auditmod9b \
-		$(if $(CXX),tst-unique3lib tst-unique3lib2 tst-unique4lib \
-		  tst-nodelete-uniquemod tst-nodelete-rtldmod \
-		  tst-nodelete-zmod) \
-		tst-initordera1 tst-initorderb1 \
-		tst-initordera2 tst-initorderb2 \
-		tst-initordera3 tst-initordera4 \
-		tst-initorder2a tst-initorder2b tst-initorder2c \
-		tst-initorder2d \
-		tst-relsort1mod1 tst-relsort1mod2 tst-array2dep \
-		tst-array5dep tst-null-argv-lib \
-		tst-tlsalign-lib tst-nodelete-opened-lib tst-nodelete2mod \
-		tst-audit11mod1 tst-audit11mod2 tst-auditmod11 \
-		tst-audit12mod1 tst-audit12mod2 tst-audit12mod3 tst-auditmod12 \
-		tst-latepthreadmod $(tst-tls-many-dynamic-modules) \
-		tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin
-ifeq (yes,$(have-mtls-dialect-gnu2))
-tests += tst-gnu2-tls1
-modules-names += tst-gnu2-tls1mod
-$(objpfx)tst-gnu2-tls1: $(objpfx)tst-gnu2-tls1mod.so
-tst-gnu2-tls1mod.so-no-z-defs = yes
-CFLAGS-tst-gnu2-tls1mod.c += -mtls-dialect=gnu2
-endif
-ifeq (yes,$(have-protected-data))
-modules-names += tst-protected1moda tst-protected1modb
-tests += tst-protected1a tst-protected1b
-$(objpfx)tst-protected1a: $(addprefix $(objpfx),tst-protected1moda.so tst-protected1modb.so)
-$(objpfx)tst-protected1b: $(addprefix $(objpfx),tst-protected1modb.so tst-protected1moda.so)
-tst-protected1modb.so-no-z-defs = yes
-# These tests fail with GCC versions prior to 5.1 and with some versions
-# of binutils.  See https://sourceware.org/bugzilla/show_bug.cgi?id=17709
-# and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248 for details.
-# Perhaps in future we can make these XFAILs conditional on some detection
-# of compiler/linker behavior/version.
-test-xfail-tst-protected1a = yes
-test-xfail-tst-protected1b = yes
-endif
-ifeq (yesyes,$(have-fpie)$(build-shared))
-modules-names += tst-piemod1
-tests += tst-pie1 tst-pie2
-tests-pie += tst-pie1 tst-pie2
-tests += vismain
-tests-pie += vismain
-CFLAGS-vismain.c = $(PIE-ccflag)
-endif
-modules-execstack-yes = tst-execstack-mod
-extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
-
-# filtmod1.so has a special rule
-modules-names-nobuild := filtmod1
-
-tests += $(tests-static)
-
-ifneq (no,$(multi-arch))
-tests-ifuncstatic := ifuncmain1static ifuncmain1picstatic \
-		ifuncmain2static ifuncmain2picstatic \
-		ifuncmain4static ifuncmain4picstatic \
-		ifuncmain5static ifuncmain5picstatic \
-		ifuncmain7static ifuncmain7picstatic
-tests-static += $(tests-ifuncstatic)
-tests-internal += $(tests-ifuncstatic)
-ifeq (yes,$(build-shared))
-tests-internal += \
-	 ifuncmain1 ifuncmain1pic ifuncmain1vis ifuncmain1vispic \
-	 ifuncmain1staticpic \
-	 ifuncmain2 ifuncmain2pic ifuncmain3 ifuncmain4 \
-	 ifuncmain5 ifuncmain5pic ifuncmain5staticpic \
-	 ifuncmain7 ifuncmain7pic
-ifunc-test-modules = ifuncdep1 ifuncdep1pic ifuncdep2 ifuncdep2pic \
-		     ifuncdep5 ifuncdep5pic
-extra-test-objs += $(ifunc-test-modules:=.o)
-test-internal-extras += $(ifunc-test-modules)
-ifeq (yes,$(have-fpie))
-ifunc-pie-tests = ifuncmain1pie ifuncmain1vispie ifuncmain1staticpie \
-		  ifuncmain5pie ifuncmain6pie ifuncmain7pie
-tests-internal += $(ifunc-pie-tests)
-tests-pie += $(ifunc-pie-tests)
-endif
-modules-names += ifuncmod1 ifuncmod3 ifuncmod5 ifuncmod6
-endif
-endif
-
-ifeq (yes,$(build-shared))
-ifeq ($(run-built-tests),yes)
-tests-special += $(objpfx)tst-pathopt.out $(objpfx)tst-rtld-load-self.out
-endif
-tests-special += $(objpfx)check-textrel.out $(objpfx)check-execstack.out \
-		 $(objpfx)check-localplt.out
-endif
-
-ifeq ($(run-built-tests),yes)
-tests-special += $(objpfx)order-cmp.out $(objpfx)tst-array1-cmp.out \
-		 $(objpfx)tst-array1-static-cmp.out \
-		 $(objpfx)tst-array2-cmp.out $(objpfx)tst-array3-cmp.out \
-		 $(objpfx)tst-array4-cmp.out $(objpfx)tst-array5-cmp.out \
-		 $(objpfx)tst-array5-static-cmp.out $(objpfx)order2-cmp.out \
-		 $(objpfx)tst-initorder-cmp.out \
-		 $(objpfx)tst-initorder2-cmp.out $(objpfx)tst-unused-dep.out \
-		 $(objpfx)tst-unused-dep-cmp.out
-endif
-
-check-abi: $(objpfx)check-abi-ld.out
-tests-special += $(objpfx)check-abi-ld.out
-update-abi: update-abi-ld
-update-all-abi: update-all-abi-ld
-
-ifeq ($(have-glob-dat-reloc),yes)
-tests += tst-prelink
-ifeq ($(run-built-tests),yes)
-tests-special += $(objpfx)tst-prelink-cmp.out
-endif
-endif
-
-# The test requires shared _and_ PIE because the executable
-# unit test driver must be able to link with the shared object
-# that is going to eventually go into an installed DSO.
-ifeq (yesyes,$(have-fpie)$(build-shared))
-tests-internal += tst-_dl_addr_inside_object
-tests-pie += tst-_dl_addr_inside_object
-$(objpfx)tst-_dl_addr_inside_object: $(objpfx)dl-addr-obj.os
-CFLAGS-tst-_dl_addr_inside_object.c += $(PIE-ccflag)
-endif
-
-# By default tst-linkall-static should try to use crypt routines to test
-# static libcrypt use.
-CFLAGS-tst-linkall-static.c = -DUSE_CRYPT=1
-# However, if we are using NSS crypto and we don't have a static
-# library, then we exclude the use of crypt functions in the test.
-# We similarly exclude libcrypt.a from the static link (see below).
-ifeq (yesno,$(nss-crypt)$(static-nss-crypt))
-CFLAGS-tst-linkall-static.c = -DUSE_CRYPT=0
-endif
-
-include ../Rules
-
-ifeq (yes,$(build-shared))
-# Make sure these things are built in the `make lib' pass so they can be used
-# to run programs during the `make others' pass.
-lib-noranlib: $(objpfx)$(rtld-installed-name) \
-	      $(addprefix $(objpfx),$(extra-objs))
-endif
-
-# Command to link into a larger single relocatable object.
-reloc-link = $(LINK.o) -nostdlib -nostartfiles -r
-
-$(objpfx)sotruss-lib.so: $(shlib-lds)
-
-$(objpfx)dl-allobjs.os: $(all-rtld-routines:%=$(objpfx)%.os)
-	$(reloc-link) -o $@ $^
-
-# Link together the dynamic linker into a single relocatable object.
-# First we do a link against libc_pic.a just to get a link map,
-# and discard the object produced by that link.  From the link map
-# we can glean all the libc modules that need to go into the dynamic
-# linker.  Then we do a recursive make that goes into all the subdirs
-# those modules come from and builds special rtld-foo.os versions that
-# are compiled with special flags, and puts these modules into rtld-libc.a
-# for us.  Then we do the real link using rtld-libc.a instead of libc_pic.a.
-
-# If the compiler can do SSP, build the mapfile with dummy __stack_chk_fail
-# and __stack_chk_fail_local symbols defined, to prevent the real things
-# being dragged into rtld even though rtld is never built with stack-
-# protection.
-
-ifeq ($(have-ssp),yes)
-dummy-stack-chk-fail := -Wl,--defsym='__stack_chk_fail=0' \
-			-Wl,--defsym='__stack_chk_fail_local=0'
-else
-dummy-stack-chk-fail :=
-endif
-
-$(objpfx)librtld.map: $(objpfx)dl-allobjs.os $(common-objpfx)libc_pic.a
-	@-rm -f $@T
-	$(reloc-link) -o $@.o $(dummy-stack-chk-fail) \
-		'-Wl,-(' $^ -lgcc '-Wl,-)' -Wl,-Map,$@T
-	rm -f $@.o
-	mv -f $@T $@
-
-$(objpfx)librtld.mk: $(objpfx)librtld.map Makefile
-	LC_ALL=C \
-	sed -n 's@^$(common-objpfx)\([^(]*\)(\([^)]*\.os\)) *.*$$@\1 \2@p' \
-	    $< | \
-	while read lib file; do \
-	  case $$lib in \
-	  libc_pic.a) \
-	    LC_ALL=C fgrep -l /$$file \
-		  $(common-objpfx)stamp.os $(common-objpfx)*/stamp.os | \
-	    LC_ALL=C \
-	    sed 's@^$(common-objpfx)\([^/]*\)/stamp\.os$$@rtld-\1'" +=$$file@"\
-	    ;; \
-	  */*.a) \
-	    echo rtld-$${lib%%/*} += $$file ;; \
-	  *) echo "Wasn't expecting $$lib($$file)" >&2; exit 1 ;; \
-	  esac; \
-	done > $@T
-	echo rtld-subdirs = `LC_ALL=C sed 's/^rtld-\([^ ]*\).*$$/\1/' $@T \
-			     | LC_ALL=C sort -u` >> $@T
-	mv -f $@T $@
-
-$(objpfx)rtld-libc.a: $(objpfx)librtld.mk FORCE
-	$(MAKE) -f $< -f rtld-Rules
-
-$(objpfx)librtld.os: $(objpfx)dl-allobjs.os $(objpfx)rtld-libc.a
-	$(LINK.o) -nostdlib -nostartfiles -r -o $@ '-Wl,-(' $^ -lgcc '-Wl,-)' \
-		  -Wl,-Map,$@.map
-
-generated += librtld.map librtld.mk rtld-libc.a librtld.os.map
-
-z-now-yes = -Wl,-z,now
-
-$(objpfx)ld.so: $(objpfx)librtld.os $(ld-map)
-# Link into a temporary file so that we don't touch $@ at all
-# if the sanity check below fails.
-	$(LINK.o) -nostdlib -nostartfiles -shared -o $@.new		\
-		  $(LDFLAGS-rtld) -Wl,-z,defs $(z-now-$(bind-now))	\
-		  $(filter-out $(map-file),$^) $(load-map-file)		\
-		  -Wl,-soname=$(rtld-installed-name)			\
-		  -Wl,-defsym=_begin=0
-	$(call after-link,$@.new)
-	$(READELF) -s $@.new \
-	  | $(AWK) '($$7 ~ /^UND(|EF)$$/ && $$1 != "0:" && $$4 != "REGISTER") { print; p=1 } END { exit p != 0 }'
-	mv -f $@.new $@
-
-ifeq (yes,$(build-shared))
-# interp.c exists just to get the runtime linker path into libc.so.
-$(objpfx)interp.os: $(common-objpfx)runtime-linker.h
-endif
-
-ifneq (ld.so,$(rtld-installed-name))
-# Make sure ld.so.1 exists in the build directory so we can link
-# against it.
-$(objpfx)$(rtld-installed-name): $(objpfx)ld.so
-	$(make-link)
-generated += $(rtld-installed-name)
-endif
-
-# Build a file mentioning all trustworthy directories to look for shared
-# libraries when using LD_LIBRARY_PATH in a setuid program.  The user can
-# add directories to the list by defining $(user-defined-trusted-dirs)
-# before starting make.
-$(objpfx)trusted-dirs.h: $(objpfx)trusted-dirs.st; @:
-$(objpfx)trusted-dirs.st: Makefile $(..)Makeconfig
-	$(make-target-directory)
-	echo "$(subst :, ,$(default-rpath) $(user-defined-trusted-dirs))"    \
-	| $(AWK) -f gen-trusted-dirs.awk > ${@:st=T};
-	echo '#define DL_DST_LIB "$(notdir $(slibdir))"' >> ${@:st=T}
-	$(move-if-change) ${@:st=T} ${@:st=h}
-	touch $@
-CPPFLAGS-dl-load.c = -I$(objpfx). -I$(csu-objpfx).
-
-ifeq (yes,$(build-shared))
-$(inst_slibdir)/$(rtld-version-installed-name): $(objpfx)ld.so $(+force)
-	$(make-target-directory)
-	$(do-install-program)
-
-$(inst_rtlddir)/$(rtld-installed-name): \
-  $(inst_slibdir)/$(rtld-version-installed-name) \
-  $(inst_slibdir)/libc-$(version).so
-	$(make-target-directory)
-	$(make-shlib-link)
-
-# Special target called by parent to install just the dynamic linker.
-.PHONY: ldso_install
-ldso_install: $(inst_rtlddir)/$(rtld-installed-name)
-endif
-
-
-ldd-rewrite = -e 's%@RTLD@%$(rtlddir)/$(rtld-installed-name)%g' \
-	      -e 's%@VERSION@%$(version)%g' \
-	      -e 's|@PKGVERSION@|$(PKGVERSION)|g' \
-	      -e 's|@REPORT_BUGS_TO@|$(REPORT_BUGS_TO)|g' \
-	      -e 's%@BASH@%$(BASH)%g' \
-	      -e 's%@TEXTDOMAINDIR@%$(localedir)%g'
-
-ifeq ($(ldd-rewrite-script),no)
-define gen-ldd
-LC_ALL=C sed $(ldd-rewrite) < $< > $@.new
-endef
-else
-define gen-ldd
-LC_ALL=C sed $(ldd-rewrite) < $< \
-| LC_ALL=C sed -f $(patsubst $(..)/%,/%,$(..)$(ldd-rewrite-script)) > $@.new
-endef
-endif
-
-$(objpfx)ldd: ldd.bash.in $(common-objpfx)soversions.mk \
-	      $(common-objpfx)config.make
-	$(gen-ldd)
-	chmod 555 $@.new
-	mv -f $@.new $@
-
-$(objpfx)sprof: $(libdl)
-
-$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o)
-
-$(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o)
-
-SYSCONF-FLAGS := -D'SYSCONFDIR="$(sysconfdir)"'
-CFLAGS-ldconfig.c = $(SYSCONF-FLAGS) -D'LIBDIR="$(libdir)"' \
-		    -D'SLIBDIR="$(slibdir)"'
-libof-ldconfig = ldconfig
-CFLAGS-dl-cache.c = $(SYSCONF-FLAGS)
-CFLAGS-cache.c = $(SYSCONF-FLAGS)
-CFLAGS-rtld.c = $(SYSCONF-FLAGS)
-
-cpp-srcs-left := $(all-rtld-routines:=.os)
-lib := rtld
-include $(patsubst %,$(..)libof-iterator.mk,$(cpp-srcs-left))
-
-test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(strip $(modules-names))))
-generated += $(addsuffix .so,$(strip $(modules-names)))
-
-$(objpfx)testobj1.so: $(libdl)
-$(objpfx)testobj1_1.so: $(objpfx)testobj1.so $(libdl)
-$(objpfx)testobj2.so: $(objpfx)testobj1.so $(libdl)
-$(objpfx)testobj3.so: $(libdl)
-$(objpfx)testobj4.so: $(libdl)
-$(objpfx)testobj5.so: $(libdl)
-$(objpfx)testobj6.so: $(objpfx)testobj1.so $(objpfx)testobj2.so $(libdl)
-$(objpfx)failobj.so: $(objpfx)testobj6.so
-$(objpfx)dep1.so: $(objpfx)dep2.so $(objpfx)dep4.so
-$(objpfx)dep2.so: $(objpfx)dep3.so $(objpfx)dep4.so
-$(objpfx)dep4.so: $(objpfx)dep3.so
-$(objpfx)nodelmod3.so: $(objpfx)nodelmod4.so
-$(objpfx)nextmod1.so: $(libdl)
-$(objpfx)neededobj1.so: $(libdl)
-$(objpfx)neededobj2.so: $(objpfx)neededobj1.so $(libdl)
-$(objpfx)neededobj3.so: $(objpfx)neededobj1.so $(objpfx)neededobj2.so $(libdl)
-$(objpfx)neededobj4.so: $(objpfx)neededobj1.so $(objpfx)neededobj2.so \
-			$(objpfx)neededobj3.so $(libdl)
-$(objpfx)neededobj6.so: $(objpfx)neededobj5.so
-$(objpfx)unload2mod.so: $(objpfx)unload2dep.so
-$(objpfx)ltglobmod2.so: $(libdl)
-$(objpfx)firstobj.so: $(shared-thread-library)
-$(objpfx)globalmod1.so: $(libdl)
-$(objpfx)reldep4mod1.so: $(objpfx)reldep4mod3.so
-$(objpfx)reldep4mod2.so: $(objpfx)reldep4mod4.so
-$(objpfx)dblloadmod1.so: $(objpfx)dblloadmod3.so
-$(objpfx)dblloadmod2.so: $(objpfx)dblloadmod3.so
-$(objpfx)reldepmod5.so: $(objpfx)reldepmod2.so
-$(objpfx)reldepmod6.so: $(objpfx)reldepmod2.so
-$(objpfx)reldep6mod1.so: $(objpfx)reldep6mod0.so
-$(objpfx)reldep6mod2.so: $(objpfx)reldep6mod1.so
-$(objpfx)reldep6mod3.so: $(objpfx)reldep6mod2.so
-$(objpfx)reldep6mod4.so: $(objpfx)reldep6mod1.so
-$(objpfx)tst-tlsmod3.so: $(objpfx)tst-tlsmod2.so
-$(objpfx)tst-tlsmod8.so: $(objpfx)tst-tlsmod7.so
-$(objpfx)tst-tlsmod10.so: $(objpfx)tst-tlsmod9.so
-$(objpfx)tst-tlsmod12.so: $(objpfx)tst-tlsmod11.so
-$(objpfx)tst-tlsmod13a.so: $(objpfx)tst-tlsmod13.so
-# For tst-tls9-static, make sure the modules it dlopens have libc.so in DT_NEEDED
-$(objpfx)tst-tlsmod5.so: $(common-objpfx)libc.so
-$(objpfx)tst-tlsmod6.so: $(common-objpfx)libc.so
-$(objpfx)tst-tls19mod1.so: $(objpfx)tst-tls19mod2.so $(objpfx)tst-tls19mod3.so
-$(objpfx)tst-tls19mod3.so: $(objpfx)ld.so
-$(objpfx)reldep8mod3.so: $(objpfx)reldep8mod1.so $(objpfx)reldep8mod2.so
-$(objpfx)nodel2mod3.so: $(objpfx)nodel2mod1.so $(objpfx)nodel2mod2.so
-$(objpfx)reldep9mod2.so: $(objpfx)reldep9mod1.so
-$(objpfx)reldep9mod3.so: $(objpfx)reldep9mod1.so $(objpfx)reldep9mod2.so
-$(objpfx)unload3mod1.so: $(objpfx)unload3mod3.so
-$(objpfx)unload3mod2.so: $(objpfx)unload3mod3.so
-$(objpfx)unload3mod3.so: $(objpfx)unload3mod4.so
-$(objpfx)unload4mod1.so: $(objpfx)unload4mod2.so $(objpfx)unload4mod3.so
-$(objpfx)unload4mod2.so: $(objpfx)unload4mod4.so $(objpfx)unload4mod3.so
-$(objpfx)unload6mod1.so: $(libdl)
-$(objpfx)unload6mod2.so: $(libdl)
-$(objpfx)unload6mod3.so: $(libdl)
-$(objpfx)unload7mod1.so: $(libdl)
-$(objpfx)unload7mod2.so: $(objpfx)unload7mod1.so
-$(objpfx)unload8mod1.so: $(objpfx)unload8mod2.so
-$(objpfx)unload8mod2.so: $(objpfx)unload8mod3.so
-$(objpfx)unload8mod3.so: $(libdl)
-$(objpfx)tst-initordera2.so: $(objpfx)tst-initordera1.so
-$(objpfx)tst-initorderb2.so: $(objpfx)tst-initorderb1.so $(objpfx)tst-initordera2.so
-$(objpfx)tst-initordera3.so: $(objpfx)tst-initorderb2.so $(objpfx)tst-initorderb1.so
-$(objpfx)tst-initordera4.so: $(objpfx)tst-initordera3.so
-$(objpfx)tst-initorder: $(objpfx)tst-initordera4.so $(objpfx)tst-initordera1.so $(objpfx)tst-initorderb2.so
-$(objpfx)tst-null-argv: $(objpfx)tst-null-argv-lib.so
-$(objpfx)tst-tlsalign: $(objpfx)tst-tlsalign-lib.so
-$(objpfx)tst-nodelete-opened.out: $(objpfx)tst-nodelete-opened-lib.so
-$(objpfx)tst-nodelete-opened: $(libdl)
-$(objpfx)tst-noload: $(libdl)
-
-$(objpfx)tst-tlsalign-extern: $(objpfx)tst-tlsalign-vars.o
-$(objpfx)tst-tlsalign-extern-static: $(objpfx)tst-tlsalign-vars.o
-
-tst-null-argv-ENV = LD_DEBUG=all LD_DEBUG_OUTPUT=$(objpfx)tst-null-argv.debug.out
-LDFLAGS-nodel2mod3.so = $(no-as-needed)
-LDFLAGS-reldepmod5.so = $(no-as-needed)
-LDFLAGS-reldep6mod1.so = $(no-as-needed)
-LDFLAGS-reldep6mod4.so = $(no-as-needed)
-LDFLAGS-reldep8mod3.so = $(no-as-needed)
-LDFLAGS-unload4mod1.so = $(no-as-needed)
-LDFLAGS-unload4mod2.so = $(no-as-needed)
-LDFLAGS-tst-initorder = $(no-as-needed)
-LDFLAGS-tst-initordera2.so = $(no-as-needed)
-LDFLAGS-tst-initordera3.so = $(no-as-needed)
-LDFLAGS-tst-initordera4.so = $(no-as-needed)
-LDFLAGS-tst-initorderb2.so = $(no-as-needed)
-LDFLAGS-tst-tlsmod5.so = -nostdlib $(no-as-needed)
-LDFLAGS-tst-tlsmod6.so = -nostdlib $(no-as-needed)
-
-testobj1.so-no-z-defs = yes
-testobj3.so-no-z-defs = yes
-testobj4.so-no-z-defs = yes
-testobj5.so-no-z-defs = yes
-testobj6.so-no-z-defs = yes
-failobj.so-no-z-defs = yes
-constload2.so-no-z-defs = yes
-constload3.so-no-z-defs = yes
-nodelmod1.so-no-z-defs = yes
-nodelmod2.so-no-z-defs = yes
-nodelmod4.so-no-z-defs = yes
-nodel2mod2.so-no-z-defs = yes
-reldepmod2.so-no-z-defs = yes
-reldepmod3.so-no-z-defs = yes
-reldepmod4.so-no-z-defs = yes
-reldep4mod4.so-no-z-defs = yes
-reldep4mod2.so-no-z-defs = yes
-ltglobmod2.so-no-z-defs = yes
-dblloadmod3.so-no-z-defs = yes
-tst-tlsmod1.so-no-z-defs = yes
-tst-tlsmod2.so-no-z-defs = yes
-tst-tlsmod3.so-no-z-defs = yes
-tst-tlsmod4.so-no-z-defs = yes
-tst-tlsmod7.so-no-z-defs = yes
-tst-tlsmod8.so-no-z-defs = yes
-tst-tlsmod9.so-no-z-defs = yes
-tst-tlsmod10.so-no-z-defs = yes
-tst-tlsmod12.so-no-z-defs = yes
-tst-tlsmod14a.so-no-z-defs = yes
-tst-tlsmod14b.so-no-z-defs = yes
-tst-tlsmod15a.so-no-z-defs = yes
-tst-tlsmod16b.so-no-z-defs = yes
-circlemod2.so-no-z-defs = yes
-circlemod3.so-no-z-defs = yes
-circlemod3a.so-no-z-defs = yes
-reldep8mod2.so-no-z-defs = yes
-reldep9mod1.so-no-z-defs = yes
-unload3mod4.so-no-z-defs = yes
-unload4mod1.so-no-z-defs = yes
-ifuncmod1.so-no-z-defs = yes
-ifuncmod5.so-no-z-defs = yes
-ifuncmod6.so-no-z-defs = yes
-tst-auditmod9a.so-no-z-defs = yes
-tst-auditmod9b.so-no-z-defs = yes
-tst-nodelete-uniquemod.so-no-z-defs = yes
-tst-nodelete-rtldmod.so-no-z-defs = yes
-tst-nodelete-zmod.so-no-z-defs = yes
-tst-nodelete2mod.so-no-z-defs = yes
-
-ifeq ($(build-shared),yes)
-# Build all the modules even when not actually running test programs.
-tests: $(test-modules)
-endif
-
-$(objpfx)loadtest: $(libdl)
-LDFLAGS-loadtest = -rdynamic
-
-$(objpfx)loadtest.out: $(test-modules)
-
-$(objpfx)neededtest: $(libdl)
-$(objpfx)neededtest.out: $(objpfx)neededobj1.so $(objpfx)neededobj2.so \
-			 $(objpfx)neededobj3.so
-
-$(objpfx)neededtest2: $(libdl)
-$(objpfx)neededtest2.out: $(objpfx)neededobj1.so $(objpfx)neededobj2.so \
-			  $(objpfx)neededobj3.so
-
-$(objpfx)neededtest3: $(libdl)
-$(objpfx)neededtest3.out: $(objpfx)neededobj1.so $(objpfx)neededobj2.so \
-			  $(objpfx)neededobj3.so $(objpfx)neededobj4.so
-
-$(objpfx)neededtest4: $(libdl) $(objpfx)neededobj1.so
-$(objpfx)neededtest4.out: $(objpfx)neededobj5.so $(objpfx)neededobj6.so
-
-$(objpfx)restest1: $(objpfx)testobj1.so $(objpfx)testobj1_1.so $(libdl)
-LDFLAGS-restest1 = -rdynamic
-
-$(objpfx)restest2: $(libdl)
-LDFLAGS-restest2 = -rdynamic
-
-$(objpfx)restest1.out: $(test-modules)
-
-preloadtest-preloads = testobj1 testobj2 testobj3 testobj4 testobj5
-$(objpfx)preloadtest: $(objpfx)testobj6.so
-LDFLAGS-preloadtest = -rdynamic
-$(objpfx)preloadtest.out: $(preloadtest-preloads:%=$(objpfx)%.so)
-preloadtest-ENV = \
-  LD_PRELOAD=$(subst $(empty) ,:,$(strip $(preloadtest-preloads:=.so)))
-
-$(objpfx)loadfail: $(libdl)
-LDFLAGS-loadfail = -rdynamic
-
-$(objpfx)loadfail.out: $(objpfx)failobj.so
-
-$(objpfx)multiload: $(libdl)
-LDFLAGS-multiload = -rdynamic
-CFLAGS-multiload.c = -DOBJDIR=\"$(elf-objpfx)\"
-
-$(objpfx)multiload.out: $(objpfx)testobj1.so
-
-$(objpfx)origtest: $(libdl)
-LDFLAGS-origtest = -rdynamic
-$(objpfx)origtest.out: $(objpfx)testobj1.so
-
-ifeq ($(have-thread-library),yes)
-$(objpfx)resolvfail: $(libdl) $(shared-thread-library)
-else
-$(objpfx)resolvfail: $(libdl)
-endif
-
-$(objpfx)constload1: $(libdl)
-$(objpfx)constload1.out: $(objpfx)constload2.so $(objpfx)constload3.so
-
-$(objpfx)circleload1: $(libdl)
-$(objpfx)circleload1.out: $(objpfx)circlemod1.so \
-			  $(objpfx)circlemod1a.so
-
-$(objpfx)circlemod1.so: $(objpfx)circlemod2.so
-$(objpfx)circlemod2.so: $(objpfx)circlemod3.so
-$(objpfx)circlemod1a.so: $(objpfx)circlemod2a.so
-$(objpfx)circlemod2a.so: $(objpfx)circlemod3a.so
-
-$(objpfx)order: $(addprefix $(objpfx),dep4.so dep3.so dep2.so dep1.so)
-
-$(objpfx)order-cmp.out: $(objpfx)order.out
-	(echo "0123456789" | cmp $< -) > $@; \
-	$(evaluate-test)
-
-$(objpfx)vismain: $(addprefix $(objpfx),vismod1.so vismod2.so)
-$(objpfx)vismain.out: $(addprefix $(objpfx),vismod3.so)
-vismain-ENV = LD_PRELOAD=$(addprefix $(objpfx),vismod3.so)
-
-$(objpfx)noload: $(objpfx)testobj1.so $(libdl)
-LDFLAGS-noload = -rdynamic $(no-as-needed)
-$(objpfx)noload.out: $(objpfx)testobj5.so
-
-$(objpfx)noload-mem.out: $(objpfx)noload.out
-	$(common-objpfx)malloc/mtrace $(objpfx)noload.mtrace > $@; \
-	$(evaluate-test)
-noload-ENV = MALLOC_TRACE=$(objpfx)noload.mtrace
-
-LDFLAGS-nodelete = -rdynamic
-LDFLAGS-nodelmod1.so = -Wl,--enable-new-dtags,-z,nodelete
-LDFLAGS-nodelmod4.so = -Wl,--enable-new-dtags,-z,nodelete
-$(objpfx)nodelete: $(libdl)
-$(objpfx)nodelete.out: $(objpfx)nodelmod1.so $(objpfx)nodelmod2.so \
-		       $(objpfx)nodelmod3.so
-
-LDFLAGS-nodlopenmod.so = -Wl,--enable-new-dtags,-z,nodlopen
-$(objpfx)nodlopen: $(libdl)
-$(objpfx)nodlopen.out: $(objpfx)nodlopenmod.so
-
-$(objpfx)nodlopenmod2.so: $(objpfx)nodlopenmod.so
-$(objpfx)nodlopen2: $(libdl)
-$(objpfx)nodlopen2.out: $(objpfx)nodlopenmod2.so
-
-$(objpfx)filtmod1.so: $(objpfx)filtmod1.os $(objpfx)filtmod2.so
-	$(LINK.o) -shared -o $@ -B$(csu-objpfx) $(LDFLAGS.so) \
-		  -L$(subst :, -L,$(rpath-link)) \
-		  -Wl,-rpath-link=$(rpath-link) \
-		  $< -Wl,-F,$(objpfx)filtmod2.so
-$(objpfx)filter: $(objpfx)filtmod1.so
-
-# This does not link against libc.
-CFLAGS-filtmod1.c = $(no-stack-protector)
-
-$(objpfx)unload: $(libdl)
-$(objpfx)unload.out: $(objpfx)unloadmod.so
-
-$(objpfx)reldep: $(libdl)
-$(objpfx)reldep.out: $(objpfx)reldepmod1.so $(objpfx)reldepmod2.so
-
-$(objpfx)reldep2: $(libdl)
-$(objpfx)reldep2.out: $(objpfx)reldepmod1.so $(objpfx)reldepmod3.so
-
-$(objpfx)reldep3: $(libdl)
-$(objpfx)reldep3.out: $(objpfx)reldepmod1.so $(objpfx)reldepmod4.so
-
-$(objpfx)reldep4: $(libdl)
-$(objpfx)reldep4.out: $(objpfx)reldep4mod1.so $(objpfx)reldep4mod2.so
-
-$(objpfx)next: $(objpfx)nextmod1.so $(objpfx)nextmod2.so $(libdl)
-LDFLAGS-next = $(no-as-needed)
-
-$(objpfx)unload2: $(libdl)
-$(objpfx)unload2.out: $(objpfx)unload2mod.so $(objpfx)unload2dep.so
-
-$(objpfx)lateglobal: $(libdl)
-$(objpfx)lateglobal.out: $(objpfx)ltglobmod1.so $(objpfx)ltglobmod2.so
-
-$(objpfx)tst-pathopt: $(libdl)
-$(objpfx)tst-pathopt.out: tst-pathopt.sh $(objpfx)tst-pathopt \
-			  $(objpfx)pathoptobj.so
-	$(SHELL) $< $(common-objpfx) '$(test-wrapper-env)' \
-		 '$(run-program-env)'; \
-	$(evaluate-test)
-
-$(objpfx)tst-rtld-load-self.out: tst-rtld-load-self.sh $(objpfx)ld.so
-	$(SHELL) $^ '$(test-wrapper)' '$(test-wrapper-env)' > $@; \
-	$(evaluate-test)
-
-$(objpfx)initfirst: $(libdl)
-$(objpfx)initfirst.out: $(objpfx)firstobj.so
-
-$(objpfx)global: $(objpfx)globalmod1.so
-$(objpfx)global.out: $(objpfx)reldepmod1.so
-
-$(objpfx)dblload: $(libdl)
-$(objpfx)dblload.out: $(objpfx)dblloadmod1.so $(objpfx)dblloadmod2.so
-
-$(objpfx)dblunload: $(libdl)
-$(objpfx)dblunload.out: $(objpfx)dblloadmod1.so $(objpfx)dblloadmod2.so
-
-$(objpfx)reldep5: $(libdl)
-$(objpfx)reldep5.out: $(objpfx)reldepmod5.so $(objpfx)reldepmod6.so
-
-$(objpfx)reldep6: $(libdl)
-$(objpfx)reldep6.out: $(objpfx)reldep6mod3.so $(objpfx)reldep6mod4.so
-
-$(objpfx)reldep7: $(libdl)
-$(objpfx)reldep7.out: $(objpfx)reldep7mod1.so $(objpfx)reldep7mod2.so
-
-$(objpfx)reldep8: $(libdl)
-$(objpfx)reldep8.out: $(objpfx)reldep8mod3.so
-
-LDFLAGS-nodel2mod2.so = -Wl,--enable-new-dtags,-z,nodelete
-$(objpfx)nodelete2: $(libdl)
-$(objpfx)nodelete2.out: $(objpfx)nodel2mod3.so
-
-$(objpfx)reldep9: $(libdl)
-$(objpfx)reldep9.out: $(objpfx)reldep9mod3.so
-
-$(objpfx)tst-tls3: $(objpfx)tst-tlsmod1.so
-
-$(objpfx)tst-tls4: $(libdl)
-$(objpfx)tst-tls4.out: $(objpfx)tst-tlsmod2.so
-
-$(objpfx)tst-tls5: $(libdl)
-$(objpfx)tst-tls5.out: $(objpfx)tst-tlsmod2.so
-
-$(objpfx)tst-tls6: $(libdl)
-$(objpfx)tst-tls6.out: $(objpfx)tst-tlsmod2.so
-
-$(objpfx)tst-tls7: $(libdl)
-$(objpfx)tst-tls7.out: $(objpfx)tst-tlsmod3.so
-
-$(objpfx)tst-tls8: $(libdl)
-$(objpfx)tst-tls8.out: $(objpfx)tst-tlsmod3.so $(objpfx)tst-tlsmod4.so
-
-$(objpfx)tst-tls9: $(libdl)
-$(objpfx)tst-tls9.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so
-
-$(objpfx)tst-tls10: $(objpfx)tst-tlsmod8.so $(objpfx)tst-tlsmod7.so
-
-$(objpfx)tst-tls11: $(objpfx)tst-tlsmod10.so $(objpfx)tst-tlsmod9.so
-
-$(objpfx)tst-tls12: $(objpfx)tst-tlsmod12.so $(objpfx)tst-tlsmod11.so
-
-$(objpfx)tst-tls13: $(libdl)
-$(objpfx)tst-tls13.out: $(objpfx)tst-tlsmod13a.so
-
-$(objpfx)tst-tls14: $(objpfx)tst-tlsmod14a.so $(libdl)
-$(objpfx)tst-tls14.out: $(objpfx)tst-tlsmod14b.so
-
-$(objpfx)tst-tls15: $(libdl)
-$(objpfx)tst-tls15.out: $(objpfx)tst-tlsmod15a.so $(objpfx)tst-tlsmod15b.so
-
-$(objpfx)tst-tls-dlinfo: $(libdl)
-$(objpfx)tst-tls-dlinfo.out: $(objpfx)tst-tlsmod2.so
-
-
-
-$(objpfx)tst-tls16: $(libdl)
-$(objpfx)tst-tls16.out: $(objpfx)tst-tlsmod16a.so $(objpfx)tst-tlsmod16b.so
-
-$(objpfx)tst-tls17: $(libdl)
-$(objpfx)tst-tls17.out: $(objpfx)tst-tlsmod17b.so
-$(patsubst %,$(objpfx)%.os,$(tlsmod17a-modules)): $(objpfx)tst-tlsmod17a%.os: tst-tlsmod17a.c
-	$(compile-command.c) -DN=$*
-$(patsubst %,$(objpfx)%.so,$(tlsmod17a-modules)): $(objpfx)tst-tlsmod17a%.so: $(objpfx)ld.so
-$(objpfx)tst-tlsmod17b.so: $(patsubst %,$(objpfx)%.so,$(tlsmod17a-modules))
-
-$(objpfx)tst-tls18: $(libdl)
-$(objpfx)tst-tls18.out: $(patsubst %,$(objpfx)%.so,$(tlsmod18a-modules))
-$(patsubst %,$(objpfx)%.os,$(tlsmod18a-modules)): $(objpfx)tst-tlsmod18a%.os : tst-tlsmod18a.c
-	$(compile-command.c) -DN=$*
-$(patsubst %,$(objpfx)%.so,$(tlsmod18a-modules)): $(objpfx)tst-tlsmod18a%.so: $(objpfx)ld.so
-
-$(objpfx)tst-tls19: $(libdl)
-$(objpfx)tst-tls19.out: $(objpfx)tst-tls19mod1.so
-
-CFLAGS-tst-align.c = $(stack-align-test-flags)
-CFLAGS-tst-align2.c = $(stack-align-test-flags)
-CFLAGS-tst-alignmod.c = $(stack-align-test-flags)
-CFLAGS-tst-alignmod2.c = $(stack-align-test-flags)
-$(objpfx)tst-align: $(libdl)
-$(objpfx)tst-align.out: $(objpfx)tst-alignmod.so
-$(objpfx)tst-align2: $(objpfx)tst-alignmod2.so
-
-$(objpfx)unload3: $(libdl)
-$(objpfx)unload3.out: $(objpfx)unload3mod1.so $(objpfx)unload3mod2.so \
-		      $(objpfx)unload3mod3.so $(objpfx)unload3mod4.so
-
-$(objpfx)unload4: $(libdl)
-$(objpfx)unload4.out: $(objpfx)unload4mod1.so $(objpfx)unload4mod3.so
-
-$(objpfx)unload5: $(libdl)
-$(objpfx)unload5.out: $(objpfx)unload3mod1.so $(objpfx)unload3mod2.so \
-		      $(objpfx)unload3mod3.so $(objpfx)unload3mod4.so
-
-$(objpfx)unload6: $(libdl)
-$(objpfx)unload6.out: $(objpfx)unload6mod1.so $(objpfx)unload6mod2.so \
-		      $(objpfx)unload6mod3.so
-
-$(objpfx)unload7: $(libdl)
-$(objpfx)unload7.out: $(objpfx)unload7mod1.so $(objpfx)unload7mod2.so
-unload7-ENV = MALLOC_PERTURB_=85
-
-$(objpfx)unload8: $(libdl)
-$(objpfx)unload8.out: $(objpfx)unload8mod1.so $(objpfx)unload8mod1x.so
-
-ifdef libdl
-$(objpfx)tst-tls9-static: $(common-objpfx)dlfcn/libdl.a
-$(objpfx)tst-tls9-static.out: $(objpfx)tst-tlsmod5.so $(objpfx)tst-tlsmod6.so
-endif
-
-ifeq ($(have-z-execstack),yes)
-$(objpfx)tst-execstack: $(libdl)
-$(objpfx)tst-execstack.out: $(objpfx)tst-execstack-mod.so
-CPPFLAGS-tst-execstack.c = -DUSE_PTHREADS=0
-LDFLAGS-tst-execstack = -Wl,-z,noexecstack
-LDFLAGS-tst-execstack-mod = -Wl,-z,execstack
-
-$(objpfx)tst-execstack-needed: $(objpfx)tst-execstack-mod.so
-LDFLAGS-tst-execstack-needed = -Wl,-z,noexecstack
-
-LDFLAGS-tst-execstack-prog = -Wl,-z,execstack
-CFLAGS-tst-execstack-prog.c += -Wno-trampolines
-CFLAGS-tst-execstack-mod.c += -Wno-trampolines
-endif
-
-LDFLAGS-tst-array2 = $(no-as-needed)
-LDFLAGS-tst-array5 = $(no-as-needed)
-
-$(objpfx)tst-array1-cmp.out: tst-array1.exp $(objpfx)tst-array1.out
-	cmp $^ > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-array1-static-cmp.out: tst-array1.exp \
-				    $(objpfx)tst-array1-static.out
-	cmp $^ > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-array2: $(objpfx)tst-array2dep.so
-$(objpfx)tst-array2-cmp.out: tst-array2.exp $(objpfx)tst-array2.out
-	cmp $^ > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-array3-cmp.out: tst-array1.exp $(objpfx)tst-array3.out
-	cmp $^ > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-array4: $(libdl)
-$(objpfx)tst-array4.out: $(objpfx)tst-array2dep.so
-$(objpfx)tst-array4-cmp.out: tst-array4.exp $(objpfx)tst-array4.out
-	cmp $^ > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-array5: $(objpfx)tst-array5dep.so
-$(objpfx)tst-array5-cmp.out: tst-array5.exp $(objpfx)tst-array5.out
-	cmp $^ > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-array5-static-cmp.out: tst-array5-static.exp \
-				$(objpfx)tst-array5-static.out
-	cmp $^ > $@; \
-	$(evaluate-test)
-
-CFLAGS-tst-pie1.c += $(pie-ccflag)
-CFLAGS-tst-pie2.c += $(pie-ccflag)
-
-$(objpfx)tst-piemod1.so: $(libsupport)
-$(objpfx)tst-pie1: $(objpfx)tst-piemod1.so
-
-ifeq (yes,$(build-shared))
-all-built-dso := $(common-objpfx)elf/ld.so $(common-objpfx)libc.so \
-		 $(filter-out $(common-objpfx)linkobj/libc.so, \
-			      $(sort $(wildcard $(addprefix $(common-objpfx), \
-							    */lib*.so \
-							    iconvdata/*.so))))
-
-$(all-built-dso:=.dyn): %.dyn: %
-	@rm -f $@T
-	LC_ALL=C $(READELF) -W -d $< > $@T
-	test -s $@T
-	mv -f $@T $@
-common-generated += $(all-built-dso:$(common-objpfx)%=%.dyn)
-
-$(objpfx)check-textrel.out: $(..)scripts/check-textrel.awk \
-			    $(all-built-dso:=.dyn)
-	LC_ALL=C $(AWK) -f $^ > $@; \
-	$(evaluate-test)
-generated += check-textrel.out
-
-$(objpfx)execstack-default: $(first-word $(wildcard $(sysdirs:%=%/stackinfo.h)))
-	$(make-target-directory)
-	{ echo '#include <elf.h>'; \
-	  echo '#include <stackinfo.h>'; \
-	  echo '#if (DEFAULT_STACK_PERMS & PF_X) == 0'; \
-	  echo '@@@execstack-no@@@'; \
-	  echo '#else'; \
-	  echo '@@@execstack-yes@@@'; \
-	  echo '#endif'; } | \
-	$(CC) $(CFLAGS) $(CPPFLAGS) -E -x c-header - | \
-	sed -n -e 's/^@@@\(.*\)@@@/\1/p' > $@T
-	mv -f $@T $@
-generated += execstack-default
-
-$(all-built-dso:=.phdr): %.phdr: %
-	@rm -f $@T
-	LC_ALL=C $(READELF) -W -l $< > $@T
-	test -s $@T
-	mv -f $@T $@
-common-generated += $(all-built-dso:$(common-objpfx)%=%.phdr)
-
-$(objpfx)check-execstack.out: $(..)scripts/check-execstack.awk \
-			      $(objpfx)execstack-default \
-			      $(all-built-dso:=.phdr)
-	LC_ALL=C $(AWK) -f $^ > $@; \
-	$(evaluate-test)
-generated += check-execstack.out
-
-$(objpfx)tst-dlmodcount: $(libdl)
-$(objpfx)tst-dlmodcount.out: $(test-modules)
-
-$(all-built-dso:=.jmprel): %.jmprel: % Makefile
-	@rm -f $@T
-	LC_ALL=C $(READELF) -W -S -d -r $< > $@T
-	test -s $@T
-	mv -f $@T $@
-common-generated += $(all-built-dso:$(common-objpfx)%=%.jmprel)
-
-localplt-built-dso := $(addprefix $(common-objpfx),\
-				  libc.so \
-				  elf/ld.so \
-				  math/libm.so \
-				  rt/librt.so \
-				  dlfcn/libdl.so \
-				  resolv/libresolv.so \
-				  crypt/libcrypt.so \
-		       )
-ifeq ($(build-mathvec),yes)
-localplt-built-dso += $(addprefix $(common-objpfx), mathvec/libmvec.so)
-endif
-ifeq ($(have-thread-library),yes)
-localplt-built-dso += $(filter-out %_nonshared.a, $(shared-thread-library))
-endif
-
-vpath localplt.data $(+sysdep_dirs)
-
-$(objpfx)check-localplt.out: $(..)scripts/check-localplt.awk \
-			     $(..)scripts/localplt.awk \
-			     $(localplt-built-dso:=.jmprel) \
-			     localplt.data
-	LC_ALL=C $(AWK) -f $(filter-out $< %localplt.data,$^) | \
-	  LC_ALL=C $(AWK) -f $< $(filter %localplt.data,$^) - \
-	  > $@; \
-	$(evaluate-test)
-endif
-
-$(objpfx)tst-dlopenrpathmod.so: $(libdl)
-$(objpfx)tst-dlopenrpath: $(objpfx)tst-dlopenrpathmod.so $(libdl)
-CFLAGS-tst-dlopenrpath.c += -DPFX=\"$(objpfx)\"
-LDFLAGS-tst-dlopenrpathmod.so += -Wl,-rpath,\$$ORIGIN/test-subdir
-$(objpfx)tst-dlopenrpath.out: $(objpfx)firstobj.so
-
-$(objpfx)tst-deep1mod2.so: $(objpfx)tst-deep1mod3.so
-$(objpfx)tst-deep1: $(libdl) $(objpfx)tst-deep1mod1.so
-$(objpfx)tst-deep1.out: $(objpfx)tst-deep1mod2.so
-LDFLAGS-tst-deep1 += -rdynamic
-tst-deep1mod3.so-no-z-defs = yes
-
-$(objpfx)tst-dlmopen1mod.so: $(libdl)
-$(objpfx)tst-dlmopen1: $(libdl)
-$(objpfx)tst-dlmopen1.out: $(objpfx)tst-dlmopen1mod.so
-
-$(objpfx)tst-dlmopen2: $(libdl)
-$(objpfx)tst-dlmopen2.out: $(objpfx)tst-dlmopen1mod.so
-
-$(objpfx)tst-dlmopen3: $(libdl)
-$(objpfx)tst-dlmopen3.out: $(objpfx)tst-dlmopen1mod.so
-
-$(objpfx)tst-audit1.out: $(objpfx)tst-auditmod1.so
-tst-audit1-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so
-
-$(objpfx)tst-audit2: $(libdl)
-$(objpfx)tst-audit2.out: $(objpfx)tst-auditmod1.so $(objpfx)tst-auditmod9b.so
-# Prevent GCC-5 from translating a malloc/memset pair into calloc
-CFLAGS-tst-audit2.c += -fno-builtin
-tst-audit2-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so
-
-$(objpfx)tst-audit9: $(libdl)
-$(objpfx)tst-audit9.out: $(objpfx)tst-auditmod9a.so $(objpfx)tst-auditmod9b.so
-tst-audit9-ENV = LD_AUDIT=$(objpfx)tst-auditmod9a.so
-
-$(objpfx)tst-audit8: $(libm)
-$(objpfx)tst-audit8.out: $(objpfx)tst-auditmod1.so
-tst-audit8-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so
-
-$(objpfx)tst-global1: $(libdl)
-$(objpfx)tst-global1.out: $(objpfx)testobj6.so $(objpfx)testobj2.so
-
-$(objpfx)order2: $(libdl)
-$(objpfx)order2.out: $(objpfx)order2mod1.so $(objpfx)order2mod2.so
-$(objpfx)order2-cmp.out: $(objpfx)order2.out
-	(echo "12345" | cmp $< -) > $@; \
-	$(evaluate-test)
-$(objpfx)order2mod1.so: $(objpfx)order2mod4.so
-$(objpfx)order2mod4.so: $(objpfx)order2mod3.so
-$(objpfx)order2mod2.so: $(objpfx)order2mod3.so
-order2mod2.so-no-z-defs = yes
-LDFLAGS-order2mod1.so = $(no-as-needed)
-LDFLAGS-order2mod2.so = $(no-as-needed)
-
-tst-stackguard1-ARGS = --command "$(host-test-program-cmd) --child"
-tst-stackguard1-static-ARGS = --command "$(objpfx)tst-stackguard1-static --child"
-
-tst-ptrguard1-ARGS = --command "$(host-test-program-cmd) --child"
-# When built statically, the pointer guard interface uses
-# __pointer_chk_guard_local.
-CFLAGS-tst-ptrguard1-static.c = -DPTRGUARD_LOCAL
-tst-ptrguard1-static-ARGS = --command "$(objpfx)tst-ptrguard1-static --child"
-
-$(objpfx)tst-leaks1: $(libdl)
-$(objpfx)tst-leaks1-mem.out: $(objpfx)tst-leaks1.out
-	$(common-objpfx)malloc/mtrace $(objpfx)tst-leaks1.mtrace > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-leaks1-static: $(common-objpfx)dlfcn/libdl.a
-$(objpfx)tst-leaks1-static-mem.out: $(objpfx)tst-leaks1-static.out
-	$(common-objpfx)malloc/mtrace $(objpfx)tst-leaks1-static.mtrace > $@; \
-	$(evaluate-test)
-
-tst-leaks1-ENV = MALLOC_TRACE=$(objpfx)tst-leaks1.mtrace
-tst-leaks1-static-ENV = MALLOC_TRACE=$(objpfx)tst-leaks1-static.mtrace
-
-$(objpfx)tst-addr1: $(libdl)
-
-$(objpfx)tst-thrlock: $(libdl) $(shared-thread-library)
-$(objpfx)tst-dlopen-aout: $(libdl) $(shared-thread-library)
-
-CFLAGS-ifuncmain1pic.c += $(pic-ccflag)
-CFLAGS-ifuncmain1picstatic.c += $(pic-ccflag)
-CFLAGS-ifuncmain1staticpic.c += $(pic-ccflag)
-CFLAGS-ifuncdep1pic.c += $(pic-ccflag)
-CFLAGS-ifuncmain1vispic.c += $(pic-ccflag)
-CFLAGS-ifuncmain2pic.c += $(pic-ccflag)
-CFLAGS-ifuncmain2picstatic.c += $(pic-ccflag)
-CFLAGS-ifuncdep2pic.c += $(pic-ccflag)
-CFLAGS-ifuncmain4picstatic.c += $(pic-ccflag)
-CFLAGS-ifuncmain5pic.c += $(pic-ccflag)
-CFLAGS-ifuncmain5picstatic.c += $(pic-ccflag)
-CFLAGS-ifuncmain5staticpic.c += $(pic-ccflag)
-CFLAGS-ifuncdep5pic.c += $(pic-ccflag)
-CFLAGS-ifuncmain7pic.c += $(pic-ccflag)
-CFLAGS-ifuncmain7picstatic.c += $(pic-ccflag)
-
-LDFLAGS-ifuncmain3 = -Wl,-export-dynamic
-
-CFLAGS-ifuncmain1pie.c += $(pie-ccflag)
-CFLAGS-ifuncmain1vispie.c += $(pie-ccflag)
-CFLAGS-ifuncmain1staticpie.c += $(pie-ccflag)
-CFLAGS-ifuncmain5pie.c += $(pie-ccflag)
-CFLAGS-ifuncmain6pie.c += $(pie-ccflag)
-CFLAGS-ifuncmain7pie.c += $(pie-ccflag)
-
-$(objpfx)ifuncmain1pie: $(objpfx)ifuncmod1.so
-$(objpfx)ifuncmain1staticpie: $(objpfx)ifuncdep1pic.o
-$(objpfx)ifuncmain1vispie: $(objpfx)ifuncmod1.so
-$(objpfx)ifuncmain5pie: $(objpfx)ifuncmod5.so
-$(objpfx)ifuncmain6pie: $(objpfx)ifuncmod6.so
-
-$(objpfx)ifuncmain1: $(addprefix $(objpfx),ifuncmod1.so)
-$(objpfx)ifuncmain1pic: $(addprefix $(objpfx),ifuncmod1.so)
-$(objpfx)ifuncmain1staticpic: $(addprefix $(objpfx),ifuncdep1pic.o)
-$(objpfx)ifuncmain1static: $(addprefix $(objpfx),ifuncdep1.o)
-$(objpfx)ifuncmain1picstatic: $(addprefix $(objpfx),ifuncdep1pic.o)
-$(objpfx)ifuncmain1vis: $(addprefix $(objpfx),ifuncmod1.so)
-$(objpfx)ifuncmain1vispic: $(addprefix $(objpfx),ifuncmod1.so)
-$(objpfx)ifuncmain2: $(addprefix $(objpfx),ifuncdep2.o)
-$(objpfx)ifuncmain2pic: $(addprefix $(objpfx),ifuncdep2pic.o)
-$(objpfx)ifuncmain2static: $(addprefix $(objpfx),ifuncdep2.o)
-$(objpfx)ifuncmain2picstatic: $(addprefix $(objpfx),ifuncdep2pic.o)
-
-$(objpfx)ifuncmain3: $(libdl)
-$(objpfx)ifuncmain3.out: $(objpfx)ifuncmod3.so
-
-$(objpfx)ifuncmain5: $(addprefix $(objpfx),ifuncmod5.so)
-$(objpfx)ifuncmain5pic: $(addprefix $(objpfx),ifuncmod5.so)
-$(objpfx)ifuncmain5static: $(addprefix $(objpfx),ifuncdep5.o)
-$(objpfx)ifuncmain5staticpic: $(addprefix $(objpfx),ifuncdep5pic.o)
-$(objpfx)ifuncmain5picstatic: $(addprefix $(objpfx),ifuncdep5pic.o)
-
-$(objpfx)tst-unique1: $(libdl)
-$(objpfx)tst-unique1.out: $(objpfx)tst-unique1mod1.so \
-			  $(objpfx)tst-unique1mod2.so
-
-$(objpfx)tst-unique2: $(libdl) $(objpfx)tst-unique2mod1.so
-$(objpfx)tst-unique2.out: $(objpfx)tst-unique2mod2.so
-
-$(objpfx)tst-unique3: $(libdl) $(objpfx)tst-unique3lib.so
-$(objpfx)tst-unique3.out: $(objpfx)tst-unique3lib2.so
-
-$(objpfx)tst-unique4: $(objpfx)tst-unique4lib.so
-
-$(objpfx)tst-nodelete: $(libdl)
-$(objpfx)tst-nodelete.out: $(objpfx)tst-nodelete-uniquemod.so \
-			   $(objpfx)tst-nodelete-rtldmod.so \
-			   $(objpfx)tst-nodelete-zmod.so
-
-LDFLAGS-tst-nodelete = -rdynamic
-LDFLAGS-tst-nodelete-zmod.so = -Wl,--enable-new-dtags,-z,nodelete
-
-$(objpfx)tst-nodelete2: $(libdl)
-$(objpfx)tst-nodelete2.out: $(objpfx)tst-nodelete2mod.so
-
-LDFLAGS-tst-nodelete2 = -rdynamic
-
-$(objpfx)tst-initorder-cmp.out: tst-initorder.exp $(objpfx)tst-initorder.out
-	cmp $^ > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-initorder2: $(objpfx)tst-initorder2a.so $(objpfx)tst-initorder2d.so $(objpfx)tst-initorder2c.so
-$(objpfx)tst-initorder2a.so: $(objpfx)tst-initorder2b.so
-$(objpfx)tst-initorder2b.so: $(objpfx)tst-initorder2c.so
-$(objpfx)tst-initorder2c.so: $(objpfx)tst-initorder2d.so
-LDFLAGS-tst-initorder2 = $(no-as-needed)
-LDFLAGS-tst-initorder2a.so = $(no-as-needed)
-LDFLAGS-tst-initorder2b.so = $(no-as-needed)
-LDFLAGS-tst-initorder2c.so = $(no-as-needed)
-define o-iterator-doit
-$(objpfx)tst-initorder2$o.os: tst-initorder2.c; \
-$$(compile-command.c) -DNAME=\"$o\"
-endef
-object-suffixes-left := a b c d
-include $(o-iterator)
-
-$(objpfx)tst-initorder2-cmp.out: tst-initorder2.exp $(objpfx)tst-initorder2.out
-	cmp $^ > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-relsort1: $(libdl)
-$(objpfx)tst-relsort1mod1.so: $(libm) $(objpfx)tst-relsort1mod2.so
-$(objpfx)tst-relsort1mod2.so: $(libm)
-$(objpfx)tst-relsort1.out: $(objpfx)tst-relsort1mod1.so \
-			   $(objpfx)tst-relsort1mod2.so
-
-$(objpfx)tst-unused-dep.out: $(objpfx)testobj1.so
-	$(test-wrapper-env) \
-	LD_TRACE_LOADED_OBJECTS=1 \
-	LD_DEBUG=unused \
-	LD_PRELOAD= \
-	$(rtld-prefix) \
-	  $< > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-unused-dep-cmp.out: $(objpfx)tst-unused-dep.out
-	cmp $< /dev/null > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-audit11.out: $(objpfx)tst-auditmod11.so $(objpfx)tst-audit11mod1.so
-$(objpfx)tst-audit11: $(libdl)
-tst-audit11-ENV = LD_AUDIT=$(objpfx)tst-auditmod11.so
-$(objpfx)tst-audit11mod1.so: $(objpfx)tst-audit11mod2.so
-LDFLAGS-tst-audit11mod2.so = -Wl,--version-script=tst-audit11mod2.map,-soname,tst-audit11mod2.so
-
-$(objpfx)tst-audit12.out: $(objpfx)tst-auditmod12.so $(objpfx)tst-audit12mod1.so $(objpfx)tst-audit12mod3.so
-$(objpfx)tst-audit12: $(libdl)
-tst-audit12-ENV = LD_AUDIT=$(objpfx)tst-auditmod12.so
-$(objpfx)tst-audit12mod1.so: $(objpfx)tst-audit12mod2.so
-LDFLAGS-tst-audit12mod2.so = -Wl,--version-script=tst-audit12mod2.map
-
-# Override -z defs, so that we can reference an undefined symbol.
-# Force lazy binding for the same reason.
-LDFLAGS-tst-latepthreadmod.so = \
-  -Wl,-z,lazy -Wl,--unresolved-symbols=ignore-all
-# Do not optimize sibling calls as the test relies on a JMP_SLOT relocation for
-# function this_function_is_not_defined.
-CFLAGS-tst-latepthreadmod.c = -fno-optimize-sibling-calls
-$(objpfx)tst-latepthreadmod.so: $(shared-thread-library)
-$(objpfx)tst-latepthread: $(libdl)
-$(objpfx)tst-latepthread.out: $(objpfx)tst-latepthreadmod.so
-
-# The test modules are parameterized by preprocessor macros.
-$(patsubst %,$(objpfx)%.os,$(tst-tls-many-dynamic-modules)): \
-  $(objpfx)tst-tls-manydynamic%mod.os : tst-tls-manydynamicmod.c
-	$(compile-command.c) \
-	  -DNAME=tls_global_$* -DSETTER=set_value_$* -DGETTER=get_value_$*
-$(objpfx)tst-tls-manydynamic: $(libdl) $(shared-thread-library)
-$(objpfx)tst-tls-manydynamic.out: \
-  $(patsubst %,$(objpfx)%.so,$(tst-tls-many-dynamic-modules))
-
-tst-prelink-ENV = LD_TRACE_PRELINKING=1
-
-$(objpfx)tst-prelink-conflict.out: $(objpfx)tst-prelink.out
-	grep stdout $< | grep conflict | $(AWK) '{ print $$10, $$11 }' > $@
-
-$(objpfx)tst-prelink-cmp.out: tst-prelink.exp \
-			      $(objpfx)tst-prelink-conflict.out
-	cmp $^ > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-ldconfig-X.out : tst-ldconfig-X.sh $(objpfx)ldconfig
-	$(SHELL) $< '$(common-objpfx)' '$(test-wrapper-env)' \
-		 '$(run-program-env)' > $@; \
-	$(evaluate-test)
-
-$(objpfx)tst-dlsym-error: $(libdl)
-
-# Test static linking of all the libraries we can possibly link
-# together.  Note that in some configurations this may be less than the
-# complete list of libraries we build but we try to maxmimize this list.
-$(objpfx)tst-linkall-static: \
-  $(common-objpfx)math/libm.a \
-  $(common-objpfx)resolv/libresolv.a \
-  $(common-objpfx)dlfcn/libdl.a \
-  $(common-objpfx)login/libutil.a \
-  $(common-objpfx)rt/librt.a \
-  $(common-objpfx)resolv/libanl.a \
-  $(static-thread-library)
-
-# If we are using NSS crypto and we have the ability to link statically
-# then we include libcrypt.a, otherwise we leave out libcrypt.a and
-# link as much as we can into the tst-linkall-static test.  This assumes
-# that linking with libcrypt.a does everything required to include the
-# static NSS crypto library.
-ifeq (yesyes,$(nss-crypt)$(static-nss-crypt))
-$(objpfx)tst-linkall-static: \
-  $(common-objpfx)crypt/libcrypt.a
-endif
-# If we are not using NSS crypto then we always have the ability to link
-# with libcrypt.a.
-ifeq (no,$(nss-crypt))
-$(objpfx)tst-linkall-static: \
-  $(common-objpfx)crypt/libcrypt.a
-endif
-
-# The application depends on the DSO, and the DSO loads the plugin.
-# The plugin also depends on the DSO. This creates the circular
-# dependency via dlopen that we're testing to make sure works.
-$(objpfx)tst-nodelete-dlclose-dso.so: $(libdl)
-$(objpfx)tst-nodelete-dlclose-plugin.so: $(objpfx)tst-nodelete-dlclose-dso.so
-$(objpfx)tst-nodelete-dlclose: $(objpfx)tst-nodelete-dlclose-dso.so
-$(objpfx)tst-nodelete-dlclose.out: $(objpfx)tst-nodelete-dlclose-dso.so \
-				   $(objpfx)tst-nodelete-dlclose-plugin.so
-
-tst-env-setuid-ENV = MALLOC_CHECK_=2 MALLOC_MMAP_THRESHOLD_=4096 \
-		     LD_HWCAP_MASK=0x1
-tst-env-setuid-tunables-ENV = \
-	GLIBC_TUNABLES=glibc.malloc.check=2:glibc.malloc.mmap_threshold=4096
diff --git a/elf/Versions b/elf/Versions
deleted file mode 100644
index c59facdbd7..0000000000
--- a/elf/Versions
+++ /dev/null
@@ -1,77 +0,0 @@
-libc {
-  GLIBC_2.0 {
-%ifdef EXPORT_UNWIND_FIND_FDE
-    __deregister_frame_info; __register_frame_info;
-%endif
-  }
-  GLIBC_2.1 {
-    # functions used in other libraries
-    _dl_mcount_wrapper; _dl_mcount_wrapper_check;
-  }
-  GLIBC_2.2.4 {
-    dl_iterate_phdr;
-  }
-%ifdef EXPORT_UNWIND_FIND_FDE
-  # Needed for SHLIB_COMPAT calls using this version.
-  GLIBC_2.2.5 {
-  }
-  GCC_3.0 {
-    __deregister_frame_info_bases; __register_frame_info_bases;
-    __register_frame_info_table_bases; _Unwind_Find_FDE;
-  }
-%endif
-  GLIBC_PRIVATE {
-    # functions used in other libraries
-    _dl_addr;
-    _dl_open_hook;
-    _dl_sym; _dl_vsym;
-    __libc_dlclose; __libc_dlopen_mode; __libc_dlsym;
-
-    # Internal error handling support.  Interposes the functions in ld.so.
-    _dl_signal_error; _dl_catch_error;
-  }
-}
-
-ld {
-  GLIBC_2.0 {
-    # Functions which are interposed from libc.so.
-    calloc; free; malloc; realloc;
-
-    _r_debug;
-  }
-  GLIBC_2.1 {
-    # functions used in other libraries
-    _dl_mcount;
-    # historically used by Garbage Collectors
-    __libc_stack_end;
-  }
-  GLIBC_2.3 {
-    # runtime interface to TLS
-    __tls_get_addr;
-  }
-  GLIBC_2.4 {
-    # stack canary
-    __stack_chk_guard;
-  }
-  GLIBC_PRIVATE {
-    # Those are in the dynamic linker, but used by libc.so.
-    __libc_enable_secure;
-    _dl_allocate_tls; _dl_allocate_tls_init;
-    _dl_argv; _dl_find_dso_for_object; _dl_get_tls_static_info;
-    _dl_deallocate_tls; _dl_make_stack_executable; _dl_out_of_memory;
-    _dl_rtld_di_serinfo; _dl_starting_up;
-    _rtld_global; _rtld_global_ro;
-
-    # Only here for gdb while a better method is developed.
-    _dl_debug_state;
-
-    # Pointer protection.
-    __pointer_chk_guard;
-
-    # Internal error handling support.  Interposed by libc.so.
-    _dl_signal_error; _dl_catch_error;
-
-    # Set value of a tunable.
-    __tunable_get_val;
-  }
-}
diff --git a/elf/cache.c b/elf/cache.c
deleted file mode 100644
index a76f89281d..0000000000
--- a/elf/cache.c
+++ /dev/null
@@ -1,829 +0,0 @@
-/* Copyright (C) 1999-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Andreas Jaeger <aj@suse.de>, 1999.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published
-   by the Free Software Foundation; version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <error.h>
-#include <dirent.h>
-#include <inttypes.h>
-#include <libgen.h>
-#include <libintl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <sys/fcntl.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <ldconfig.h>
-#include <dl-cache.h>
-
-struct cache_entry
-{
-  char *lib;			/* Library name.  */
-  char *path;			/* Path to find library.  */
-  int flags;			/* Flags to indicate kind of library.  */
-  unsigned int osversion;	/* Required OS version.  */
-  uint64_t hwcap;		/* Important hardware capabilities.  */
-  int bits_hwcap;		/* Number of bits set in hwcap.  */
-  struct cache_entry *next;	/* Next entry in list.  */
-};
-
-/* List of all cache entries.  */
-static struct cache_entry *entries;
-
-static const char *flag_descr[] =
-{ "libc4", "ELF", "libc5", "libc6"};
-
-/* Print a single entry.  */
-static void
-print_entry (const char *lib, int flag, unsigned int osversion,
-	     uint64_t hwcap, const char *key)
-{
-  printf ("\t%s (", lib);
-  switch (flag & FLAG_TYPE_MASK)
-    {
-    case FLAG_LIBC4:
-    case FLAG_ELF:
-    case FLAG_ELF_LIBC5:
-    case FLAG_ELF_LIBC6:
-      fputs (flag_descr[flag & FLAG_TYPE_MASK], stdout);
-      break;
-    default:
-      fputs (_("unknown"), stdout);
-      break;
-    }
-  switch (flag & FLAG_REQUIRED_MASK)
-    {
-    case FLAG_SPARC_LIB64:
-      fputs (",64bit", stdout);
-      break;
-    case FLAG_IA64_LIB64:
-      fputs (",IA-64", stdout);
-      break;
-    case FLAG_X8664_LIB64:
-      fputs (",x86-64", stdout);
-      break;
-    case FLAG_S390_LIB64:
-      fputs (",64bit", stdout);
-      break;
-    case FLAG_POWERPC_LIB64:
-      fputs (",64bit", stdout);
-      break;
-    case FLAG_MIPS64_LIBN32:
-      fputs (",N32", stdout);
-      break;
-    case FLAG_MIPS64_LIBN64:
-      fputs (",64bit", stdout);
-      break;
-    case FLAG_X8664_LIBX32:
-      fputs (",x32", stdout);
-      break;
-    case FLAG_ARM_LIBHF:
-      fputs (",hard-float", stdout);
-      break;
-    case FLAG_AARCH64_LIB64:
-      fputs (",AArch64", stdout);
-      break;
-    /* Uses the ARM soft-float ABI.  */
-    case FLAG_ARM_LIBSF:
-      fputs (",soft-float", stdout);
-      break;
-    case FLAG_MIPS_LIB32_NAN2008:
-      fputs (",nan2008", stdout);
-      break;
-    case FLAG_MIPS64_LIBN32_NAN2008:
-      fputs (",N32,nan2008", stdout);
-      break;
-    case FLAG_MIPS64_LIBN64_NAN2008:
-      fputs (",64bit,nan2008", stdout);
-      break;
-    case 0:
-      break;
-    default:
-      printf (",%d", flag & FLAG_REQUIRED_MASK);
-      break;
-    }
-  if (hwcap != 0)
-    printf (", hwcap: %#.16" PRIx64, hwcap);
-  if (osversion != 0)
-    {
-      static const char *const abi_tag_os[] =
-      {
-	[0] = "Linux",
-	[1] = "Hurd",
-	[2] = "Solaris",
-	[3] = "FreeBSD",
-	[4] = "kNetBSD",
-	[5] = "Syllable",
-	[6] = N_("Unknown OS")
-      };
-#define MAXTAG (sizeof abi_tag_os / sizeof abi_tag_os[0] - 1)
-      unsigned int os = osversion >> 24;
-
-      printf (_(", OS ABI: %s %d.%d.%d"),
-	      _(abi_tag_os[os > MAXTAG ? MAXTAG : os]),
-	      (osversion >> 16) & 0xff,
-	      (osversion >> 8) & 0xff,
-	      osversion & 0xff);
-    }
-  printf (") => %s\n", key);
-}
-
-
-/* Print the whole cache file, if a file contains the new cache format
-   hidden in the old one, print the contents of the new format.  */
-void
-print_cache (const char *cache_name)
-{
-  int fd = open (cache_name, O_RDONLY);
-  if (fd < 0)
-    error (EXIT_FAILURE, errno, _("Can't open cache file %s\n"), cache_name);
-
-  struct stat64 st;
-  if (fstat64 (fd, &st) < 0
-      /* No need to map the file if it is empty.  */
-      || st.st_size == 0)
-    {
-      close (fd);
-      return;
-    }
-
-  struct cache_file *cache
-    = mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
-  if (cache == MAP_FAILED)
-    error (EXIT_FAILURE, errno, _("mmap of cache file failed.\n"));
-
-  size_t cache_size = st.st_size;
-  if (cache_size < sizeof (struct cache_file))
-    error (EXIT_FAILURE, 0, _("File is not a cache file.\n"));
-
-  struct cache_file_new *cache_new = NULL;
-  const char *cache_data;
-  int format = 0;
-
-  if (memcmp (cache->magic, CACHEMAGIC, sizeof CACHEMAGIC - 1))
-    {
-      /* This can only be the new format without the old one.  */
-      cache_new = (struct cache_file_new *) cache;
-
-      if (memcmp (cache_new->magic, CACHEMAGIC_NEW, sizeof CACHEMAGIC_NEW - 1)
-	  || memcmp (cache_new->version, CACHE_VERSION,
-		      sizeof CACHE_VERSION - 1))
-	error (EXIT_FAILURE, 0, _("File is not a cache file.\n"));
-      format = 1;
-      /* This is where the strings start.  */
-      cache_data = (const char *) cache_new;
-    }
-  else
-    {
-      size_t offset = ALIGN_CACHE (sizeof (struct cache_file)
-				   + (cache->nlibs
-				      * sizeof (struct file_entry)));
-      /* This is where the strings start.  */
-      cache_data = (const char *) &cache->libs[cache->nlibs];
-
-      /* Check for a new cache embedded in the old format.  */
-      if (cache_size >
-	  (offset + sizeof (struct cache_file_new)))
-	{
-
-	  cache_new = (struct cache_file_new *) ((void *)cache + offset);
-
-	  if (memcmp (cache_new->magic, CACHEMAGIC_NEW,
-		      sizeof CACHEMAGIC_NEW - 1) == 0
-	      && memcmp (cache_new->version, CACHE_VERSION,
-			 sizeof CACHE_VERSION - 1) == 0)
-	    {
-	      cache_data = (const char *) cache_new;
-	      format = 1;
-	    }
-	}
-    }
-
-  if (format == 0)
-    {
-      printf (_("%d libs found in cache `%s'\n"), cache->nlibs, cache_name);
-
-      /* Print everything.  */
-      for (unsigned int i = 0; i < cache->nlibs; i++)
-	print_entry (cache_data + cache->libs[i].key,
-		     cache->libs[i].flags, 0, 0,
-		     cache_data + cache->libs[i].value);
-    }
-  else if (format == 1)
-    {
-      printf (_("%d libs found in cache `%s'\n"),
-	      cache_new->nlibs, cache_name);
-
-      /* Print everything.  */
-      for (unsigned int i = 0; i < cache_new->nlibs; i++)
-	print_entry (cache_data + cache_new->libs[i].key,
-		     cache_new->libs[i].flags,
-		     cache_new->libs[i].osversion,
-		     cache_new->libs[i].hwcap,
-		     cache_data + cache_new->libs[i].value);
-    }
-  /* Cleanup.  */
-  munmap (cache, cache_size);
-  close (fd);
-}
-
-/* Initialize cache data structures.  */
-void
-init_cache (void)
-{
-  entries = NULL;
-}
-
-static int
-compare (const struct cache_entry *e1, const struct cache_entry *e2)
-{
-  /* We need to swap entries here to get the correct sort order.  */
-  int res = _dl_cache_libcmp (e2->lib, e1->lib);
-  if (res == 0)
-    {
-      if (e1->flags < e2->flags)
-	return 1;
-      else if (e1->flags > e2->flags)
-	return -1;
-      /* Sort by most specific hwcap.  */
-      else if (e2->bits_hwcap > e1->bits_hwcap)
-	return 1;
-      else if (e2->bits_hwcap < e1->bits_hwcap)
-	return -1;
-      else if (e2->hwcap > e1->hwcap)
-	return 1;
-      else if (e2->hwcap < e1->hwcap)
-	return -1;
-      if (e2->osversion > e1->osversion)
-	return 1;
-      if (e2->osversion < e1->osversion)
-	return -1;
-    }
-  return res;
-}
-
-/* Save the contents of the cache.  */
-void
-save_cache (const char *cache_name)
-{
-  /* The cache entries are sorted already, save them in this order. */
-
-  /* Count the length of all strings.  */
-  /* The old format doesn't contain hwcap entries and doesn't contain
-     libraries in subdirectories with hwcaps entries.  Count therefore
-     also all entries with hwcap == 0.  */
-  size_t total_strlen = 0;
-  struct cache_entry *entry;
-  /* Number of cache entries.  */
-  int cache_entry_count = 0;
-  /* Number of normal cache entries.  */
-  int cache_entry_old_count = 0;
-
-  for (entry = entries; entry != NULL; entry = entry->next)
-    {
-      /* Account the final NULs.  */
-      total_strlen += strlen (entry->lib) + strlen (entry->path) + 2;
-      ++cache_entry_count;
-      if (entry->hwcap == 0)
-	++cache_entry_old_count;
-    }
-
-  /* Create the on disk cache structure.  */
-  struct cache_file *file_entries = NULL;
-  size_t file_entries_size = 0;
-
-  if (opt_format != 2)
-    {
-      /* struct cache_file_new is 64-bit aligned on some arches while
-	 only 32-bit aligned on other arches.  Duplicate last old
-	 cache entry so that new cache in ld.so.cache can be used by
-	 both.  */
-      if (opt_format != 0)
-	cache_entry_old_count = (cache_entry_old_count + 1) & ~1;
-
-      /* And the list of all entries in the old format.  */
-      file_entries_size = sizeof (struct cache_file)
-	+ cache_entry_old_count * sizeof (struct file_entry);
-      file_entries = xmalloc (file_entries_size);
-
-      /* Fill in the header.  */
-      memset (file_entries, '\0', sizeof (struct cache_file));
-      memcpy (file_entries->magic, CACHEMAGIC, sizeof CACHEMAGIC - 1);
-
-      file_entries->nlibs = cache_entry_old_count;
-    }
-
-  struct cache_file_new *file_entries_new = NULL;
-  size_t file_entries_new_size = 0;
-
-  if (opt_format != 0)
-    {
-      /* And the list of all entries in the new format.  */
-      file_entries_new_size = sizeof (struct cache_file_new)
-	+ cache_entry_count * sizeof (struct file_entry_new);
-      file_entries_new = xmalloc (file_entries_new_size);
-
-      /* Fill in the header.  */
-      memset (file_entries_new, '\0', sizeof (struct cache_file_new));
-      memcpy (file_entries_new->magic, CACHEMAGIC_NEW,
-	      sizeof CACHEMAGIC_NEW - 1);
-      memcpy (file_entries_new->version, CACHE_VERSION,
-	      sizeof CACHE_VERSION - 1);
-
-      file_entries_new->nlibs = cache_entry_count;
-      file_entries_new->len_strings = total_strlen;
-    }
-
-  /* Pad for alignment of cache_file_new.  */
-  size_t pad = ALIGN_CACHE (file_entries_size) - file_entries_size;
-
-  /* If we have both formats, we hide the new format in the strings
-     table, we have to adjust all string indices for this so that
-     old libc5/glibc 2 dynamic linkers just ignore them.  */
-  unsigned int str_offset;
-  if (opt_format != 0)
-    str_offset = file_entries_new_size;
-  else
-    str_offset = 0;
-
-  /* An array for all strings.  */
-  char *strings = xmalloc (total_strlen);
-  char *str = strings;
-  int idx_old;
-  int idx_new;
-
-  for (idx_old = 0, idx_new = 0, entry = entries; entry != NULL;
-       entry = entry->next, ++idx_new)
-    {
-      /* First the library.  */
-      if (opt_format != 2 && entry->hwcap == 0)
-	{
-	  file_entries->libs[idx_old].flags = entry->flags;
-	  /* XXX: Actually we can optimize here and remove duplicates.  */
-	  file_entries->libs[idx_old].key = str_offset + pad;
-	}
-      if (opt_format != 0)
-	{
-	  /* We could subtract file_entries_new_size from str_offset -
-	     not doing so makes the code easier, the string table
-	     always begins at the beginning of the new cache
-	     struct.  */
-	  file_entries_new->libs[idx_new].flags = entry->flags;
-	  file_entries_new->libs[idx_new].osversion = entry->osversion;
-	  file_entries_new->libs[idx_new].hwcap = entry->hwcap;
-	  file_entries_new->libs[idx_new].key = str_offset;
-	}
-
-      size_t len = strlen (entry->lib) + 1;
-      str = mempcpy (str, entry->lib, len);
-      str_offset += len;
-      /* Then the path.  */
-      if (opt_format != 2 && entry->hwcap == 0)
-	file_entries->libs[idx_old].value = str_offset + pad;
-      if (opt_format != 0)
-	file_entries_new->libs[idx_new].value = str_offset;
-      len = strlen (entry->path) + 1;
-      str = mempcpy (str, entry->path, len);
-      str_offset += len;
-      /* Ignore entries with hwcap for old format.  */
-      if (entry->hwcap == 0)
-	++idx_old;
-    }
-
-  /* Duplicate last old cache entry if needed.  */
-  if (opt_format != 2
-      && idx_old < cache_entry_old_count)
-    file_entries->libs[idx_old] = file_entries->libs[idx_old - 1];
-
-  /* Write out the cache.  */
-
-  /* Write cache first to a temporary file and rename it later.  */
-  char *temp_name = xmalloc (strlen (cache_name) + 2);
-  sprintf (temp_name, "%s~", cache_name);
-
-  /* Create file.  */
-  int fd = open (temp_name, O_CREAT|O_WRONLY|O_TRUNC|O_NOFOLLOW,
-		 S_IRUSR|S_IWUSR);
-  if (fd < 0)
-    error (EXIT_FAILURE, errno, _("Can't create temporary cache file %s"),
-	   temp_name);
-
-  /* Write contents.  */
-  if (opt_format != 2)
-    {
-      if (write (fd, file_entries, file_entries_size)
-	  != (ssize_t) file_entries_size)
-	error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
-    }
-  if (opt_format != 0)
-    {
-      /* Align cache.  */
-      if (opt_format != 2)
-	{
-	  char zero[pad];
-	  memset (zero, '\0', pad);
-	  if (write (fd, zero, pad) != (ssize_t) pad)
-	    error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
-	}
-      if (write (fd, file_entries_new, file_entries_new_size)
-	  != (ssize_t) file_entries_new_size)
-	error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
-    }
-
-  if (write (fd, strings, total_strlen) != (ssize_t) total_strlen
-      || close (fd))
-    error (EXIT_FAILURE, errno, _("Writing of cache data failed"));
-
-  /* Make sure user can always read cache file */
-  if (chmod (temp_name, S_IROTH|S_IRGRP|S_IRUSR|S_IWUSR))
-    error (EXIT_FAILURE, errno,
-	   _("Changing access rights of %s to %#o failed"), temp_name,
-	   S_IROTH|S_IRGRP|S_IRUSR|S_IWUSR);
-
-  /* Move temporary to its final location.  */
-  if (rename (temp_name, cache_name))
-    error (EXIT_FAILURE, errno, _("Renaming of %s to %s failed"), temp_name,
-	   cache_name);
-
-  /* Free all allocated memory.  */
-  free (file_entries_new);
-  free (file_entries);
-  free (strings);
-
-  while (entries)
-    {
-      entry = entries;
-      entries = entries->next;
-      free (entry);
-    }
-}
-
-
-/* Add one library to the cache.  */
-void
-add_to_cache (const char *path, const char *lib, int flags,
-	      unsigned int osversion, uint64_t hwcap)
-{
-  size_t liblen = strlen (lib) + 1;
-  size_t len = liblen + strlen (path) + 1;
-  struct cache_entry *new_entry
-    = xmalloc (sizeof (struct cache_entry) + liblen + len);
-
-  new_entry->lib = memcpy ((char *) (new_entry + 1), lib, liblen);
-  new_entry->path = new_entry->lib + liblen;
-  snprintf (new_entry->path, len, "%s/%s", path, lib);
-  new_entry->flags = flags;
-  new_entry->osversion = osversion;
-  new_entry->hwcap = hwcap;
-  new_entry->bits_hwcap = 0;
-
-  /* Count the number of bits set in the masked value.  */
-  for (size_t i = 0;
-       (~((1ULL << i) - 1) & hwcap) != 0 && i < 8 * sizeof (hwcap); ++i)
-    if ((hwcap & (1ULL << i)) != 0)
-      ++new_entry->bits_hwcap;
-
-
-  /* Keep the list sorted - search for right place to insert.  */
-  struct cache_entry *ptr = entries;
-  struct cache_entry *prev = entries;
-  while (ptr != NULL)
-    {
-      if (compare (ptr, new_entry) > 0)
-	break;
-      prev = ptr;
-      ptr = ptr->next;
-    }
-  /* Is this the first entry?  */
-  if (ptr == entries)
-    {
-      new_entry->next = entries;
-      entries = new_entry;
-    }
-  else
-    {
-      new_entry->next = prev->next;
-      prev->next = new_entry;
-    }
-}
-
-
-/* Auxiliary cache.  */
-
-struct aux_cache_entry_id
-{
-  uint64_t ino;
-  uint64_t ctime;
-  uint64_t size;
-  uint64_t dev;
-};
-
-struct aux_cache_entry
-{
-  struct aux_cache_entry_id id;
-  int flags;
-  unsigned int osversion;
-  int used;
-  char *soname;
-  struct aux_cache_entry *next;
-};
-
-#define AUX_CACHEMAGIC		"glibc-ld.so.auxcache-1.0"
-
-struct aux_cache_file_entry
-{
-  struct aux_cache_entry_id id;	/* Unique id of entry.  */
-  int32_t flags;		/* This is 1 for an ELF library.  */
-  uint32_t soname;		/* String table indice.  */
-  uint32_t osversion;		/* Required OS version.	 */
-  int32_t pad;
-};
-
-/* ldconfig maintains an auxiliary cache file that allows
-   only reading those libraries that have changed since the last iteration.
-   For this for each library some information is cached in the auxiliary
-   cache.  */
-struct aux_cache_file
-{
-  char magic[sizeof AUX_CACHEMAGIC - 1];
-  uint32_t nlibs;		/* Number of entries.  */
-  uint32_t len_strings;		/* Size of string table. */
-  struct aux_cache_file_entry libs[0]; /* Entries describing libraries.  */
-  /* After this the string table of size len_strings is found.	*/
-};
-
-static const unsigned int primes[] =
-{
-  1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139,
-  524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393,
-  67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647
-};
-
-static size_t aux_hash_size;
-static struct aux_cache_entry **aux_hash;
-
-/* Simplistic hash function for aux_cache_entry_id.  */
-static unsigned int
-aux_cache_entry_id_hash (struct aux_cache_entry_id *id)
-{
-  uint64_t ret = ((id->ino * 11 + id->ctime) * 11 + id->size) * 11 + id->dev;
-  return ret ^ (ret >> 32);
-}
-
-static size_t nextprime (size_t x)
-{
-  for (unsigned int i = 0; i < sizeof (primes) / sizeof (primes[0]); ++i)
-    if (primes[i] >= x)
-      return primes[i];
-  return x;
-}
-
-void
-init_aux_cache (void)
-{
-  aux_hash_size = primes[3];
-  aux_hash = xcalloc (aux_hash_size, sizeof (struct aux_cache_entry *));
-}
-
-int
-search_aux_cache (struct stat64 *stat_buf, int *flags,
-		  unsigned int *osversion, char **soname)
-{
-  struct aux_cache_entry_id id;
-  id.ino = (uint64_t) stat_buf->st_ino;
-  id.ctime = (uint64_t) stat_buf->st_ctime;
-  id.size = (uint64_t) stat_buf->st_size;
-  id.dev = (uint64_t) stat_buf->st_dev;
-
-  unsigned int hash = aux_cache_entry_id_hash (&id);
-  struct aux_cache_entry *entry;
-  for (entry = aux_hash[hash % aux_hash_size]; entry; entry = entry->next)
-    if (id.ino == entry->id.ino
-	&& id.ctime == entry->id.ctime
-	&& id.size == entry->id.size
-	&& id.dev == entry->id.dev)
-      {
-	*flags = entry->flags;
-	*osversion = entry->osversion;
-	if (entry->soname != NULL)
-	  *soname = xstrdup (entry->soname);
-	else
-	  *soname = NULL;
-	entry->used = 1;
-	return 1;
-      }
-
-  return 0;
-}
-
-static void
-insert_to_aux_cache (struct aux_cache_entry_id *id, int flags,
-		     unsigned int osversion, const char *soname, int used)
-{
-  size_t hash = aux_cache_entry_id_hash (id) % aux_hash_size;
-  struct aux_cache_entry *entry;
-  for (entry = aux_hash[hash]; entry; entry = entry->next)
-    if (id->ino == entry->id.ino
-	&& id->ctime == entry->id.ctime
-	&& id->size == entry->id.size
-	&& id->dev == entry->id.dev)
-      abort ();
-
-  size_t len = soname ? strlen (soname) + 1 : 0;
-  entry = xmalloc (sizeof (struct aux_cache_entry) + len);
-  entry->id = *id;
-  entry->flags = flags;
-  entry->osversion = osversion;
-  entry->used = used;
-  if (soname != NULL)
-    entry->soname = memcpy ((char *) (entry + 1), soname, len);
-  else
-    entry->soname = NULL;
-  entry->next = aux_hash[hash];
-  aux_hash[hash] = entry;
-}
-
-void
-add_to_aux_cache (struct stat64 *stat_buf, int flags,
-		  unsigned int osversion, const char *soname)
-{
-  struct aux_cache_entry_id id;
-  id.ino = (uint64_t) stat_buf->st_ino;
-  id.ctime = (uint64_t) stat_buf->st_ctime;
-  id.size = (uint64_t) stat_buf->st_size;
-  id.dev = (uint64_t) stat_buf->st_dev;
-  insert_to_aux_cache (&id, flags, osversion, soname, 1);
-}
-
-/* Load auxiliary cache to search for unchanged entries.   */
-void
-load_aux_cache (const char *aux_cache_name)
-{
-  int fd = open (aux_cache_name, O_RDONLY);
-  if (fd < 0)
-    {
-      init_aux_cache ();
-      return;
-    }
-
-  struct stat64 st;
-  if (fstat64 (fd, &st) < 0 || st.st_size < sizeof (struct aux_cache_file))
-    {
-      close (fd);
-      init_aux_cache ();
-      return;
-    }
-
-  size_t aux_cache_size = st.st_size;
-  struct aux_cache_file *aux_cache
-    = mmap (NULL, aux_cache_size, PROT_READ, MAP_PRIVATE, fd, 0);
-  if (aux_cache == MAP_FAILED
-      || aux_cache_size < sizeof (struct aux_cache_file)
-      || memcmp (aux_cache->magic, AUX_CACHEMAGIC, sizeof AUX_CACHEMAGIC - 1)
-      || aux_cache_size != (sizeof(struct aux_cache_file) +
-			    aux_cache->nlibs * sizeof(struct aux_cache_file_entry) +
-			    aux_cache->len_strings))
-    {
-      close (fd);
-      init_aux_cache ();
-      return;
-    }
-
-  aux_hash_size = nextprime (aux_cache->nlibs);
-  aux_hash = xcalloc (aux_hash_size, sizeof (struct aux_cache_entry *));
-
-  const char *aux_cache_data
-    = (const char *) &aux_cache->libs[aux_cache->nlibs];
-  for (unsigned int i = 0; i < aux_cache->nlibs; ++i)
-    insert_to_aux_cache (&aux_cache->libs[i].id,
-			 aux_cache->libs[i].flags,
-			 aux_cache->libs[i].osversion,
-			 aux_cache->libs[i].soname == 0
-			 ? NULL : aux_cache_data + aux_cache->libs[i].soname,
-			 0);
-
-  munmap (aux_cache, aux_cache_size);
-  close (fd);
-}
-
-/* Save the contents of the auxiliary cache.  */
-void
-save_aux_cache (const char *aux_cache_name)
-{
-  /* Count the length of all sonames.  We start with empty string.  */
-  size_t total_strlen = 1;
-  /* Number of cache entries.  */
-  int cache_entry_count = 0;
-
-  for (size_t i = 0; i < aux_hash_size; ++i)
-    for (struct aux_cache_entry *entry = aux_hash[i];
-	 entry != NULL; entry = entry->next)
-      if (entry->used)
-	{
-	  ++cache_entry_count;
-	  if (entry->soname != NULL)
-	    total_strlen += strlen (entry->soname) + 1;
-	}
-
-  /* Auxiliary cache.  */
-  size_t file_entries_size
-    = sizeof (struct aux_cache_file)
-      + cache_entry_count * sizeof (struct aux_cache_file_entry);
-  struct aux_cache_file *file_entries
-    = xmalloc (file_entries_size + total_strlen);
-
-  /* Fill in the header of the auxiliary cache.  */
-  memset (file_entries, '\0', sizeof (struct aux_cache_file));
-  memcpy (file_entries->magic, AUX_CACHEMAGIC, sizeof AUX_CACHEMAGIC - 1);
-
-  file_entries->nlibs = cache_entry_count;
-  file_entries->len_strings = total_strlen;
-
-  /* Initial String offset for auxiliary cache is always after the
-     special empty string.  */
-  unsigned int str_offset = 1;
-
-  /* An array for all strings.  */
-  char *str = (char *) file_entries + file_entries_size;
-  *str++ = '\0';
-
-  size_t idx = 0;
-  for (size_t i = 0; i < aux_hash_size; ++i)
-    for (struct aux_cache_entry *entry = aux_hash[i];
-	 entry != NULL; entry = entry->next)
-      if (entry->used)
-	{
-	  file_entries->libs[idx].id = entry->id;
-	  file_entries->libs[idx].flags = entry->flags;
-	  if (entry->soname == NULL)
-	    file_entries->libs[idx].soname = 0;
-	  else
-	    {
-	      file_entries->libs[idx].soname = str_offset;
-
-	      size_t len = strlen (entry->soname) + 1;
-	      str = mempcpy (str, entry->soname, len);
-	      str_offset += len;
-	    }
-	  file_entries->libs[idx].osversion = entry->osversion;
-	  file_entries->libs[idx++].pad = 0;
-	}
-
-  /* Write out auxiliary cache file.  */
-  /* Write auxiliary cache first to a temporary file and rename it later.  */
-
-  char *temp_name = xmalloc (strlen (aux_cache_name) + 2);
-  sprintf (temp_name, "%s~", aux_cache_name);
-
-  /* Check that directory exists and create if needed.  */
-  char *dir = strdupa (aux_cache_name);
-  dir = dirname (dir);
-
-  struct stat64 st;
-  if (stat64 (dir, &st) < 0)
-    {
-      if (mkdir (dir, 0700) < 0)
-	goto out_fail;
-    }
-
-  /* Create file.  */
-  int fd = open (temp_name, O_CREAT|O_WRONLY|O_TRUNC|O_NOFOLLOW,
-		 S_IRUSR|S_IWUSR);
-  if (fd < 0)
-    goto out_fail;
-
-  if (write (fd, file_entries, file_entries_size + total_strlen)
-      != (ssize_t) (file_entries_size + total_strlen)
-      || close (fd))
-    {
-      unlink (temp_name);
-      goto out_fail;
-    }
-
-  /* Move temporary to its final location.  */
-  if (rename (temp_name, aux_cache_name))
-    unlink (temp_name);
-
-out_fail:
-  /* Free allocated memory.  */
-  free (temp_name);
-  free (file_entries);
-}
diff --git a/elf/chroot_canon.c b/elf/chroot_canon.c
deleted file mode 100644
index 78cd6f4a5e..0000000000
--- a/elf/chroot_canon.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/* Return the canonical absolute name of a given file inside chroot.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published
-   by the Free Software Foundation; version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <limits.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <eloop-threshold.h>
-#include <ldconfig.h>
-
-#ifndef PATH_MAX
-#define PATH_MAX 1024
-#endif
-
-/* Return the canonical absolute name of file NAME as if chroot(CHROOT) was
-   done first.  A canonical name does not contain any `.', `..' components
-   nor any repeated path separators ('/') or symlinks.  All path components
-   must exist and NAME must be absolute filename.  The result is malloc'd.
-   The returned name includes the CHROOT prefix.  */
-
-char *
-chroot_canon (const char *chroot, const char *name)
-{
-  char *rpath;
-  char *dest;
-  char *extra_buf = NULL;
-  char *rpath_root;
-  const char *start;
-  const char *end;
-  const char *rpath_limit;
-  int num_links = 0;
-  size_t chroot_len = strlen (chroot);
-
-  if (chroot_len < 1)
-    {
-      __set_errno (EINVAL);
-      return NULL;
-    }
-
-  rpath = xmalloc (chroot_len + PATH_MAX);
-
-  rpath_limit = rpath + chroot_len + PATH_MAX;
-
-  rpath_root = (char *) mempcpy (rpath, chroot, chroot_len) - 1;
-  if (*rpath_root != '/')
-    *++rpath_root = '/';
-  dest = rpath_root + 1;
-
-  for (start = end = name; *start; start = end)
-    {
-      struct stat64 st;
-
-      /* Skip sequence of multiple path-separators.  */
-      while (*start == '/')
-	++start;
-
-      /* Find end of path component.  */
-      for (end = start; *end && *end != '/'; ++end)
-	/* Nothing.  */;
-
-      if (end - start == 0)
-	break;
-      else if (end - start == 1 && start[0] == '.')
-	/* nothing */;
-      else if (end - start == 2 && start[0] == '.' && start[1] == '.')
-	{
-	  /* Back up to previous component, ignore if at root already.  */
-	  if (dest > rpath_root + 1)
-	    while ((--dest)[-1] != '/');
-	}
-      else
-	{
-	  size_t new_size;
-
-	  if (dest[-1] != '/')
-	    *dest++ = '/';
-
-	  if (dest + (end - start) >= rpath_limit)
-	    {
-	      ptrdiff_t dest_offset = dest - rpath;
-	      char *new_rpath;
-
-	      new_size = rpath_limit - rpath;
-	      if (end - start + 1 > PATH_MAX)
-		new_size += end - start + 1;
-	      else
-		new_size += PATH_MAX;
-	      new_rpath = (char *) xrealloc (rpath, new_size);
-	      rpath = new_rpath;
-	      rpath_limit = rpath + new_size;
-
-	      dest = rpath + dest_offset;
-	    }
-
-	  dest = mempcpy (dest, start, end - start);
-	  *dest = '\0';
-
-	  if (lstat64 (rpath, &st) < 0)
-	    {
-	      if (*end == '\0')
-		goto done;
-	      goto error;
-	    }
-
-	  if (S_ISLNK (st.st_mode))
-	    {
-	      char *buf = alloca (PATH_MAX);
-	      size_t len;
-
-	      if (++num_links > __eloop_threshold ())
-		{
-		  __set_errno (ELOOP);
-		  goto error;
-		}
-
-	      ssize_t n = readlink (rpath, buf, PATH_MAX - 1);
-	      if (n < 0)
-		{
-		  if (*end == '\0')
-		    goto done;
-		  goto error;
-		}
-	      buf[n] = '\0';
-
-	      if (!extra_buf)
-		extra_buf = alloca (PATH_MAX);
-
-	      len = strlen (end);
-	      if (len >= PATH_MAX - n)
-		{
-		  __set_errno (ENAMETOOLONG);
-		  goto error;
-		}
-
-	      /* Careful here, end may be a pointer into extra_buf... */
-	      memmove (&extra_buf[n], end, len + 1);
-	      name = end = memcpy (extra_buf, buf, n);
-
-	      if (buf[0] == '/')
-		dest = rpath_root + 1;	/* It's an absolute symlink */
-	      else
-		/* Back up to previous component, ignore if at root already: */
-		if (dest > rpath_root + 1)
-		  while ((--dest)[-1] != '/');
-	    }
-	}
-    }
- done:
-  if (dest > rpath_root + 1 && dest[-1] == '/')
-    --dest;
-  *dest = '\0';
-
-  return rpath;
-
- error:
-  free (rpath);
-  return NULL;
-}
diff --git a/elf/circleload1.c b/elf/circleload1.c
deleted file mode 100644
index 990ff84a84..0000000000
--- a/elf/circleload1.c
+++ /dev/null
@@ -1,166 +0,0 @@
-#include <dlfcn.h>
-#include <libintl.h>
-#include <link.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define MAPS ((struct link_map *) _r_debug.r_map)
-
-static int
-check_loaded_objects (const char **loaded)
-{
-  struct link_map *lm;
-  int n;
-  int *found = NULL;
-  int errors = 0;
-
-  for (n = 0; loaded[n]; n++)
-    /* NOTHING */;
-
-  if (n)
-    {
-      found = (int *) alloca (sizeof (int) * n);
-      memset (found, 0, sizeof (int) * n);
-    }
-
-  printf("   Name\n");
-  printf(" --------------------------------------------------------\n");
-  for (lm = MAPS; lm; lm = lm->l_next)
-    {
-      if (lm->l_name && lm->l_name[0])
-	printf(" %s, count = %d\n", lm->l_name, (int) lm->l_direct_opencount);
-      if (lm->l_type == lt_loaded && lm->l_name)
-	{
-	  int match = 0;
-	  for (n = 0; loaded[n] != NULL; n++)
-	    {
-	      if (strcmp (basename (loaded[n]), basename (lm->l_name)) == 0)
-	        {
-		  found[n] = 1;
-		  match = 1;
-		  break;
-		}
-	    }
-
-	  if (match == 0)
-	    {
-	      ++errors;
-	      printf ("ERRORS: %s is not unloaded\n", lm->l_name);
-	    }
-	}
-    }
-
-  for (n = 0; loaded[n] != NULL; n++)
-    {
-      if (found[n] == 0)
-        {
-	  ++errors;
-	  printf ("ERRORS: %s is not loaded\n", loaded[n]);
-	}
-    }
-
-  return errors;
-}
-
-static int
-load_dso (const char **loading, int undef, int flag)
-{
-  void *obj;
-  const char *loaded[] = { NULL, NULL, NULL, NULL };
-  int errors = 0;
-  const char *errstring;
-
-  printf ("\nThis is what is in memory now:\n");
-  errors += check_loaded_objects (loaded);
-
-  printf ("Loading shared object %s: %s\n", loading[0],
-	 flag == RTLD_LAZY ? "RTLD_LAZY" : "RTLD_NOW");
-  obj = dlopen (loading[0], flag);
-  if (obj == NULL)
-    {
-      if (flag == RTLD_LAZY)
-	{
-	  ++errors;
-	  printf ("ERRORS: dlopen shouldn't fail for RTLD_LAZY\n");
-	}
-
-      errstring = dlerror ();
-      if (strstr (errstring, "undefined symbol") == 0
-	  || strstr (errstring, "circlemod2_undefined") == 0)
-	{
-	  ++errors;
-	  printf ("ERRORS: dlopen: `%s': Invalid error string\n",
-		  errstring);
-	}
-      else
-	printf ("dlopen: %s\n", errstring);
-    }
-  else
-    {
-      if (undef && flag == RTLD_NOW)
-	{
-	  ++errors;
-	  printf ("ERRORS: dlopen shouldn't work for RTLD_NOW\n");
-	}
-
-      if (!undef)
-	{
-	  int (*func) (void);
-
-	  func = dlsym (obj, "circlemod1");
-	  if (func == NULL)
-	    {
-	      ++errors;
-	      printf ("ERRORS: cannot get address of \"circlemod1\": %s\n",
-		      dlerror ());
-	    }
-	  else if (func () != 3)
-	    {
-	      ++errors;
-	      printf ("ERRORS: function \"circlemod1\" returned wrong result\n");
-	    }
-	}
-
-      loaded[0] = loading[0];
-      loaded[1] = loading[1];
-      loaded[2] = loading[2];
-    }
-  errors += check_loaded_objects (loaded);
-
-  if (obj)
-    {
-      printf ("UnLoading shared object %s\n", loading[0]);
-      dlclose (obj);
-      loaded[0] = NULL;
-      loaded[1] = NULL;
-      loaded[2] = NULL;
-      errors += check_loaded_objects (loaded);
-    }
-
-  return errors;
-}
-
-int
-main (void)
-{
-  int errors = 0;
-  const char *loading[3];
-
-  loading[0] = "circlemod1a.so";
-  loading[1] = "circlemod2a.so";
-  loading[2] = "circlemod3a.so";
-  errors += load_dso (loading, 0, RTLD_LAZY);
-  errors += load_dso (loading, 0, RTLD_NOW);
-
-  loading[0] = "circlemod1.so";
-  loading[1] = "circlemod2.so";
-  loading[2] = "circlemod3.so";
-  errors += load_dso (loading, 1, RTLD_LAZY);
-  errors += load_dso (loading, 1, RTLD_NOW);
-
-  if (errors != 0)
-    printf ("%d errors found\n", errors);
-
-  return errors;
-}
diff --git a/elf/circlemod1.c b/elf/circlemod1.c
deleted file mode 100644
index 933ccd3c02..0000000000
--- a/elf/circlemod1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern int circlemod2 (void);
-
-int
-circlemod1 (void)
-{
-  return circlemod2 ();
-}
diff --git a/elf/circlemod1a.c b/elf/circlemod1a.c
deleted file mode 100644
index 45f229136d..0000000000
--- a/elf/circlemod1a.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "circlemod1.c"
diff --git a/elf/circlemod2.c b/elf/circlemod2.c
deleted file mode 100644
index ed8c1175fb..0000000000
--- a/elf/circlemod2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-extern void circlemod2_undefined (void);
-extern int circlemod3 (void);
-
-int
-circlemod2 (void)
-{
-  circlemod2_undefined ();
-  return circlemod3 ();
-}
diff --git a/elf/circlemod2a.c b/elf/circlemod2a.c
deleted file mode 100644
index dc6410b28b..0000000000
--- a/elf/circlemod2a.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern int circlemod3 (void);
-
-int
-circlemod2 (void)
-{
-  return circlemod3 ();
-}
diff --git a/elf/circlemod3.c b/elf/circlemod3.c
deleted file mode 100644
index 8d16fe682f..0000000000
--- a/elf/circlemod3.c
+++ /dev/null
@@ -1,14 +0,0 @@
-extern int circlemod1 (void);
-extern int circlemod2 (void);
-
-int
-circlemod3 (void)
-{
-  return 3;
-}
-
-int
-circlemod3a (void)
-{
-  return circlemod1 () + circlemod2 ();
-}
diff --git a/elf/circlemod3a.c b/elf/circlemod3a.c
deleted file mode 100644
index f1b166ef84..0000000000
--- a/elf/circlemod3a.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "circlemod3.c"
diff --git a/elf/constload1.c b/elf/constload1.c
deleted file mode 100644
index 7381beea88..0000000000
--- a/elf/constload1.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <dlfcn.h>
-#include <errno.h>
-#include <error.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  int (*foo) (void);
-  void *h;
-  int ret;
-
-  mtrace ();
-
-  h = dlopen ("constload2.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (h == NULL)
-    error (EXIT_FAILURE, errno, "cannot load module \"constload2.so\"");
-  foo = dlsym (h, "foo");
-  ret = foo ();
-  /* Note that the following dlclose() call cannot unload the objects.
-     Due to the introduced relocation dependency constload2.so depends
-     on constload3.so and the dependencies of constload2.so on constload3.so
-     is not visible to ld.so since it's done using dlopen().  */
-  if (dlclose (h) != 0)
-    {
-      puts ("failed to close");
-      exit (EXIT_FAILURE);
-    }
-  return ret;
-}
diff --git a/elf/constload2.c b/elf/constload2.c
deleted file mode 100644
index bf1bf182f3..0000000000
--- a/elf/constload2.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-extern int bar (void);
-extern int baz (void);
-extern int foo (void);
-extern void __attribute__ ((__constructor__)) init (void);
-
-void *h;
-
-int
-foo (void)
-{
-  return 42 + bar ();
-}
-
-int
-baz (void)
-{
-  return -21;
-}
-
-
-void
-__attribute__ ((__constructor__))
-init (void)
-{
-  h = dlopen ("constload3.so", RTLD_GLOBAL | RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("failed to load constload3");
-      exit (1);
-    }
-  else
-    puts ("succeeded loading constload3");
-}
-
-static void
-__attribute__ ((__destructor__))
-fini (void)
-{
-  if (dlclose (h) != 0)
-    {
-      puts ("failed to unload constload3");
-      exit (1);
-    }
-  else
-    puts ("succeeded unloading constload3");
-}
diff --git a/elf/constload3.c b/elf/constload3.c
deleted file mode 100644
index 9c37620bba..0000000000
--- a/elf/constload3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern int baz (void);
-extern int bar (void);
-
-int
-bar (void)
-{
-  return -21 + baz ();
-}
diff --git a/elf/dblload.c b/elf/dblload.c
deleted file mode 100644
index 52389a60ce..0000000000
--- a/elf/dblload.c
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-
-int
-main (void)
-{
-  void *p1;
-  void *p2;
-  int (*fp) (void);
-  int result;
-
-  mtrace ();
-
-  p1 = dlopen ("dblloadmod1.so", RTLD_LAZY);
-  if (p1 == NULL)
-    {
-      printf ("cannot open dblloadmod1.so: %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  p2 = dlopen ("dblloadmod2.so", RTLD_LAZY);
-  if (p1 == NULL)
-    {
-      printf ("cannot open dblloadmod2.so: %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  fp = dlsym (p1, "foo");
-  if (fp == NULL)
-    {
-      printf ("cannot get function \"foo\": %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  result = fp ();
-
-  if (dlclose (p1) != 0)
-    {
-      printf ("error while closing dblloadmod1.so: %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  if (dlclose (p2) != 0)
-    {
-      printf ("error while closing dblloadmod2.so: %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  return result;
-}
diff --git a/elf/dblloadmod1.c b/elf/dblloadmod1.c
deleted file mode 100644
index ecec29ec63..0000000000
--- a/elf/dblloadmod1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern int bar (void);
-extern int foo (void);
-
-int
-foo (void)
-{
-  return 10 + bar ();
-}
diff --git a/elf/dblloadmod2.c b/elf/dblloadmod2.c
deleted file mode 100644
index 3e20aa941b..0000000000
--- a/elf/dblloadmod2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-extern int bar (void);
-extern int baz (void);
-extern int xyzzy (void);
-
-int
-baz (void)
-{
-  return -42;
-}
-
-int
-xyzzy (void)
-{
-  return 10 + bar ();
-}
diff --git a/elf/dblloadmod3.c b/elf/dblloadmod3.c
deleted file mode 100644
index 80ac3a6375..0000000000
--- a/elf/dblloadmod3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern int bar (void);
-extern int baz (void);
-
-int
-bar (void)
-{
-  return 32 + baz ();
-}
diff --git a/elf/dblunload.c b/elf/dblunload.c
deleted file mode 100644
index ab0b2a5e9e..0000000000
--- a/elf/dblunload.c
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-
-int
-main (void)
-{
-  void *p1;
-  void *p2;
-  int (*fp) (void);
-  int result;
-
-  mtrace ();
-
-  p1 = dlopen ("dblloadmod1.so", RTLD_LAZY);
-  if (p1 == NULL)
-    {
-      printf ("cannot load dblloadmod1.so: %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  p2 = dlopen ("dblloadmod2.so", RTLD_LAZY);
-  if (p2 == NULL)
-    {
-      printf ("cannot load dblloadmod2.so: %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  if (dlclose (p1) != 0)
-    {
-      printf ("error while closing dblloadmod1.so: %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  fp = dlsym (p2, "xyzzy");
-  if (fp == NULL)
-    {
-      printf ("cannot get function \"xyzzy\": %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  result = fp ();
-
-  if (dlclose (p2) != 0)
-    {
-      printf ("error while closing dblloadmod2.so: %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  return result;
-}
diff --git a/elf/dep1.c b/elf/dep1.c
deleted file mode 100644
index 7ef47adb43..0000000000
--- a/elf/dep1.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <unistd.h>
-
-extern int dep1 (void);
-extern int dep2 (void);
-extern int dep4 (void);
-
-static void
-__attribute__ ((constructor))
-init (void)
-{
-  write (1, "3", 1);
-}
-
-static void
-__attribute__ ((destructor))
-fini (void)
-{
-  write (1, "6", 1);
-}
-
-int
-dep1 (void)
-{
-  return dep4 () - dep2 ();
-}
diff --git a/elf/dep2.c b/elf/dep2.c
deleted file mode 100644
index 749036a4ec..0000000000
--- a/elf/dep2.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <unistd.h>
-
-extern int dep2 (void);
-extern int dep3 (void);
-extern int dep4 (void);
-
-static void
-__attribute__ ((constructor))
-init (void)
-{
-  write (1, "2", 1);
-}
-
-static void
-__attribute__ ((destructor))
-fini (void)
-{
-  write (1, "7", 1);
-}
-
-int
-dep2 (void)
-{
-  return dep3 () - dep4 ();
-}
diff --git a/elf/dep3.c b/elf/dep3.c
deleted file mode 100644
index 3df6282009..0000000000
--- a/elf/dep3.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <unistd.h>
-
-extern int dep3 (void);
-
-static void
-__attribute__ ((constructor))
-init (void)
-{
-  write (1, "0", 1);
-}
-
-static void
-__attribute__ ((destructor))
-fini (void)
-{
-  write (1, "9\n", 2);
-}
-
-int
-dep3 (void)
-{
-  return 42;
-}
diff --git a/elf/dep4.c b/elf/dep4.c
deleted file mode 100644
index c496d6f531..0000000000
--- a/elf/dep4.c
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <unistd.h>
-
-extern int dep3 (void);
-extern int dep4 (void);
-
-static void
-__attribute__ ((constructor))
-init (void)
-{
-  write (1, "1", 1);
-}
-
-static void
-__attribute__ ((destructor))
-fini (void)
-{
-  write (1, "8", 1);
-}
-
-int
-dep4 (void)
-{
-  return dep3 ();
-}
diff --git a/elf/dl-addr-obj.c b/elf/dl-addr-obj.c
deleted file mode 100644
index 62aa630ce5..0000000000
--- a/elf/dl-addr-obj.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Determine if address is inside object load segments.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <link.h>
-#include <elf.h>
-
-/* Return non-zero if ADDR lies within one of L's loadable segments.
-   We have three cases we care about.
-
-   Case 1: addr is above a segment.
-   +==================+<- l_map_end
-   |                  |<- addr
-   |------------------|<- l_addr + p_vaddr + p_memsz
-   |                  |
-   |                  |
-   |------------------|<- l_addr + p_vaddr
-   |------------------|<- l_addr
-   |                  |
-   +==================+<- l_map_start
-
-   Case 2: addr is within a segments.
-   +==================+<- l_map_end
-   |                  |
-   |------------------|<- l_addr + p_vaddr + p_memsz
-   |                  |<- addr
-   |                  |
-   |------------------|<- l_addr + p_vaddr
-   |------------------|<- l_addr
-   |                  |
-   +==================+<- l_map_start
-
-   Case 3: addr is below a segments.
-   +==================+<- l_map_end
-   |                  |
-   |------------------|<- l_addr + p_vaddr + p_memsz
-   |                  |
-   |                  |
-   |------------------|<- l_addr + p_vaddr
-   |------------------|<- l_addr
-   |                  |<- addr
-   +==================+<- l_map_start
-
-   All the arithmetic is unsigned and we shift all the values down by
-   l_addr + p_vaddr and then compare the normalized addr to the range
-   of interest i.e. 0 <= addr < p_memsz.
-
-*/
-int
-internal_function
-_dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr)
-{
-  int n = l->l_phnum;
-  const ElfW(Addr) reladdr = addr - l->l_addr;
-
-  while (--n >= 0)
-    if (l->l_phdr[n].p_type == PT_LOAD
-	&& reladdr - l->l_phdr[n].p_vaddr < l->l_phdr[n].p_memsz)
-      return 1;
-  return 0;
-}
diff --git a/elf/dl-addr.c b/elf/dl-addr.c
deleted file mode 100644
index 1fac63d1a9..0000000000
--- a/elf/dl-addr.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Locate the shared object symbol nearest a given address.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <stddef.h>
-#include <ldsodefs.h>
-
-
-static inline void
-__attribute ((always_inline))
-determine_info (const ElfW(Addr) addr, struct link_map *match, Dl_info *info,
-		struct link_map **mapp, const ElfW(Sym) **symbolp)
-{
-  /* Now we know what object the address lies in.  */
-  info->dli_fname = match->l_name;
-  info->dli_fbase = (void *) match->l_map_start;
-
-  /* If this is the main program the information is incomplete.  */
-  if (__builtin_expect (match->l_name[0], 'a') == '\0'
-      && match->l_type == lt_executable)
-    info->dli_fname = _dl_argv[0];
-
-  const ElfW(Sym) *symtab
-    = (const ElfW(Sym) *) D_PTR (match, l_info[DT_SYMTAB]);
-  const char *strtab = (const char *) D_PTR (match, l_info[DT_STRTAB]);
-
-  ElfW(Word) strtabsize = match->l_info[DT_STRSZ]->d_un.d_val;
-
-  const ElfW(Sym) *matchsym = NULL;
-  if (match->l_info[DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM + DT_THISPROCNUM
-		    + DT_VERSIONTAGNUM + DT_EXTRANUM + DT_VALNUM] != NULL)
-    {
-      /* We look at all symbol table entries referenced by the hash
-	 table.  */
-      for (Elf_Symndx bucket = 0; bucket < match->l_nbuckets; ++bucket)
-	{
-	  Elf32_Word symndx = match->l_gnu_buckets[bucket];
-	  if (symndx != 0)
-	    {
-	      const Elf32_Word *hasharr = &match->l_gnu_chain_zero[symndx];
-
-	      do
-		{
-		  /* The hash table never references local symbols so
-		     we can omit that test here.  */
-		  if ((symtab[symndx].st_shndx != SHN_UNDEF
-		       || symtab[symndx].st_value != 0)
-		      && ELFW(ST_TYPE) (symtab[symndx].st_info) != STT_TLS
-		      && DL_ADDR_SYM_MATCH (match, &symtab[symndx],
-					    matchsym, addr)
-		      && symtab[symndx].st_name < strtabsize)
-		    matchsym = (ElfW(Sym) *) &symtab[symndx];
-
-		  ++symndx;
-		}
-	      while ((*hasharr++ & 1u) == 0);
-	    }
-	}
-    }
-  else
-    {
-      const ElfW(Sym) *symtabend;
-      if (match->l_info[DT_HASH] != NULL)
-	symtabend = (symtab
-		     + ((Elf_Symndx *) D_PTR (match, l_info[DT_HASH]))[1]);
-      else
-	/* There is no direct way to determine the number of symbols in the
-	   dynamic symbol table and no hash table is present.  The ELF
-	   binary is ill-formed but what shall we do?  Use the beginning of
-	   the string table which generally follows the symbol table.  */
-	symtabend = (const ElfW(Sym) *) strtab;
-
-      for (; (void *) symtab < (void *) symtabend; ++symtab)
-	if ((ELFW(ST_BIND) (symtab->st_info) == STB_GLOBAL
-	     || ELFW(ST_BIND) (symtab->st_info) == STB_WEAK)
-	    && __glibc_likely (!dl_symbol_visibility_binds_local_p (symtab))
-	    && ELFW(ST_TYPE) (symtab->st_info) != STT_TLS
-	    && (symtab->st_shndx != SHN_UNDEF
-		|| symtab->st_value != 0)
-	    && DL_ADDR_SYM_MATCH (match, symtab, matchsym, addr)
-	    && symtab->st_name < strtabsize)
-	  matchsym = (ElfW(Sym) *) symtab;
-    }
-
-  if (mapp)
-    *mapp = match;
-  if (symbolp)
-    *symbolp = matchsym;
-
-  if (matchsym)
-    {
-      /* We found a symbol close by.  Fill in its name and exact
-	 address.  */
-      lookup_t matchl = LOOKUP_VALUE (match);
-
-      info->dli_sname = strtab + matchsym->st_name;
-      info->dli_saddr = DL_SYMBOL_ADDRESS (matchl, matchsym);
-    }
-  else
-    {
-      /* No symbol matches.  We return only the containing object.  */
-      info->dli_sname = NULL;
-      info->dli_saddr = NULL;
-    }
-}
-
-
-int
-internal_function
-_dl_addr (const void *address, Dl_info *info,
-	  struct link_map **mapp, const ElfW(Sym) **symbolp)
-{
-  const ElfW(Addr) addr = DL_LOOKUP_ADDRESS (address);
-  int result = 0;
-
-  /* Protect against concurrent loads and unloads.  */
-  __rtld_lock_lock_recursive (GL(dl_load_lock));
-
-  struct link_map *l = _dl_find_dso_for_object (addr);
-
-  if (l)
-    {
-      determine_info (addr, l, info, mapp, symbolp);
-      result = 1;
-    }
-
-  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-
-  return result;
-}
-libc_hidden_def (_dl_addr)
diff --git a/elf/dl-brk.c b/elf/dl-brk.c
deleted file mode 100644
index c37cdfec33..0000000000
--- a/elf/dl-brk.c
+++ /dev/null
@@ -1,5 +0,0 @@
-/* We can use the normal code but we also know the __curbrk is not exported
-   from ld.so.  */
-extern void *__curbrk attribute_hidden;
-
-#include <brk.c>
diff --git a/elf/dl-cache.c b/elf/dl-cache.c
deleted file mode 100644
index e9632da0b3..0000000000
--- a/elf/dl-cache.c
+++ /dev/null
@@ -1,325 +0,0 @@
-/* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-#include <sys/mman.h>
-#include <dl-cache.h>
-#include <dl-procinfo.h>
-#include <stdint.h>
-#include <_itoa.h>
-#include <dl-hwcaps.h>
-
-#ifndef _DL_PLATFORMS_COUNT
-# define _DL_PLATFORMS_COUNT 0
-#endif
-
-/* This is the starting address and the size of the mmap()ed file.  */
-static struct cache_file *cache;
-static struct cache_file_new *cache_new;
-static size_t cachesize;
-
-/* 1 if cache_data + PTR points into the cache.  */
-#define _dl_cache_verify_ptr(ptr) (ptr < cache_data_size)
-
-#define SEARCH_CACHE(cache) \
-/* We use binary search since the table is sorted in the cache file.	      \
-   The first matching entry in the table is returned.			      \
-   It is important to use the same algorithm as used while generating	      \
-   the cache file.  */							      \
-do									      \
-  {									      \
-    left = 0;								      \
-    right = cache->nlibs - 1;						      \
-									      \
-    while (left <= right)						      \
-      {									      \
-	__typeof__ (cache->libs[0].key) key;				      \
-									      \
-	middle = (left + right) / 2;					      \
-									      \
-	key = cache->libs[middle].key;					      \
-									      \
-	/* Make sure string table indices are not bogus before using	      \
-	   them.  */							      \
-	if (! _dl_cache_verify_ptr (key))				      \
-	  {								      \
-	    cmpres = 1;							      \
-	    break;							      \
-	  }								      \
-									      \
-	/* Actually compare the entry with the key.  */			      \
-	cmpres = _dl_cache_libcmp (name, cache_data + key);		      \
-	if (__glibc_unlikely (cmpres == 0))				      \
-	  {								      \
-	    /* Found it.  LEFT now marks the last entry for which we	      \
-	       know the name is correct.  */				      \
-	    left = middle;						      \
-									      \
-	    /* There might be entries with this name before the one we	      \
-	       found.  So we have to find the beginning.  */		      \
-	    while (middle > 0)						      \
-	      {								      \
-		__typeof__ (cache->libs[0].key) key;			      \
-									      \
-		key = cache->libs[middle - 1].key;			      \
-		/* Make sure string table indices are not bogus before	      \
-		   using them.  */					      \
-		if (! _dl_cache_verify_ptr (key)			      \
-		    /* Actually compare the entry.  */			      \
-		    || _dl_cache_libcmp (name, cache_data + key) != 0)	      \
-		  break;						      \
-		--middle;						      \
-	      }								      \
-									      \
-	    do								      \
-	      {								      \
-		int flags;						      \
-		__typeof__ (cache->libs[0]) *lib = &cache->libs[middle];      \
-									      \
-		/* Only perform the name test if necessary.  */		      \
-		if (middle > left					      \
-		    /* We haven't seen this string so far.  Test whether the  \
-		       index is ok and whether the name matches.  Otherwise   \
-		       we are done.  */					      \
-		    && (! _dl_cache_verify_ptr (lib->key)		      \
-			|| (_dl_cache_libcmp (name, cache_data + lib->key)    \
-			    != 0)))					      \
-		  break;						      \
-									      \
-		flags = lib->flags;					      \
-		if (_dl_cache_check_flags (flags)			      \
-		    && _dl_cache_verify_ptr (lib->value))		      \
-		  {							      \
-		    if (best == NULL || flags == GLRO(dl_correct_cache_id))   \
-		      {							      \
-			HWCAP_CHECK;					      \
-			best = cache_data + lib->value;			      \
-									      \
-			if (flags == GLRO(dl_correct_cache_id))		      \
-			  /* We've found an exact match for the shared	      \
-			     object and no general `ELF' release.  Stop	      \
-			     searching.  */				      \
-			  break;					      \
-		      }							      \
-		  }							      \
-	      }								      \
-	    while (++middle <= right);					      \
-	    break;							      \
-	}								      \
-									      \
-	if (cmpres < 0)							      \
-	  left = middle + 1;						      \
-	else								      \
-	  right = middle - 1;						      \
-      }									      \
-  }									      \
-while (0)
-
-
-int
-internal_function
-_dl_cache_libcmp (const char *p1, const char *p2)
-{
-  while (*p1 != '\0')
-    {
-      if (*p1 >= '0' && *p1 <= '9')
-        {
-          if (*p2 >= '0' && *p2 <= '9')
-            {
-	      /* Must compare this numerically.  */
-	      int val1;
-	      int val2;
-
-	      val1 = *p1++ - '0';
-	      val2 = *p2++ - '0';
-	      while (*p1 >= '0' && *p1 <= '9')
-	        val1 = val1 * 10 + *p1++ - '0';
-	      while (*p2 >= '0' && *p2 <= '9')
-	        val2 = val2 * 10 + *p2++ - '0';
-	      if (val1 != val2)
-		return val1 - val2;
-	    }
-	  else
-            return 1;
-        }
-      else if (*p2 >= '0' && *p2 <= '9')
-        return -1;
-      else if (*p1 != *p2)
-        return *p1 - *p2;
-      else
-	{
-	  ++p1;
-	  ++p2;
-	}
-    }
-  return *p1 - *p2;
-}
-
-
-/* Look up NAME in ld.so.cache and return the file name stored there, or null
-   if none is found.  The cache is loaded if it was not already.  If loading
-   the cache previously failed there will be no more attempts to load it.
-   The caller is responsible for freeing the returned string.  The ld.so.cache
-   may be unmapped at any time by a completing recursive dlopen and
-   this function must take care that it does not return references to
-   any data in the mapping.  */
-char *
-internal_function
-_dl_load_cache_lookup (const char *name)
-{
-  int left, right, middle;
-  int cmpres;
-  const char *cache_data;
-  uint32_t cache_data_size;
-  const char *best;
-
-  /* Print a message if the loading of libs is traced.  */
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
-    _dl_debug_printf (" search cache=%s\n", LD_SO_CACHE);
-
-  if (cache == NULL)
-    {
-      /* Read the contents of the file.  */
-      void *file = _dl_sysdep_read_whole_file (LD_SO_CACHE, &cachesize,
-					       PROT_READ);
-
-      /* We can handle three different cache file formats here:
-	 - the old libc5/glibc2.0/2.1 format
-	 - the old format with the new format in it
-	 - only the new format
-	 The following checks if the cache contains any of these formats.  */
-      if (file != MAP_FAILED && cachesize > sizeof *cache
-	  && memcmp (file, CACHEMAGIC, sizeof CACHEMAGIC - 1) == 0)
-	{
-	  size_t offset;
-	  /* Looks ok.  */
-	  cache = file;
-
-	  /* Check for new version.  */
-	  offset = ALIGN_CACHE (sizeof (struct cache_file)
-				+ cache->nlibs * sizeof (struct file_entry));
-
-	  cache_new = (struct cache_file_new *) ((void *) cache + offset);
-	  if (cachesize < (offset + sizeof (struct cache_file_new))
-	      || memcmp (cache_new->magic, CACHEMAGIC_VERSION_NEW,
-			 sizeof CACHEMAGIC_VERSION_NEW - 1) != 0)
-	    cache_new = (void *) -1;
-	}
-      else if (file != MAP_FAILED && cachesize > sizeof *cache_new
-	       && memcmp (file, CACHEMAGIC_VERSION_NEW,
-			  sizeof CACHEMAGIC_VERSION_NEW - 1) == 0)
-	{
-	  cache_new = file;
-	  cache = file;
-	}
-      else
-	{
-	  if (file != MAP_FAILED)
-	    __munmap (file, cachesize);
-	  cache = (void *) -1;
-	}
-
-      assert (cache != NULL);
-    }
-
-  if (cache == (void *) -1)
-    /* Previously looked for the cache file and didn't find it.  */
-    return NULL;
-
-  best = NULL;
-
-  if (cache_new != (void *) -1)
-    {
-      uint64_t platform;
-
-      /* This is where the strings start.  */
-      cache_data = (const char *) cache_new;
-
-      /* Now we can compute how large the string table is.  */
-      cache_data_size = (const char *) cache + cachesize - cache_data;
-
-      platform = _dl_string_platform (GLRO(dl_platform));
-      if (platform != (uint64_t) -1)
-	platform = 1ULL << platform;
-
-      uint64_t hwcap_mask = GET_HWCAP_MASK();
-
-#define _DL_HWCAP_TLS_MASK (1LL << 63)
-      uint64_t hwcap_exclude = ~((GLRO(dl_hwcap) & hwcap_mask)
-				 | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK);
-
-      /* Only accept hwcap if it's for the right platform.  */
-#define HWCAP_CHECK \
-      if (lib->hwcap & hwcap_exclude)					      \
-	continue;							      \
-      if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion))	      \
-	continue;							      \
-      if (_DL_PLATFORMS_COUNT						      \
-	  && (lib->hwcap & _DL_HWCAP_PLATFORM) != 0			      \
-	  && (lib->hwcap & _DL_HWCAP_PLATFORM) != platform)		      \
-	continue
-      SEARCH_CACHE (cache_new);
-    }
-  else
-    {
-      /* This is where the strings start.  */
-      cache_data = (const char *) &cache->libs[cache->nlibs];
-
-      /* Now we can compute how large the string table is.  */
-      cache_data_size = (const char *) cache + cachesize - cache_data;
-
-#undef HWCAP_CHECK
-#define HWCAP_CHECK do {} while (0)
-      SEARCH_CACHE (cache);
-    }
-
-  /* Print our result if wanted.  */
-  if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)
-      && best != NULL)
-    _dl_debug_printf ("  trying file=%s\n", best);
-
-  if (best == NULL)
-    return NULL;
-
-  /* The double copy is *required* since malloc may be interposed
-     and call dlopen itself whose completion would unmap the data
-     we are accessing. Therefore we must make the copy of the
-     mapping data without using malloc.  */
-  char *temp;
-  temp = alloca (strlen (best) + 1);
-  strcpy (temp, best);
-  return __strdup (temp);
-}
-
-#ifndef MAP_COPY
-/* If the system does not support MAP_COPY we cannot leave the file open
-   all the time since this would create problems when the file is replaced.
-   Therefore we provide this function to close the file and open it again
-   once needed.  */
-void
-_dl_unload_cache (void)
-{
-  if (cache != NULL && cache != (struct cache_file *) -1)
-    {
-      __munmap (cache, cachesize);
-      cache = NULL;
-    }
-}
-#endif
diff --git a/elf/dl-caller.c b/elf/dl-caller.c
deleted file mode 100644
index b4c5335baa..0000000000
--- a/elf/dl-caller.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/* Check whether caller comes from the right place.
-   Copyright (C) 2004-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <ldsodefs.h>
-#include <stddef.h>
-#include <caller.h>
-#include <gnu/lib-names.h>
-
-
-int
-attribute_hidden
-_dl_check_caller (const void *caller, enum allowmask mask)
-{
-  static const char expected1[] = LIBC_SO;
-  static const char expected2[] = LIBDL_SO;
-#ifdef LIBPTHREAD_SO
-  static const char expected3[] = LIBPTHREAD_SO;
-#endif
-  static const char expected4[] = LD_SO;
-
-  for (Lmid_t ns = 0; ns < GL(dl_nns); ++ns)
-    for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l != NULL;
-	 l = l->l_next)
-      if (caller >= (const void *) l->l_map_start
-	  && caller < (const void *) l->l_text_end)
-	{
-	  /* The address falls into this DSO's address range.  Check the
-	     name.  */
-	  if ((mask & allow_libc) && strcmp (expected1, l->l_name) == 0)
-	    return 0;
-	  if ((mask & allow_libdl) && strcmp (expected2, l->l_name) == 0)
-	    return 0;
-#ifdef LIBPTHREAD_SO
-	  if ((mask & allow_libpthread) && strcmp (expected3, l->l_name) == 0)
-	    return 0;
-#endif
-	  if ((mask & allow_ldso) && strcmp (expected4, l->l_name) == 0)
-	    return 0;
-
-	  struct libname_list *runp = l->l_libname;
-
-	  while (runp != NULL)
-	    {
-	      if ((mask & allow_libc) && strcmp (expected1, runp->name) == 0)
-		return 0;
-	      if ((mask & allow_libdl) && strcmp (expected2, runp->name) == 0)
-		return 0;
-#ifdef LIBPTHREAD_SO
-	      if ((mask & allow_libpthread)
-		  && strcmp (expected3, runp->name) == 0)
-		return 0;
-#endif
-	      if ((mask & allow_ldso) && strcmp (expected4, runp->name) == 0)
-		return 0;
-
-	      runp = runp->next;
-	    }
-
-	  break;
-	}
-
-  /* Maybe the dynamic linker is not yet on the list.  */
-  if ((mask & allow_ldso) != 0
-      && caller >= (const void *) GL(dl_rtld_map).l_map_start
-      && caller < (const void *) GL(dl_rtld_map).l_text_end)
-    return 0;
-
-  /* No valid caller.  */
-  return 1;
-}
diff --git a/elf/dl-close.c b/elf/dl-close.c
deleted file mode 100644
index 2b46b7cf8b..0000000000
--- a/elf/dl-close.c
+++ /dev/null
@@ -1,843 +0,0 @@
-/* Close a shared object opened by `_dl_open'.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <dlfcn.h>
-#include <errno.h>
-#include <libintl.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <libc-lock.h>
-#include <ldsodefs.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sysdep-cancel.h>
-#include <tls.h>
-#include <stap-probe.h>
-
-#include <dl-unmap-segments.h>
-
-
-/* Type of the constructor functions.  */
-typedef void (*fini_t) (void);
-
-
-/* Special l_idx value used to indicate which objects remain loaded.  */
-#define IDX_STILL_USED -1
-
-
-/* Returns true we an non-empty was found.  */
-static bool
-remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
-		 bool should_be_there)
-{
-  if (idx - disp >= listp->len)
-    {
-      if (listp->next == NULL)
-	{
-	  /* The index is not actually valid in the slotinfo list,
-	     because this object was closed before it was fully set
-	     up due to some error.  */
-	  assert (! should_be_there);
-	}
-      else
-	{
-	  if (remove_slotinfo (idx, listp->next, disp + listp->len,
-			       should_be_there))
-	    return true;
-
-	  /* No non-empty entry.  Search from the end of this element's
-	     slotinfo array.  */
-	  idx = disp + listp->len;
-	}
-    }
-  else
-    {
-      struct link_map *old_map = listp->slotinfo[idx - disp].map;
-
-      /* The entry might still be in its unused state if we are closing an
-	 object that wasn't fully set up.  */
-      if (__glibc_likely (old_map != NULL))
-	{
-	  assert (old_map->l_tls_modid == idx);
-
-	  /* Mark the entry as unused. */
-	  listp->slotinfo[idx - disp].gen = GL(dl_tls_generation) + 1;
-	  listp->slotinfo[idx - disp].map = NULL;
-	}
-
-      /* If this is not the last currently used entry no need to look
-	 further.  */
-      if (idx != GL(dl_tls_max_dtv_idx))
-	return true;
-    }
-
-  while (idx - disp > (disp == 0 ? 1 + GL(dl_tls_static_nelem) : 0))
-    {
-      --idx;
-
-      if (listp->slotinfo[idx - disp].map != NULL)
-	{
-	  /* Found a new last used index.  */
-	  GL(dl_tls_max_dtv_idx) = idx;
-	  return true;
-	}
-    }
-
-  /* No non-entry in this list element.  */
-  return false;
-}
-
-
-void
-_dl_close_worker (struct link_map *map, bool force)
-{
-  /* One less direct use.  */
-  --map->l_direct_opencount;
-
-  /* If _dl_close is called recursively (some destructor call dlclose),
-     just record that the parent _dl_close will need to do garbage collection
-     again and return.  */
-  static enum { not_pending, pending, rerun } dl_close_state;
-
-  if (map->l_direct_opencount > 0 || map->l_type != lt_loaded
-      || dl_close_state != not_pending)
-    {
-      if (map->l_direct_opencount == 0 && map->l_type == lt_loaded)
-	dl_close_state = rerun;
-
-      /* There are still references to this object.  Do nothing more.  */
-      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
-	_dl_debug_printf ("\nclosing file=%s; direct_opencount=%u\n",
-			  map->l_name, map->l_direct_opencount);
-
-      return;
-    }
-
-  Lmid_t nsid = map->l_ns;
-  struct link_namespaces *ns = &GL(dl_ns)[nsid];
-
- retry:
-  dl_close_state = pending;
-
-  bool any_tls = false;
-  const unsigned int nloaded = ns->_ns_nloaded;
-  char used[nloaded];
-  char done[nloaded];
-  struct link_map *maps[nloaded];
-
-  /* Clear DF_1_NODELETE to force object deletion.  We don't need to touch
-     l_tls_dtor_count because forced object deletion only happens when an
-     error occurs during object load.  Destructor registration for TLS
-     non-POD objects should not have happened till then for this
-     object.  */
-  if (force)
-    map->l_flags_1 &= ~DF_1_NODELETE;
-
-  /* Run over the list and assign indexes to the link maps and enter
-     them into the MAPS array.  */
-  int idx = 0;
-  for (struct link_map *l = ns->_ns_loaded; l != NULL; l = l->l_next)
-    {
-      l->l_idx = idx;
-      maps[idx] = l;
-      ++idx;
-
-    }
-  assert (idx == nloaded);
-
-  /* Prepare the bitmaps.  */
-  memset (used, '\0', sizeof (used));
-  memset (done, '\0', sizeof (done));
-
-  /* Keep track of the lowest index link map we have covered already.  */
-  int done_index = -1;
-  while (++done_index < nloaded)
-    {
-      struct link_map *l = maps[done_index];
-
-      if (done[done_index])
-	/* Already handled.  */
-	continue;
-
-      /* Check whether this object is still used.  */
-      if (l->l_type == lt_loaded
-	  && l->l_direct_opencount == 0
-	  && (l->l_flags_1 & DF_1_NODELETE) == 0
-	  /* See CONCURRENCY NOTES in cxa_thread_atexit_impl.c to know why
-	     acquire is sufficient and correct.  */
-	  && atomic_load_acquire (&l->l_tls_dtor_count) == 0
-	  && !used[done_index])
-	continue;
-
-      /* We need this object and we handle it now.  */
-      done[done_index] = 1;
-      used[done_index] = 1;
-      /* Signal the object is still needed.  */
-      l->l_idx = IDX_STILL_USED;
-
-      /* Mark all dependencies as used.  */
-      if (l->l_initfini != NULL)
-	{
-	  /* We are always the zeroth entry, and since we don't include
-	     ourselves in the dependency analysis start at 1.  */
-	  struct link_map **lp = &l->l_initfini[1];
-	  while (*lp != NULL)
-	    {
-	      if ((*lp)->l_idx != IDX_STILL_USED)
-		{
-		  assert ((*lp)->l_idx >= 0 && (*lp)->l_idx < nloaded);
-
-		  if (!used[(*lp)->l_idx])
-		    {
-		      used[(*lp)->l_idx] = 1;
-		      /* If we marked a new object as used, and we've
-			 already processed it, then we need to go back
-			 and process again from that point forward to
-			 ensure we keep all of its dependencies also.  */
-		      if ((*lp)->l_idx - 1 < done_index)
-			done_index = (*lp)->l_idx - 1;
-		    }
-		}
-
-	      ++lp;
-	    }
-	}
-      /* And the same for relocation dependencies.  */
-      if (l->l_reldeps != NULL)
-	for (unsigned int j = 0; j < l->l_reldeps->act; ++j)
-	  {
-	    struct link_map *jmap = l->l_reldeps->list[j];
-
-	    if (jmap->l_idx != IDX_STILL_USED)
-	      {
-		assert (jmap->l_idx >= 0 && jmap->l_idx < nloaded);
-
-		if (!used[jmap->l_idx])
-		  {
-		    used[jmap->l_idx] = 1;
-		    if (jmap->l_idx - 1 < done_index)
-		      done_index = jmap->l_idx - 1;
-		  }
-	      }
-	  }
-    }
-
-  /* Sort the entries.  */
-  _dl_sort_fini (maps, nloaded, used, nsid);
-
-  /* Call all termination functions at once.  */
-#ifdef SHARED
-  bool do_audit = GLRO(dl_naudit) > 0 && !ns->_ns_loaded->l_auditing;
-#endif
-  bool unload_any = false;
-  bool scope_mem_left = false;
-  unsigned int unload_global = 0;
-  unsigned int first_loaded = ~0;
-  for (unsigned int i = 0; i < nloaded; ++i)
-    {
-      struct link_map *imap = maps[i];
-
-      /* All elements must be in the same namespace.  */
-      assert (imap->l_ns == nsid);
-
-      if (!used[i])
-	{
-	  assert (imap->l_type == lt_loaded
-		  && (imap->l_flags_1 & DF_1_NODELETE) == 0);
-
-	  /* Call its termination function.  Do not do it for
-	     half-cooked objects.  */
-	  if (imap->l_init_called)
-	    {
-	      /* When debugging print a message first.  */
-	      if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS,
-				    0))
-		_dl_debug_printf ("\ncalling fini: %s [%lu]\n\n",
-				  imap->l_name, nsid);
-
-	      if (imap->l_info[DT_FINI_ARRAY] != NULL)
-		{
-		  ElfW(Addr) *array =
-		    (ElfW(Addr) *) (imap->l_addr
-				    + imap->l_info[DT_FINI_ARRAY]->d_un.d_ptr);
-		  unsigned int sz = (imap->l_info[DT_FINI_ARRAYSZ]->d_un.d_val
-				     / sizeof (ElfW(Addr)));
-
-		  while (sz-- > 0)
-		    ((fini_t) array[sz]) ();
-		}
-
-	      /* Next try the old-style destructor.  */
-	      if (imap->l_info[DT_FINI] != NULL)
-		DL_CALL_DT_FINI (imap, ((void *) imap->l_addr
-			 + imap->l_info[DT_FINI]->d_un.d_ptr));
-	    }
-
-#ifdef SHARED
-	  /* Auditing checkpoint: we remove an object.  */
-	  if (__glibc_unlikely (do_audit))
-	    {
-	      struct audit_ifaces *afct = GLRO(dl_audit);
-	      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-		{
-		  if (afct->objclose != NULL)
-		    /* Return value is ignored.  */
-		    (void) afct->objclose (&imap->l_audit[cnt].cookie);
-
-		  afct = afct->next;
-		}
-	    }
-#endif
-
-	  /* This object must not be used anymore.  */
-	  imap->l_removed = 1;
-
-	  /* We indeed have an object to remove.  */
-	  unload_any = true;
-
-	  if (imap->l_global)
-	    ++unload_global;
-
-	  /* Remember where the first dynamically loaded object is.  */
-	  if (i < first_loaded)
-	    first_loaded = i;
-	}
-      /* Else used[i].  */
-      else if (imap->l_type == lt_loaded)
-	{
-	  struct r_scope_elem *new_list = NULL;
-
-	  if (imap->l_searchlist.r_list == NULL && imap->l_initfini != NULL)
-	    {
-	      /* The object is still used.  But one of the objects we are
-		 unloading right now is responsible for loading it.  If
-		 the current object does not have it's own scope yet we
-		 have to create one.  This has to be done before running
-		 the finalizers.
-
-		 To do this count the number of dependencies.  */
-	      unsigned int cnt;
-	      for (cnt = 1; imap->l_initfini[cnt] != NULL; ++cnt)
-		;
-
-	      /* We simply reuse the l_initfini list.  */
-	      imap->l_searchlist.r_list = &imap->l_initfini[cnt + 1];
-	      imap->l_searchlist.r_nlist = cnt;
-
-	      new_list = &imap->l_searchlist;
-	    }
-
-	  /* Count the number of scopes which remain after the unload.
-	     When we add the local search list count it.  Always add
-	     one for the terminating NULL pointer.  */
-	  size_t remain = (new_list != NULL) + 1;
-	  bool removed_any = false;
-	  for (size_t cnt = 0; imap->l_scope[cnt] != NULL; ++cnt)
-	    /* This relies on l_scope[] entries being always set either
-	       to its own l_symbolic_searchlist address, or some map's
-	       l_searchlist address.  */
-	    if (imap->l_scope[cnt] != &imap->l_symbolic_searchlist)
-	      {
-		struct link_map *tmap = (struct link_map *)
-		  ((char *) imap->l_scope[cnt]
-		   - offsetof (struct link_map, l_searchlist));
-		assert (tmap->l_ns == nsid);
-		if (tmap->l_idx == IDX_STILL_USED)
-		  ++remain;
-		else
-		  removed_any = true;
-	      }
-	    else
-	      ++remain;
-
-	  if (removed_any)
-	    {
-	      /* Always allocate a new array for the scope.  This is
-		 necessary since we must be able to determine the last
-		 user of the current array.  If possible use the link map's
-		 memory.  */
-	      size_t new_size;
-	      struct r_scope_elem **newp;
-
-#define SCOPE_ELEMS(imap) \
-  (sizeof (imap->l_scope_mem) / sizeof (imap->l_scope_mem[0]))
-
-	      if (imap->l_scope != imap->l_scope_mem
-		  && remain < SCOPE_ELEMS (imap))
-		{
-		  new_size = SCOPE_ELEMS (imap);
-		  newp = imap->l_scope_mem;
-		}
-	      else
-		{
-		  new_size = imap->l_scope_max;
-		  newp = (struct r_scope_elem **)
-		    malloc (new_size * sizeof (struct r_scope_elem *));
-		  if (newp == NULL)
-		    _dl_signal_error (ENOMEM, "dlclose", NULL,
-				      N_("cannot create scope list"));
-		}
-
-	      /* Copy over the remaining scope elements.  */
-	      remain = 0;
-	      for (size_t cnt = 0; imap->l_scope[cnt] != NULL; ++cnt)
-		{
-		  if (imap->l_scope[cnt] != &imap->l_symbolic_searchlist)
-		    {
-		      struct link_map *tmap = (struct link_map *)
-			((char *) imap->l_scope[cnt]
-			 - offsetof (struct link_map, l_searchlist));
-		      if (tmap->l_idx != IDX_STILL_USED)
-			{
-			  /* Remove the scope.  Or replace with own map's
-			     scope.  */
-			  if (new_list != NULL)
-			    {
-			      newp[remain++] = new_list;
-			      new_list = NULL;
-			    }
-			  continue;
-			}
-		    }
-
-		  newp[remain++] = imap->l_scope[cnt];
-		}
-	      newp[remain] = NULL;
-
-	      struct r_scope_elem **old = imap->l_scope;
-
-	      imap->l_scope = newp;
-
-	      /* No user anymore, we can free it now.  */
-	      if (old != imap->l_scope_mem)
-		{
-		  if (_dl_scope_free (old))
-		    /* If _dl_scope_free used THREAD_GSCOPE_WAIT (),
-		       no need to repeat it.  */
-		    scope_mem_left = false;
-		}
-	      else
-		scope_mem_left = true;
-
-	      imap->l_scope_max = new_size;
-	    }
-	  else if (new_list != NULL)
-	    {
-	      /* We didn't change the scope array, so reset the search
-		 list.  */
-	      imap->l_searchlist.r_list = NULL;
-	      imap->l_searchlist.r_nlist = 0;
-	    }
-
-	  /* The loader is gone, so mark the object as not having one.
-	     Note: l_idx != IDX_STILL_USED -> object will be removed.  */
-	  if (imap->l_loader != NULL
-	      && imap->l_loader->l_idx != IDX_STILL_USED)
-	    imap->l_loader = NULL;
-
-	  /* Remember where the first dynamically loaded object is.  */
-	  if (i < first_loaded)
-	    first_loaded = i;
-	}
-    }
-
-  /* If there are no objects to unload, do nothing further.  */
-  if (!unload_any)
-    goto out;
-
-#ifdef SHARED
-  /* Auditing checkpoint: we will start deleting objects.  */
-  if (__glibc_unlikely (do_audit))
-    {
-      struct link_map *head = ns->_ns_loaded;
-      struct audit_ifaces *afct = GLRO(dl_audit);
-      /* Do not call the functions for any auditing object.  */
-      if (head->l_auditing == 0)
-	{
-	  for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-	    {
-	      if (afct->activity != NULL)
-		afct->activity (&head->l_audit[cnt].cookie, LA_ACT_DELETE);
-
-	      afct = afct->next;
-	    }
-	}
-    }
-#endif
-
-  /* Notify the debugger we are about to remove some loaded objects.  */
-  struct r_debug *r = _dl_debug_initialize (0, nsid);
-  r->r_state = RT_DELETE;
-  _dl_debug_state ();
-  LIBC_PROBE (unmap_start, 2, nsid, r);
-
-  if (unload_global)
-    {
-      /* Some objects are in the global scope list.  Remove them.  */
-      struct r_scope_elem *ns_msl = ns->_ns_main_searchlist;
-      unsigned int i;
-      unsigned int j = 0;
-      unsigned int cnt = ns_msl->r_nlist;
-
-      while (cnt > 0 && ns_msl->r_list[cnt - 1]->l_removed)
-	--cnt;
-
-      if (cnt + unload_global == ns_msl->r_nlist)
-	/* Speed up removing most recently added objects.  */
-	j = cnt;
-      else
-	for (i = 0; i < cnt; i++)
-	  if (ns_msl->r_list[i]->l_removed == 0)
-	    {
-	      if (i != j)
-		ns_msl->r_list[j] = ns_msl->r_list[i];
-	      j++;
-	    }
-      ns_msl->r_nlist = j;
-    }
-
-  if (!RTLD_SINGLE_THREAD_P
-      && (unload_global
-	  || scope_mem_left
-	  || (GL(dl_scope_free_list) != NULL
-	      && GL(dl_scope_free_list)->count)))
-    {
-      THREAD_GSCOPE_WAIT ();
-
-      /* Now we can free any queued old scopes.  */
-      struct dl_scope_free_list *fsl = GL(dl_scope_free_list);
-      if (fsl != NULL)
-	while (fsl->count > 0)
-	  free (fsl->list[--fsl->count]);
-    }
-
-  size_t tls_free_start;
-  size_t tls_free_end;
-  tls_free_start = tls_free_end = NO_TLS_OFFSET;
-
-  /* We modify the list of loaded objects.  */
-  __rtld_lock_lock_recursive (GL(dl_load_write_lock));
-
-  /* Check each element of the search list to see if all references to
-     it are gone.  */
-  for (unsigned int i = first_loaded; i < nloaded; ++i)
-    {
-      struct link_map *imap = maps[i];
-      if (!used[i])
-	{
-	  assert (imap->l_type == lt_loaded);
-
-	  /* That was the last reference, and this was a dlopen-loaded
-	     object.  We can unmap it.  */
-
-	  /* Remove the object from the dtv slotinfo array if it uses TLS.  */
-	  if (__glibc_unlikely (imap->l_tls_blocksize > 0))
-	    {
-	      any_tls = true;
-
-	      if (GL(dl_tls_dtv_slotinfo_list) != NULL
-		  && ! remove_slotinfo (imap->l_tls_modid,
-					GL(dl_tls_dtv_slotinfo_list), 0,
-					imap->l_init_called))
-		/* All dynamically loaded modules with TLS are unloaded.  */
-		GL(dl_tls_max_dtv_idx) = GL(dl_tls_static_nelem);
-
-	      if (imap->l_tls_offset != NO_TLS_OFFSET
-		  && imap->l_tls_offset != FORCED_DYNAMIC_TLS_OFFSET)
-		{
-		  /* Collect a contiguous chunk built from the objects in
-		     this search list, going in either direction.  When the
-		     whole chunk is at the end of the used area then we can
-		     reclaim it.  */
-#if TLS_TCB_AT_TP
-		  if (tls_free_start == NO_TLS_OFFSET
-		      || (size_t) imap->l_tls_offset == tls_free_start)
-		    {
-		      /* Extend the contiguous chunk being reclaimed.  */
-		      tls_free_start
-			= imap->l_tls_offset - imap->l_tls_blocksize;
-
-		      if (tls_free_end == NO_TLS_OFFSET)
-			tls_free_end = imap->l_tls_offset;
-		    }
-		  else if (imap->l_tls_offset - imap->l_tls_blocksize
-			   == tls_free_end)
-		    /* Extend the chunk backwards.  */
-		    tls_free_end = imap->l_tls_offset;
-		  else
-		    {
-		      /* This isn't contiguous with the last chunk freed.
-			 One of them will be leaked unless we can free
-			 one block right away.  */
-		      if (tls_free_end == GL(dl_tls_static_used))
-			{
-			  GL(dl_tls_static_used) = tls_free_start;
-			  tls_free_end = imap->l_tls_offset;
-			  tls_free_start
-			    = tls_free_end - imap->l_tls_blocksize;
-			}
-		      else if ((size_t) imap->l_tls_offset
-			       == GL(dl_tls_static_used))
-			GL(dl_tls_static_used)
-			  = imap->l_tls_offset - imap->l_tls_blocksize;
-		      else if (tls_free_end < (size_t) imap->l_tls_offset)
-			{
-			  /* We pick the later block.  It has a chance to
-			     be freed.  */
-			  tls_free_end = imap->l_tls_offset;
-			  tls_free_start
-			    = tls_free_end - imap->l_tls_blocksize;
-			}
-		    }
-#elif TLS_DTV_AT_TP
-		  if (tls_free_start == NO_TLS_OFFSET)
-		    {
-		      tls_free_start = imap->l_tls_firstbyte_offset;
-		      tls_free_end = (imap->l_tls_offset
-				      + imap->l_tls_blocksize);
-		    }
-		  else if (imap->l_tls_firstbyte_offset == tls_free_end)
-		    /* Extend the contiguous chunk being reclaimed.  */
-		    tls_free_end = imap->l_tls_offset + imap->l_tls_blocksize;
-		  else if (imap->l_tls_offset + imap->l_tls_blocksize
-			   == tls_free_start)
-		    /* Extend the chunk backwards.  */
-		    tls_free_start = imap->l_tls_firstbyte_offset;
-		  /* This isn't contiguous with the last chunk freed.
-		     One of them will be leaked unless we can free
-		     one block right away.  */
-		  else if (imap->l_tls_offset + imap->l_tls_blocksize
-			   == GL(dl_tls_static_used))
-		    GL(dl_tls_static_used) = imap->l_tls_firstbyte_offset;
-		  else if (tls_free_end == GL(dl_tls_static_used))
-		    {
-		      GL(dl_tls_static_used) = tls_free_start;
-		      tls_free_start = imap->l_tls_firstbyte_offset;
-		      tls_free_end = imap->l_tls_offset + imap->l_tls_blocksize;
-		    }
-		  else if (tls_free_end < imap->l_tls_firstbyte_offset)
-		    {
-		      /* We pick the later block.  It has a chance to
-			 be freed.  */
-		      tls_free_start = imap->l_tls_firstbyte_offset;
-		      tls_free_end = imap->l_tls_offset + imap->l_tls_blocksize;
-		    }
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
-		}
-	    }
-
-	  /* Reset unique symbols if forced.  */
-	  if (force)
-	    {
-	      struct unique_sym_table *tab = &ns->_ns_unique_sym_table;
-	      __rtld_lock_lock_recursive (tab->lock);
-	      struct unique_sym *entries = tab->entries;
-	      if (entries != NULL)
-		{
-		  size_t idx, size = tab->size;
-		  for (idx = 0; idx < size; ++idx)
-		    {
-		      /* Clear unique symbol entries that belong to this
-			 object.  */
-		      if (entries[idx].name != NULL
-			  && entries[idx].map == imap)
-			{
-			  entries[idx].name = NULL;
-			  entries[idx].hashval = 0;
-			  tab->n_elements--;
-			}
-		    }
-		}
-	      __rtld_lock_unlock_recursive (tab->lock);
-	    }
-
-	  /* We can unmap all the maps at once.  We determined the
-	     start address and length when we loaded the object and
-	     the `munmap' call does the rest.  */
-	  DL_UNMAP (imap);
-
-	  /* Finally, unlink the data structure and free it.  */
-#if DL_NNS == 1
-	  /* The assert in the (imap->l_prev == NULL) case gives
-	     the compiler license to warn that NS points outside
-	     the dl_ns array bounds in that case (as nsid != LM_ID_BASE
-	     is tantamount to nsid >= DL_NNS).  That should be impossible
-	     in this configuration, so just assert about it instead.  */
-	  assert (nsid == LM_ID_BASE);
-	  assert (imap->l_prev != NULL);
-#else
-	  if (imap->l_prev == NULL)
-	    {
-	      assert (nsid != LM_ID_BASE);
-	      ns->_ns_loaded = imap->l_next;
-
-	      /* Update the pointer to the head of the list
-		 we leave for debuggers to examine.  */
-	      r->r_map = (void *) ns->_ns_loaded;
-	    }
-	  else
-#endif
-	    imap->l_prev->l_next = imap->l_next;
-
-	  --ns->_ns_nloaded;
-	  if (imap->l_next != NULL)
-	    imap->l_next->l_prev = imap->l_prev;
-
-	  free (imap->l_versions);
-	  if (imap->l_origin != (char *) -1)
-	    free ((char *) imap->l_origin);
-
-	  free (imap->l_reldeps);
-
-	  /* Print debugging message.  */
-	  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
-	    _dl_debug_printf ("\nfile=%s [%lu];  destroying link map\n",
-			      imap->l_name, imap->l_ns);
-
-	  /* This name always is allocated.  */
-	  free (imap->l_name);
-	  /* Remove the list with all the names of the shared object.  */
-
-	  struct libname_list *lnp = imap->l_libname;
-	  do
-	    {
-	      struct libname_list *this = lnp;
-	      lnp = lnp->next;
-	      if (!this->dont_free)
-		free (this);
-	    }
-	  while (lnp != NULL);
-
-	  /* Remove the searchlists.  */
-	  free (imap->l_initfini);
-
-	  /* Remove the scope array if we allocated it.  */
-	  if (imap->l_scope != imap->l_scope_mem)
-	    free (imap->l_scope);
-
-	  if (imap->l_phdr_allocated)
-	    free ((void *) imap->l_phdr);
-
-	  if (imap->l_rpath_dirs.dirs != (void *) -1)
-	    free (imap->l_rpath_dirs.dirs);
-	  if (imap->l_runpath_dirs.dirs != (void *) -1)
-	    free (imap->l_runpath_dirs.dirs);
-
-	  free (imap);
-	}
-    }
-
-  __rtld_lock_unlock_recursive (GL(dl_load_write_lock));
-
-  /* If we removed any object which uses TLS bump the generation counter.  */
-  if (any_tls)
-    {
-      if (__glibc_unlikely (++GL(dl_tls_generation) == 0))
-	_dl_fatal_printf ("TLS generation counter wrapped!  Please report as described in "REPORT_BUGS_TO".\n");
-
-      if (tls_free_end == GL(dl_tls_static_used))
-	GL(dl_tls_static_used) = tls_free_start;
-    }
-
-#ifdef SHARED
-  /* Auditing checkpoint: we have deleted all objects.  */
-  if (__glibc_unlikely (do_audit))
-    {
-      struct link_map *head = ns->_ns_loaded;
-      /* Do not call the functions for any auditing object.  */
-      if (head->l_auditing == 0)
-	{
-	  struct audit_ifaces *afct = GLRO(dl_audit);
-	  for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-	    {
-	      if (afct->activity != NULL)
-		afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT);
-
-	      afct = afct->next;
-	    }
-	}
-    }
-#endif
-
-  if (__builtin_expect (ns->_ns_loaded == NULL, 0)
-      && nsid == GL(dl_nns) - 1)
-    do
-      --GL(dl_nns);
-    while (GL(dl_ns)[GL(dl_nns) - 1]._ns_loaded == NULL);
-
-  /* Notify the debugger those objects are finalized and gone.  */
-  r->r_state = RT_CONSISTENT;
-  _dl_debug_state ();
-  LIBC_PROBE (unmap_complete, 2, nsid, r);
-
-  /* Recheck if we need to retry, release the lock.  */
- out:
-  if (dl_close_state == rerun)
-    goto retry;
-
-  dl_close_state = not_pending;
-}
-
-
-void
-_dl_close (void *_map)
-{
-  struct link_map *map = _map;
-
-  /* We must take the lock to examine the contents of map and avoid
-     concurrent dlopens.  */
-  __rtld_lock_lock_recursive (GL(dl_load_lock));
-
-  /* At this point we are guaranteed nobody else is touching the list of
-     loaded maps, but a concurrent dlclose might have freed our map
-     before we took the lock. There is no way to detect this (see below)
-     so we proceed assuming this isn't the case.  First see whether we
-     can remove the object at all.  */
-  if (__glibc_unlikely (map->l_flags_1 & DF_1_NODELETE))
-    {
-      /* Nope.  Do nothing.  */
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
-      return;
-    }
-
-  /* At present this is an unreliable check except in the case where the
-     caller has recursively called dlclose and we are sure the link map
-     has not been freed.  In a non-recursive dlclose the map itself
-     might have been freed and this access is potentially a data race
-     with whatever other use this memory might have now, or worse we
-     might silently corrupt memory if it looks enough like a link map.
-     POSIX has language in dlclose that appears to guarantee that this
-     should be a detectable case and given that dlclose should be threadsafe
-     we need this to be a reliable detection.
-     This is bug 20990. */
-  if (__builtin_expect (map->l_direct_opencount, 1) == 0)
-    {
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
-      _dl_signal_error (0, map->l_name, NULL, N_("shared object not open"));
-    }
-
-  _dl_close_worker (map, false);
-
-  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-}
diff --git a/elf/dl-conflict.c b/elf/dl-conflict.c
deleted file mode 100644
index 3cbd07435e..0000000000
--- a/elf/dl-conflict.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Resolve conflicts against already prelinked libraries.
-   Copyright (C) 2001-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public License as
-   published by the Free Software Foundation; either version 2.1 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If
-   not, see <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <libintl.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include "dynamic-link.h"
-
-void
-_dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
-		       ElfW(Rela) *conflictend)
-{
-#if ! ELF_MACHINE_NO_RELA
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_RELOC))
-    _dl_debug_printf ("\nconflict processing: %s\n", DSO_FILENAME (l->l_name));
-
-  {
-    /* Do the conflict relocation of the object and library GOT and other
-       data.  */
-
-    /* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code.  */
-#define RESOLVE_MAP(ref, version, flags) (*ref = NULL, NULL)
-#define RESOLVE(ref, version, flags) (*ref = NULL, 0)
-#define RESOLVE_CONFLICT_FIND_MAP(map, r_offset) \
-  do {									      \
-    while ((resolve_conflict_map->l_map_end < (ElfW(Addr)) (r_offset))	      \
-	   || (resolve_conflict_map->l_map_start > (ElfW(Addr)) (r_offset)))  \
-      resolve_conflict_map = resolve_conflict_map->l_next;		      \
-									      \
-    (map) = resolve_conflict_map;					      \
-  } while (0)
-
-    /* Prelinking makes no sense for anything but the main namespace.  */
-    assert (l->l_ns == LM_ID_BASE);
-    struct link_map *resolve_conflict_map __attribute__ ((__unused__))
-      = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
-
-#include "dynamic-link.h"
-
-    /* Override these, defined in dynamic-link.h.  */
-#undef CHECK_STATIC_TLS
-#define CHECK_STATIC_TLS(ref_map, sym_map) ((void) 0)
-#undef TRY_STATIC_TLS
-#define TRY_STATIC_TLS(ref_map, sym_map) (0)
-
-    GL(dl_num_cache_relocations) += conflictend - conflict;
-
-    for (; conflict < conflictend; ++conflict)
-      elf_machine_rela (l, conflict, NULL, NULL, (void *) conflict->r_offset,
-			0);
-  }
-#endif
-}
diff --git a/elf/dl-debug.c b/elf/dl-debug.c
deleted file mode 100644
index f3957044f6..0000000000
--- a/elf/dl-debug.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Communicate dynamic linker state to the debugger at runtime.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <ldsodefs.h>
-
-
-/* These are the members in the public `struct link_map' type.
-   Sanity check that the internal type and the public type match.  */
-#define VERIFY_MEMBER(name) \
-  (offsetof (struct link_map_public, name) == offsetof (struct link_map, name))
-extern const int verify_link_map_members[(VERIFY_MEMBER (l_addr)
-					  && VERIFY_MEMBER (l_name)
-					  && VERIFY_MEMBER (l_ld)
-					  && VERIFY_MEMBER (l_next)
-					  && VERIFY_MEMBER (l_prev))
-					 ? 1 : -1];
-
-/* This structure communicates dl state to the debugger.  The debugger
-   normally finds it via the DT_DEBUG entry in the dynamic section, but in
-   a statically-linked program there is no dynamic section for the debugger
-   to examine and it looks for this particular symbol name.  */
-struct r_debug _r_debug;
-
-
-/* Initialize _r_debug if it has not already been done.  The argument is
-   the run-time load address of the dynamic linker, to be put in
-   _r_debug.r_ldbase.  Returns the address of _r_debug.  */
-
-struct r_debug *
-internal_function
-_dl_debug_initialize (ElfW(Addr) ldbase, Lmid_t ns)
-{
-  struct r_debug *r;
-
-  if (ns == LM_ID_BASE)
-    r = &_r_debug;
-  else
-    r = &GL(dl_ns)[ns]._ns_debug;
-
-  if (r->r_map == NULL || ldbase != 0)
-    {
-      /* Tell the debugger where to find the map of loaded objects.  */
-      r->r_version = 1	/* R_DEBUG_VERSION XXX */;
-      r->r_ldbase = ldbase ?: _r_debug.r_ldbase;
-      r->r_map = (void *) GL(dl_ns)[ns]._ns_loaded;
-      r->r_brk = (ElfW(Addr)) &_dl_debug_state;
-    }
-
-  return r;
-}
-
-
-/* This function exists solely to have a breakpoint set on it by the
-   debugger.  The debugger is supposed to find this function's address by
-   examining the r_brk member of struct r_debug, but GDB 4.15 in fact looks
-   for this particular symbol name in the PT_INTERP file.  */
-void
-_dl_debug_state (void)
-{
-}
-rtld_hidden_def (_dl_debug_state)
diff --git a/elf/dl-deps.c b/elf/dl-deps.c
deleted file mode 100644
index 1b8bac6593..0000000000
--- a/elf/dl-deps.c
+++ /dev/null
@@ -1,688 +0,0 @@
-/* Load the dependencies of a mapped object.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <atomic.h>
-#include <assert.h>
-#include <dlfcn.h>
-#include <errno.h>
-#include <libintl.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <ldsodefs.h>
-
-#include <dl-dst.h>
-
-/* Whether an shared object references one or more auxiliary objects
-   is signaled by the AUXTAG entry in l_info.  */
-#define AUXTAG	(DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM \
-		 + DT_EXTRATAGIDX (DT_AUXILIARY))
-/* Whether an shared object references one or more auxiliary objects
-   is signaled by the AUXTAG entry in l_info.  */
-#define FILTERTAG (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGNUM \
-		   + DT_EXTRATAGIDX (DT_FILTER))
-
-
-/* When loading auxiliary objects we must ignore errors.  It's ok if
-   an object is missing.  */
-struct openaux_args
-  {
-    /* The arguments to openaux.  */
-    struct link_map *map;
-    int trace_mode;
-    int open_mode;
-    const char *strtab;
-    const char *name;
-
-    /* The return value of openaux.  */
-    struct link_map *aux;
-  };
-
-static void
-openaux (void *a)
-{
-  struct openaux_args *args = (struct openaux_args *) a;
-
-  args->aux = _dl_map_object (args->map, args->name,
-			      (args->map->l_type == lt_executable
-			       ? lt_library : args->map->l_type),
-			      args->trace_mode, args->open_mode,
-			      args->map->l_ns);
-}
-
-static ptrdiff_t
-internal_function
-_dl_build_local_scope (struct link_map **list, struct link_map *map)
-{
-  struct link_map **p = list;
-  struct link_map **q;
-
-  *p++ = map;
-  map->l_reserved = 1;
-  if (map->l_initfini)
-    for (q = map->l_initfini + 1; *q; ++q)
-      if (! (*q)->l_reserved)
-	p += _dl_build_local_scope (p, *q);
-  return p - list;
-}
-
-
-/* We use a very special kind of list to track the path
-   through the list of loaded shared objects.  We have to
-   produce a flat list with unique members of all involved objects.
-*/
-struct list
-  {
-    int done;			/* Nonzero if this map was processed.  */
-    struct link_map *map;	/* The data.  */
-    struct list *next;		/* Elements for normal list.  */
-  };
-
-
-/* Macro to expand DST.  It is an macro since we use `alloca'.  */
-#define expand_dst(l, str, fatal) \
-  ({									      \
-    const char *__str = (str);						      \
-    const char *__result = __str;					      \
-    size_t __dst_cnt = DL_DST_COUNT (__str, 0);				      \
-									      \
-    if (__dst_cnt != 0)							      \
-      {									      \
-	char *__newp;							      \
-									      \
-	/* DST must not appear in SUID/SGID programs.  */		      \
-	if (__libc_enable_secure)					      \
-	  _dl_signal_error (0, __str, NULL, N_("\
-DST not allowed in SUID/SGID programs"));				      \
-									      \
-	__newp = (char *) alloca (DL_DST_REQUIRED (l, __str, strlen (__str),  \
-						   __dst_cnt));		      \
-									      \
-	__result = _dl_dst_substitute (l, __str, __newp, 0);		      \
-									      \
-	if (*__result == '\0')						      \
-	  {								      \
-	    /* The replacement for the DST is not known.  We can't	      \
-	       processed.  */						      \
-	    if (fatal)							      \
-	      _dl_signal_error (0, __str, NULL, N_("\
-empty dynamic string token substitution"));				      \
-	    else							      \
-	      {								      \
-		/* This is for DT_AUXILIARY.  */			      \
-		if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))   \
-		  _dl_debug_printf (N_("\
-cannot load auxiliary `%s' because of empty dynamic string token "	      \
-					    "substitution\n"), __str);	      \
-		continue;						      \
-	      }								      \
-	  }								      \
-      }									      \
-									      \
-    __result; })
-
-static void
-preload (struct list *known, unsigned int *nlist, struct link_map *map)
-{
-  known[*nlist].done = 0;
-  known[*nlist].map = map;
-  known[*nlist].next = &known[*nlist + 1];
-
-  ++*nlist;
-  /* We use `l_reserved' as a mark bit to detect objects we have
-     already put in the search list and avoid adding duplicate
-     elements later in the list.  */
-  map->l_reserved = 1;
-}
-
-void
-internal_function
-_dl_map_object_deps (struct link_map *map,
-		     struct link_map **preloads, unsigned int npreloads,
-		     int trace_mode, int open_mode)
-{
-  struct list *known = __alloca (sizeof *known * (1 + npreloads + 1));
-  struct list *runp, *tail;
-  unsigned int nlist, i;
-  /* Object name.  */
-  const char *name;
-  int errno_saved;
-  int errno_reason;
-  const char *errstring;
-  const char *objname;
-
-  /* No loaded object so far.  */
-  nlist = 0;
-
-  /* First load MAP itself.  */
-  preload (known, &nlist, map);
-
-  /* Add the preloaded items after MAP but before any of its dependencies.  */
-  for (i = 0; i < npreloads; ++i)
-    preload (known, &nlist, preloads[i]);
-
-  /* Terminate the lists.  */
-  known[nlist - 1].next = NULL;
-
-  /* Pointer to last unique object.  */
-  tail = &known[nlist - 1];
-
-  /* No alloca'd space yet.  */
-  struct link_map **needed_space = NULL;
-  size_t needed_space_bytes = 0;
-
-  /* Process each element of the search list, loading each of its
-     auxiliary objects and immediate dependencies.  Auxiliary objects
-     will be added in the list before the object itself and
-     dependencies will be appended to the list as we step through it.
-     This produces a flat, ordered list that represents a
-     breadth-first search of the dependency tree.
-
-     The whole process is complicated by the fact that we better
-     should use alloca for the temporary list elements.  But using
-     alloca means we cannot use recursive function calls.  */
-  errno_saved = errno;
-  errno_reason = 0;
-  errstring = NULL;
-  errno = 0;
-  name = NULL;
-  for (runp = known; runp; )
-    {
-      struct link_map *l = runp->map;
-      struct link_map **needed = NULL;
-      unsigned int nneeded = 0;
-
-      /* Unless otherwise stated, this object is handled.  */
-      runp->done = 1;
-
-      /* Allocate a temporary record to contain the references to the
-	 dependencies of this object.  */
-      if (l->l_searchlist.r_list == NULL && l->l_initfini == NULL
-	  && l != map && l->l_ldnum > 0)
-	{
-	  size_t new_size = l->l_ldnum * sizeof (struct link_map *);
-
-	  if (new_size > needed_space_bytes)
-	    needed_space
-	      = extend_alloca (needed_space, needed_space_bytes, new_size);
-
-	  needed = needed_space;
-	}
-
-      if (l->l_info[DT_NEEDED] || l->l_info[AUXTAG] || l->l_info[FILTERTAG])
-	{
-	  const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
-	  struct openaux_args args;
-	  struct list *orig;
-	  const ElfW(Dyn) *d;
-
-	  args.strtab = strtab;
-	  args.map = l;
-	  args.trace_mode = trace_mode;
-	  args.open_mode = open_mode;
-	  orig = runp;
-
-	  for (d = l->l_ld; d->d_tag != DT_NULL; ++d)
-	    if (__builtin_expect (d->d_tag, DT_NEEDED) == DT_NEEDED)
-	      {
-		/* Map in the needed object.  */
-		struct link_map *dep;
-
-		/* Recognize DSTs.  */
-		name = expand_dst (l, strtab + d->d_un.d_val, 0);
-		/* Store the tag in the argument structure.  */
-		args.name = name;
-
-		bool malloced;
-		int err = _dl_catch_error (&objname, &errstring, &malloced,
-					   openaux, &args);
-		if (__glibc_unlikely (errstring != NULL))
-		  {
-		    char *new_errstring = strdupa (errstring);
-		    objname = strdupa (objname);
-		    if (malloced)
-		      free ((char *) errstring);
-		    errstring = new_errstring;
-
-		    if (err)
-		      errno_reason = err;
-		    else
-		      errno_reason = -1;
-		    goto out;
-		  }
-		else
-		  dep = args.aux;
-
-		if (! dep->l_reserved)
-		  {
-		    /* Allocate new entry.  */
-		    struct list *newp;
-
-		    newp = alloca (sizeof (struct list));
-
-		    /* Append DEP to the list.  */
-		    newp->map = dep;
-		    newp->done = 0;
-		    newp->next = NULL;
-		    tail->next = newp;
-		    tail = newp;
-		    ++nlist;
-		    /* Set the mark bit that says it's already in the list.  */
-		    dep->l_reserved = 1;
-		  }
-
-		/* Remember this dependency.  */
-		if (needed != NULL)
-		  needed[nneeded++] = dep;
-	      }
-	    else if (d->d_tag == DT_AUXILIARY || d->d_tag == DT_FILTER)
-	      {
-		struct list *newp;
-
-		/* Recognize DSTs.  */
-		name = expand_dst (l, strtab + d->d_un.d_val,
-				   d->d_tag == DT_AUXILIARY);
-		/* Store the tag in the argument structure.  */
-		args.name = name;
-
-		/* Say that we are about to load an auxiliary library.  */
-		if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS,
-				      0))
-		  _dl_debug_printf ("load auxiliary object=%s"
-				    " requested by file=%s\n",
-				    name,
-				    DSO_FILENAME (l->l_name));
-
-		/* We must be prepared that the addressed shared
-		   object is not available.  For filter objects the dependency
-		   must be available.  */
-		bool malloced;
-		int err = _dl_catch_error (&objname, &errstring, &malloced,
-					openaux, &args);
-
-		if (__glibc_unlikely (errstring != NULL))
-		  {
-		    if (d->d_tag == DT_AUXILIARY)
-		      {
-			/* We are not interested in the error message.  */
-			assert (errstring != NULL);
-			if (malloced)
-			  free ((char *) errstring);
-
-			/* Simply ignore this error and continue the work.  */
-			continue;
-		      }
-		    else
-		      {
-
-			char *new_errstring = strdupa (errstring);
-			objname = strdupa (objname);
-			if (malloced)
-			  free ((char *) errstring);
-			errstring = new_errstring;
-
-			if (err)
-			  errno_reason = err;
-			else
-			  errno_reason = -1;
-			goto out;
-		      }
-		  }
-
-		/* The auxiliary object is actually available.
-		   Incorporate the map in all the lists.  */
-
-		/* Allocate new entry.  This always has to be done.  */
-		newp = alloca (sizeof (struct list));
-
-		/* We want to insert the new map before the current one,
-		   but we have no back links.  So we copy the contents of
-		   the current entry over.  Note that ORIG and NEWP now
-		   have switched their meanings.  */
-		memcpy (newp, orig, sizeof (*newp));
-
-		/* Initialize new entry.  */
-		orig->done = 0;
-		orig->map = args.aux;
-
-		/* Remember this dependency.  */
-		if (needed != NULL)
-		  needed[nneeded++] = args.aux;
-
-		/* We must handle two situations here: the map is new,
-		   so we must add it in all three lists.  If the map
-		   is already known, we have two further possibilities:
-		   - if the object is before the current map in the
-		   search list, we do nothing.  It is already found
-		   early
-		   - if the object is after the current one, we must
-		   move it just before the current map to make sure
-		   the symbols are found early enough
-		*/
-		if (args.aux->l_reserved)
-		  {
-		    /* The object is already somewhere in the list.
-		       Locate it first.  */
-		    struct list *late;
-
-		    /* This object is already in the search list we
-		       are building.  Don't add a duplicate pointer.
-		       Just added by _dl_map_object.  */
-		    for (late = newp; late->next != NULL; late = late->next)
-		      if (late->next->map == args.aux)
-			break;
-
-		    if (late->next != NULL)
-		      {
-			/* The object is somewhere behind the current
-			   position in the search path.  We have to
-			   move it to this earlier position.  */
-			orig->next = newp;
-
-			/* Now remove the later entry from the list
-			   and adjust the tail pointer.  */
-			if (tail == late->next)
-			  tail = late;
-			late->next = late->next->next;
-
-			/* We must move the object earlier in the chain.  */
-			if (args.aux->l_prev != NULL)
-			  args.aux->l_prev->l_next = args.aux->l_next;
-			if (args.aux->l_next != NULL)
-			  args.aux->l_next->l_prev = args.aux->l_prev;
-
-			args.aux->l_prev = newp->map->l_prev;
-			newp->map->l_prev = args.aux;
-			if (args.aux->l_prev != NULL)
-			  args.aux->l_prev->l_next = args.aux;
-			args.aux->l_next = newp->map;
-		      }
-		    else
-		      {
-			/* The object must be somewhere earlier in the
-			   list.  Undo to the current list element what
-			   we did above.  */
-			memcpy (orig, newp, sizeof (*newp));
-			continue;
-		      }
-		  }
-		else
-		  {
-		    /* This is easy.  We just add the symbol right here.  */
-		    orig->next = newp;
-		    ++nlist;
-		    /* Set the mark bit that says it's already in the list.  */
-		    args.aux->l_reserved = 1;
-
-		    /* The only problem is that in the double linked
-		       list of all objects we don't have this new
-		       object at the correct place.  Correct this here.  */
-		    if (args.aux->l_prev)
-		      args.aux->l_prev->l_next = args.aux->l_next;
-		    if (args.aux->l_next)
-		      args.aux->l_next->l_prev = args.aux->l_prev;
-
-		    args.aux->l_prev = newp->map->l_prev;
-		    newp->map->l_prev = args.aux;
-		    if (args.aux->l_prev != NULL)
-		      args.aux->l_prev->l_next = args.aux;
-		    args.aux->l_next = newp->map;
-		  }
-
-		/* Move the tail pointer if necessary.  */
-		if (orig == tail)
-		  tail = newp;
-
-		/* Move on the insert point.  */
-		orig = newp;
-	      }
-	}
-
-      /* Terminate the list of dependencies and store the array address.  */
-      if (needed != NULL)
-	{
-	  needed[nneeded++] = NULL;
-
-	  struct link_map **l_initfini = (struct link_map **)
-	    malloc ((2 * nneeded + 1) * sizeof needed[0]);
-	  if (l_initfini == NULL)
-	    _dl_signal_error (ENOMEM, map->l_name, NULL,
-			      N_("cannot allocate dependency list"));
-	  l_initfini[0] = l;
-	  memcpy (&l_initfini[1], needed, nneeded * sizeof needed[0]);
-	  memcpy (&l_initfini[nneeded + 1], l_initfini,
-		  nneeded * sizeof needed[0]);
-	  atomic_write_barrier ();
-	  l->l_initfini = l_initfini;
-	  l->l_free_initfini = 1;
-	}
-
-      /* If we have no auxiliary objects just go on to the next map.  */
-      if (runp->done)
-	do
-	  runp = runp->next;
-	while (runp != NULL && runp->done);
-    }
-
- out:
-  if (errno == 0 && errno_saved != 0)
-    __set_errno (errno_saved);
-
-  struct link_map **old_l_initfini = NULL;
-  if (map->l_initfini != NULL && map->l_type == lt_loaded)
-    {
-      /* This object was previously loaded as a dependency and we have
-	 a separate l_initfini list.  We don't need it anymore.  */
-      assert (map->l_searchlist.r_list == NULL);
-      old_l_initfini = map->l_initfini;
-    }
-
-  /* Store the search list we built in the object.  It will be used for
-     searches in the scope of this object.  */
-  struct link_map **l_initfini =
-    (struct link_map **) malloc ((2 * nlist + 1)
-				 * sizeof (struct link_map *));
-  if (l_initfini == NULL)
-    _dl_signal_error (ENOMEM, map->l_name, NULL,
-		      N_("cannot allocate symbol search list"));
-
-
-  map->l_searchlist.r_list = &l_initfini[nlist + 1];
-  map->l_searchlist.r_nlist = nlist;
-
-  for (nlist = 0, runp = known; runp; runp = runp->next)
-    {
-      if (__builtin_expect (trace_mode, 0) && runp->map->l_faked)
-	/* This can happen when we trace the loading.  */
-	--map->l_searchlist.r_nlist;
-      else
-	map->l_searchlist.r_list[nlist++] = runp->map;
-
-      /* Now clear all the mark bits we set in the objects on the search list
-	 to avoid duplicates, so the next call starts fresh.  */
-      runp->map->l_reserved = 0;
-    }
-
-  if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK, 0) != 0
-      && map == GL(dl_ns)[LM_ID_BASE]._ns_loaded)
-    {
-      /* If we are to compute conflicts, we have to build local scope
-	 for each library, not just the ultimate loader.  */
-      for (i = 0; i < nlist; ++i)
-	{
-	  struct link_map *l = map->l_searchlist.r_list[i];
-	  unsigned int j, cnt;
-
-	  /* The local scope has been already computed.  */
-	  if (l == map
-	      || (l->l_local_scope[0]
-		  && l->l_local_scope[0]->r_nlist) != 0)
-	    continue;
-
-	  if (l->l_info[AUXTAG] || l->l_info[FILTERTAG])
-	    {
-	      /* As current DT_AUXILIARY/DT_FILTER implementation needs to be
-		 rewritten, no need to bother with prelinking the old
-		 implementation.  */
-	      _dl_signal_error (EINVAL, l->l_name, NULL, N_("\
-Filters not supported with LD_TRACE_PRELINKING"));
-	    }
-
-	  cnt = _dl_build_local_scope (l_initfini, l);
-	  assert (cnt <= nlist);
-	  for (j = 0; j < cnt; j++)
-	    {
-	      l_initfini[j]->l_reserved = 0;
-	      if (j && __builtin_expect (l_initfini[j]->l_info[DT_SYMBOLIC]
-					 != NULL, 0))
-		l->l_symbolic_in_local_scope = true;
-	    }
-
-	  l->l_local_scope[0] =
-	    (struct r_scope_elem *) malloc (sizeof (struct r_scope_elem)
-					    + (cnt
-					       * sizeof (struct link_map *)));
-	  if (l->l_local_scope[0] == NULL)
-	    _dl_signal_error (ENOMEM, map->l_name, NULL,
-			      N_("cannot allocate symbol search list"));
-	  l->l_local_scope[0]->r_nlist = cnt;
-	  l->l_local_scope[0]->r_list =
-	    (struct link_map **) (l->l_local_scope[0] + 1);
-	  memcpy (l->l_local_scope[0]->r_list, l_initfini,
-		  cnt * sizeof (struct link_map *));
-	}
-    }
-
-  /* Maybe we can remove some relocation dependencies now.  */
-  assert (map->l_searchlist.r_list[0] == map);
-  struct link_map_reldeps *l_reldeps = NULL;
-  if (map->l_reldeps != NULL)
-    {
-      for (i = 1; i < nlist; ++i)
-	map->l_searchlist.r_list[i]->l_reserved = 1;
-
-      struct link_map **list = &map->l_reldeps->list[0];
-      for (i = 0; i < map->l_reldeps->act; ++i)
-	if (list[i]->l_reserved)
-	  {
-	    /* Need to allocate new array of relocation dependencies.  */
-	    l_reldeps = malloc (sizeof (*l_reldeps)
-				+ map->l_reldepsmax
-				  * sizeof (struct link_map *));
-	    if (l_reldeps == NULL)
-	      /* Bad luck, keep the reldeps duplicated between
-		 map->l_reldeps->list and map->l_initfini lists.  */
-	      ;
-	    else
-	      {
-		unsigned int j = i;
-		memcpy (&l_reldeps->list[0], &list[0],
-			i * sizeof (struct link_map *));
-		for (i = i + 1; i < map->l_reldeps->act; ++i)
-		  if (!list[i]->l_reserved)
-		    l_reldeps->list[j++] = list[i];
-		l_reldeps->act = j;
-	      }
-	  }
-
-      for (i = 1; i < nlist; ++i)
-	map->l_searchlist.r_list[i]->l_reserved = 0;
-    }
-
-  /* Sort the initializer list to take dependencies into account.  The binary
-     itself will always be initialize last.  */
-  memcpy (l_initfini, map->l_searchlist.r_list,
-	  nlist * sizeof (struct link_map *));
-  if (__glibc_likely (nlist > 1))
-    {
-      /* We can skip looking for the binary itself which is at the front
-	 of the search list.  */
-      i = 1;
-      uint16_t seen[nlist];
-      memset (seen, 0, nlist * sizeof (seen[0]));
-      while (1)
-	{
-	  /* Keep track of which object we looked at this round.  */
-	  ++seen[i];
-	  struct link_map *thisp = l_initfini[i];
-
-	  /* Find the last object in the list for which the current one is
-	     a dependency and move the current object behind the object
-	     with the dependency.  */
-	  unsigned int k = nlist - 1;
-	  while (k > i)
-	    {
-	      struct link_map **runp = l_initfini[k]->l_initfini;
-	      if (runp != NULL)
-		/* Look through the dependencies of the object.  */
-		while (*runp != NULL)
-		  if (__glibc_unlikely (*runp++ == thisp))
-		    {
-		      /* Move the current object to the back past the last
-			 object with it as the dependency.  */
-		      memmove (&l_initfini[i], &l_initfini[i + 1],
-			       (k - i) * sizeof (l_initfini[0]));
-		      l_initfini[k] = thisp;
-
-		      if (seen[i + 1] > nlist - i)
-			{
-			  ++i;
-			  goto next_clear;
-			}
-
-		      uint16_t this_seen = seen[i];
-		      memmove (&seen[i], &seen[i + 1],
-			       (k - i) * sizeof (seen[0]));
-		      seen[k] = this_seen;
-
-		      goto next;
-		    }
-
-	      --k;
-	    }
-
-	  if (++i == nlist)
-	    break;
-	next_clear:
-	  memset (&seen[i], 0, (nlist - i) * sizeof (seen[0]));
-
-	next:;
-	}
-    }
-
-  /* Terminate the list of dependencies.  */
-  l_initfini[nlist] = NULL;
-  atomic_write_barrier ();
-  map->l_initfini = l_initfini;
-  map->l_free_initfini = 1;
-  if (l_reldeps != NULL)
-    {
-      atomic_write_barrier ();
-      void *old_l_reldeps = map->l_reldeps;
-      map->l_reldeps = l_reldeps;
-      _dl_scope_free (old_l_reldeps);
-    }
-  if (old_l_initfini != NULL)
-    _dl_scope_free (old_l_initfini);
-
-  if (errno_reason)
-    _dl_signal_error (errno_reason == -1 ? 0 : errno_reason, objname,
-		      NULL, errstring);
-}
diff --git a/elf/dl-dst.h b/elf/dl-dst.h
deleted file mode 100644
index a96513d4dc..0000000000
--- a/elf/dl-dst.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Handling of dynamic sring tokens.
-   Copyright (C) 1999-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include "trusted-dirs.h"
-
-/* Determine the number of DST elements in the name.  Only if IS_PATH is
-   nonzero paths are recognized (i.e., multiple, ':' separated filenames).  */
-#define DL_DST_COUNT(name, is_path) \
-  ({									      \
-    size_t __cnt = 0;							      \
-    const char *__sf = strchr (name, '$');				      \
-									      \
-    if (__glibc_unlikely (__sf != NULL))				      \
-      __cnt = _dl_dst_count (__sf, is_path);			      \
-									      \
-    __cnt; })
-
-
-#ifdef SHARED
-# define IS_RTLD(l) (l) == &GL(dl_rtld_map)
-#else
-# define IS_RTLD(l) 0
-#endif
-/* Guess from the number of DSTs the length of the result string.  */
-#define DL_DST_REQUIRED(l, name, len, cnt) \
-  ({									      \
-    size_t __len = (len);						      \
-    size_t __cnt = (cnt);						      \
-									      \
-    if (__cnt > 0)							      \
-      {									      \
-	size_t dst_len;							      \
-	/* Now we make a guess how many extra characters on top of the	      \
-	   length of S we need to represent the result.  We know that	      \
-	   we have CNT replacements.  Each at most can use		      \
-	     MAX (MAX (strlen (ORIGIN), strlen (_dl_platform)),		      \
-		  strlen (DL_DST_LIB))					      \
-	   minus 4 (which is the length of "$LIB").			      \
-									      \
-	   First get the origin string if it is not available yet.	      \
-	   This can only happen for the map of the executable or, when	      \
-	   auditing, in ld.so.  */					      \
-	if ((l)->l_origin == NULL)					      \
-	  {								      \
-	    assert ((l)->l_name[0] == '\0' || IS_RTLD (l));		      \
-	    (l)->l_origin = _dl_get_origin ();				      \
-	    dst_len = ((l)->l_origin && (l)->l_origin != (char *) -1	      \
-			  ? strlen ((l)->l_origin) : 0);		      \
-	  }								      \
-	else								      \
-	  dst_len = (l)->l_origin == (char *) -1			      \
-	    ? 0 : strlen ((l)->l_origin);				      \
-	dst_len = MAX (MAX (dst_len, GLRO(dl_platformlen)),		      \
-		       strlen (DL_DST_LIB));				      \
-	if (dst_len > 4)						      \
-	  __len += __cnt * (dst_len - 4);				      \
-      }									      \
-									      \
-    __len; })
diff --git a/elf/dl-environ.c b/elf/dl-environ.c
deleted file mode 100644
index cbffec8808..0000000000
--- a/elf/dl-environ.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/* Environment handling for dynamic loader.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-
-/* Walk through the environment of the process and return all entries
-   starting with `LD_'.  */
-char *
-internal_function
-_dl_next_ld_env_entry (char ***position)
-{
-  char **current = *position;
-  char *result = NULL;
-
-  while (*current != NULL)
-    {
-      if (__builtin_expect ((*current)[0] == 'L', 0)
-	  && (*current)[1] == 'D' && (*current)[2] == '_')
-	{
-	  result = &(*current)[3];
-
-	  /* Save current position for next visit.  */
-	  *position = ++current;
-
-	  break;
-	}
-
-      ++current;
-    }
-
-  return result;
-}
-
-
-/* In ld.so __environ is not exported.  */
-extern char **__environ attribute_hidden;
-
-int
-unsetenv (const char *name)
-{
-  char **ep;
-
-  ep = __environ;
-  while (*ep != NULL)
-    {
-      size_t cnt = 0;
-
-      while ((*ep)[cnt] == name[cnt] && name[cnt] != '\0')
-	++cnt;
-
-      if (name[cnt] == '\0' && (*ep)[cnt] == '=')
-	{
-	  /* Found it.  Remove this pointer by moving later ones to
-	     the front.  */
-	  char **dp = ep;
-
-	  do
-	    dp[0] = dp[1];
-	  while (*dp++);
-	  /* Continue the loop in case NAME appears again.  */
-	}
-      else
-	++ep;
-    }
-
-  return 0;
-}
diff --git a/elf/dl-error-minimal.c b/elf/dl-error-minimal.c
deleted file mode 100644
index 384c9b0edc..0000000000
--- a/elf/dl-error-minimal.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Error handling for runtime dynamic linker, minimal version.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This version does lives in ld.so, does not use thread-local data
-   and supports _dl_signal_cerror and _dl_receive_error.  */
-
-#define DL_ERROR_BOOTSTRAP 1
-#include "dl-error-skeleton.c"
diff --git a/elf/dl-error-skeleton.c b/elf/dl-error-skeleton.c
deleted file mode 100644
index 8e5888d4bd..0000000000
--- a/elf/dl-error-skeleton.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/* Template for error handling for runtime dynamic linker.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* The following macro needs to be defined before including this
-   skeleton file:
-
-   DL_ERROR_BOOTSTRAP
-
-     If 1, do not use TLS and implement _dl_signal_cerror and
-     _dl_receive_error.  If 0, TLS is used, and the variants with
-     error callbacks are not provided.  */
-
-
-#include <libintl.h>
-#include <setjmp.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-#include <stdio.h>
-
-/* This structure communicates state between _dl_catch_error and
-   _dl_signal_error.  */
-struct catch
-  {
-    const char **objname;	/* Object/File name.  */
-    const char **errstring;	/* Error detail filled in here.  */
-    bool *malloced;		/* Nonzero if the string is malloced
-				   by the libc malloc.  */
-    volatile int *errcode;	/* Return value of _dl_signal_error.  */
-    jmp_buf env;		/* longjmp here on error.  */
-  };
-
-/* Multiple threads at once can use the `_dl_catch_error' function.  The
-   calls can come from `_dl_map_object_deps', `_dlerror_run', or from
-   any of the libc functionality which loads dynamic objects (NSS, iconv).
-   Therefore we have to be prepared to save the state in thread-local
-   memory.  */
-#if !DL_ERROR_BOOTSTRAP
-static __thread struct catch *catch_hook attribute_tls_model_ie;
-#else
-/* The version of this code in ld.so cannot use thread-local variables
-   and is used during bootstrap only.  */
-static struct catch *catch_hook;
-#endif
-
-/* This message we return as a last resort.  We define the string in a
-   variable since we have to avoid freeing it and so have to enable
-   a pointer comparison.  See below and in dlfcn/dlerror.c.  */
-static const char _dl_out_of_memory[] = "out of memory";
-
-#if DL_ERROR_BOOTSTRAP
-/* This points to a function which is called when an continuable error is
-   received.  Unlike the handling of `catch' this function may return.
-   The arguments will be the `errstring' and `objname'.
-
-   Since this functionality is not used in normal programs (only in ld.so)
-   we do not care about multi-threaded programs here.  We keep this as a
-   global variable.  */
-static receiver_fct receiver;
-#endif /* DL_ERROR_BOOTSTRAP */
-
-void
-internal_function
-_dl_signal_error (int errcode, const char *objname, const char *occation,
-		  const char *errstring)
-{
-  struct catch *lcatch = catch_hook;
-
-  if (! errstring)
-    errstring = N_("DYNAMIC LINKER BUG!!!");
-
-  if (objname == NULL)
-    objname = "";
-  if (lcatch != NULL)
-    {
-      /* We are inside _dl_catch_error.  Return to it.  We have to
-	 duplicate the error string since it might be allocated on the
-	 stack.  The object name is always a string constant.  */
-      size_t len_objname = strlen (objname) + 1;
-      size_t len_errstring = strlen (errstring) + 1;
-
-      char *errstring_copy = malloc (len_objname + len_errstring);
-      if (errstring_copy != NULL)
-	{
-	  /* Make a copy of the object file name and the error string.  */
-	  *lcatch->objname = memcpy (__mempcpy (errstring_copy,
-						errstring, len_errstring),
-				     objname, len_objname);
-	  *lcatch->errstring = errstring_copy;
-
-	  /* If the main executable is relocated it means the libc's malloc
-	     is used.  */
-          bool malloced = true;
-#ifdef SHARED
-	  malloced = (GL(dl_ns)[LM_ID_BASE]._ns_loaded != NULL
-                      && (GL(dl_ns)[LM_ID_BASE]._ns_loaded->l_relocated != 0));
-#endif
-	  *lcatch->malloced = malloced;
-	}
-      else
-	{
-	  /* This is better than nothing.  */
-	  *lcatch->objname = "";
-	  *lcatch->errstring = _dl_out_of_memory;
-	  *lcatch->malloced = false;
-	}
-
-      *lcatch->errcode = errcode;
-
-      /* We do not restore the signal mask because none was saved.  */
-      __longjmp (lcatch->env[0].__jmpbuf, 1);
-    }
-  else
-    {
-      /* Lossage while resolving the program's own symbols is always fatal.  */
-      char buffer[1024];
-      _dl_fatal_printf ("%s: %s: %s%s%s%s%s\n",
-			RTLD_PROGNAME,
-			occation ?: N_("error while loading shared libraries"),
-			objname, *objname ? ": " : "",
-			errstring, errcode ? ": " : "",
-			(errcode
-			 ? __strerror_r (errcode, buffer, sizeof buffer)
-			 : ""));
-    }
-}
-libc_hidden_def (_dl_signal_error)
-
-
-#if DL_ERROR_BOOTSTRAP
-void
-internal_function
-_dl_signal_cerror (int errcode, const char *objname, const char *occation,
-		   const char *errstring)
-{
-  if (__builtin_expect (GLRO(dl_debug_mask)
-			& ~(DL_DEBUG_STATISTICS|DL_DEBUG_PRELINK), 0))
-    _dl_debug_printf ("%s: error: %s: %s (%s)\n", objname, occation,
-		      errstring, receiver ? "continued" : "fatal");
-
-  if (receiver)
-    {
-      /* We are inside _dl_receive_error.  Call the user supplied
-	 handler and resume the work.  The receiver will still be
-	 installed.  */
-      (*receiver) (errcode, objname, errstring);
-    }
-  else
-    _dl_signal_error (errcode, objname, occation, errstring);
-}
-#endif /* DL_ERROR_BOOTSTRAP */
-
-
-int
-internal_function
-_dl_catch_error (const char **objname, const char **errstring,
-		 bool *mallocedp, void (*operate) (void *), void *args)
-{
-  /* We need not handle `receiver' since setting a `catch' is handled
-     before it.  */
-
-  /* Only this needs to be marked volatile, because it is the only local
-     variable that gets changed between the setjmp invocation and the
-     longjmp call.  All others are just set here (before setjmp) and read
-     in _dl_signal_error (before longjmp).  */
-  volatile int errcode;
-
-  struct catch c;
-  /* Don't use an initializer since we don't need to clear C.env.  */
-  c.objname = objname;
-  c.errstring = errstring;
-  c.malloced = mallocedp;
-  c.errcode = &errcode;
-
-  struct catch *const old = catch_hook;
-  catch_hook = &c;
-
-  /* Do not save the signal mask.  */
-  if (__builtin_expect (__sigsetjmp (c.env, 0), 0) == 0)
-    {
-      (*operate) (args);
-      catch_hook = old;
-      *objname = NULL;
-      *errstring = NULL;
-      *mallocedp = false;
-      return 0;
-    }
-
-  /* We get here only if we longjmp'd out of OPERATE.  _dl_signal_error has
-     already stored values into *OBJNAME, *ERRSTRING, and *MALLOCEDP.  */
-  catch_hook = old;
-  return errcode;
-}
-libc_hidden_def (_dl_catch_error)
-
-#if DL_ERROR_BOOTSTRAP
-void
-internal_function
-_dl_receive_error (receiver_fct fct, void (*operate) (void *), void *args)
-{
-  struct catch *old_catch = catch_hook;
-  receiver_fct old_receiver = receiver;
-
-  /* Set the new values.  */
-  catch_hook = NULL;
-  receiver = fct;
-
-  (*operate) (args);
-
-  catch_hook = old_catch;
-  receiver = old_receiver;
-}
-#endif /* DL_ERROR_BOOTSTRAP */
diff --git a/elf/dl-error.c b/elf/dl-error.c
deleted file mode 100644
index bfcbd5358b..0000000000
--- a/elf/dl-error.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Error handling for runtime dynamic linker, full version.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This implementation lives in libc.so because it uses thread-local
-   data, which is not available in ld.so.  It interposes the version
-   in dl-error-minimal.c after ld.so bootstrap.
-
-   The signal/catch mechanism is used by the audit framework, which
-   means that even in ld.so, not all errors are fatal.  */
-
-#define DL_ERROR_BOOTSTRAP 0
-#include "dl-error-skeleton.c"
diff --git a/elf/dl-execstack.c b/elf/dl-execstack.c
deleted file mode 100644
index 875338bea5..0000000000
--- a/elf/dl-execstack.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Stack executability handling for GNU dynamic linker.  Stub version.
-   Copyright (C) 2003-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <ldsodefs.h>
-#include <errno.h>
-
-/* There is no portable way to know the bounds of the initial thread's stack
-   so as to mprotect it.  */
-
-int
-internal_function
-_dl_make_stack_executable (void **stack_endp)
-{
-  return ENOSYS;
-}
-rtld_hidden_def (_dl_make_stack_executable)
diff --git a/elf/dl-fini.c b/elf/dl-fini.c
deleted file mode 100644
index 93b337bea1..0000000000
--- a/elf/dl-fini.c
+++ /dev/null
@@ -1,281 +0,0 @@
-/* Call the termination functions of loaded shared objects.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <string.h>
-#include <ldsodefs.h>
-
-
-/* Type of the constructor functions.  */
-typedef void (*fini_t) (void);
-
-
-void
-internal_function
-_dl_sort_fini (struct link_map **maps, size_t nmaps, char *used, Lmid_t ns)
-{
-  /* A list of one element need not be sorted.  */
-  if (nmaps == 1)
-    return;
-
-  /* We can skip looking for the binary itself which is at the front
-     of the search list for the main namespace.  */
-  unsigned int i = ns == LM_ID_BASE;
-  uint16_t seen[nmaps];
-  memset (seen, 0, nmaps * sizeof (seen[0]));
-  while (1)
-    {
-      /* Keep track of which object we looked at this round.  */
-      ++seen[i];
-      struct link_map *thisp = maps[i];
-
-      /* Do not handle ld.so in secondary namespaces and object which
-	 are not removed.  */
-      if (thisp != thisp->l_real || thisp->l_idx == -1)
-	goto skip;
-
-      /* Find the last object in the list for which the current one is
-	 a dependency and move the current object behind the object
-	 with the dependency.  */
-      unsigned int k = nmaps - 1;
-      while (k > i)
-	{
-	  struct link_map **runp = maps[k]->l_initfini;
-	  if (runp != NULL)
-	    /* Look through the dependencies of the object.  */
-	    while (*runp != NULL)
-	      if (__glibc_unlikely (*runp++ == thisp))
-		{
-		move:
-		  /* Move the current object to the back past the last
-		     object with it as the dependency.  */
-		  memmove (&maps[i], &maps[i + 1],
-			   (k - i) * sizeof (maps[0]));
-		  maps[k] = thisp;
-
-		  if (used != NULL)
-		    {
-		      char here_used = used[i];
-		      memmove (&used[i], &used[i + 1],
-			       (k - i) * sizeof (used[0]));
-		      used[k] = here_used;
-		    }
-
-		  if (seen[i + 1] > nmaps - i)
-		    {
-		      ++i;
-		      goto next_clear;
-		    }
-
-		  uint16_t this_seen = seen[i];
-		  memmove (&seen[i], &seen[i + 1], (k - i) * sizeof (seen[0]));
-		  seen[k] = this_seen;
-
-		  goto next;
-		}
-
-	  if (__glibc_unlikely (maps[k]->l_reldeps != NULL))
-	    {
-	      unsigned int m = maps[k]->l_reldeps->act;
-	      struct link_map **relmaps = &maps[k]->l_reldeps->list[0];
-
-	      /* Look through the relocation dependencies of the object.  */
-	      while (m-- > 0)
-		if (__glibc_unlikely (relmaps[m] == thisp))
-		  {
-		    /* If a cycle exists with a link time dependency,
-		       preserve the latter.  */
-		    struct link_map **runp = thisp->l_initfini;
-		    if (runp != NULL)
-		      while (*runp != NULL)
-			if (__glibc_unlikely (*runp++ == maps[k]))
-			  goto ignore;
-		    goto move;
-		  }
-	    ignore:;
-	    }
-
-	  --k;
-	}
-
-    skip:
-      if (++i == nmaps)
-	break;
-    next_clear:
-      memset (&seen[i], 0, (nmaps - i) * sizeof (seen[0]));
-
-    next:;
-    }
-}
-
-
-void
-internal_function
-_dl_fini (void)
-{
-  /* Lots of fun ahead.  We have to call the destructors for all still
-     loaded objects, in all namespaces.  The problem is that the ELF
-     specification now demands that dependencies between the modules
-     are taken into account.  I.e., the destructor for a module is
-     called before the ones for any of its dependencies.
-
-     To make things more complicated, we cannot simply use the reverse
-     order of the constructors.  Since the user might have loaded objects
-     using `dlopen' there are possibly several other modules with its
-     dependencies to be taken into account.  Therefore we have to start
-     determining the order of the modules once again from the beginning.  */
-
-  /* We run the destructors of the main namespaces last.  As for the
-     other namespaces, we pick run the destructors in them in reverse
-     order of the namespace ID.  */
-#ifdef SHARED
-  int do_audit = 0;
- again:
-#endif
-  for (Lmid_t ns = GL(dl_nns) - 1; ns >= 0; --ns)
-    {
-      /* Protect against concurrent loads and unloads.  */
-      __rtld_lock_lock_recursive (GL(dl_load_lock));
-
-      unsigned int nloaded = GL(dl_ns)[ns]._ns_nloaded;
-      /* No need to do anything for empty namespaces or those used for
-	 auditing DSOs.  */
-      if (nloaded == 0
-#ifdef SHARED
-	  || GL(dl_ns)[ns]._ns_loaded->l_auditing != do_audit
-#endif
-	  )
-	__rtld_lock_unlock_recursive (GL(dl_load_lock));
-      else
-	{
-	  /* Now we can allocate an array to hold all the pointers and
-	     copy the pointers in.  */
-	  struct link_map *maps[nloaded];
-
-	  unsigned int i;
-	  struct link_map *l;
-	  assert (nloaded != 0 || GL(dl_ns)[ns]._ns_loaded == NULL);
-	  for (l = GL(dl_ns)[ns]._ns_loaded, i = 0; l != NULL; l = l->l_next)
-	    /* Do not handle ld.so in secondary namespaces.  */
-	    if (l == l->l_real)
-	      {
-		assert (i < nloaded);
-
-		maps[i] = l;
-		l->l_idx = i;
-		++i;
-
-		/* Bump l_direct_opencount of all objects so that they
-		   are not dlclose()ed from underneath us.  */
-		++l->l_direct_opencount;
-	      }
-	  assert (ns != LM_ID_BASE || i == nloaded);
-	  assert (ns == LM_ID_BASE || i == nloaded || i == nloaded - 1);
-	  unsigned int nmaps = i;
-
-	  /* Now we have to do the sorting.  */
-	  _dl_sort_fini (maps, nmaps, NULL, ns);
-
-	  /* We do not rely on the linked list of loaded object anymore
-	     from this point on.  We have our own list here (maps).  The
-	     various members of this list cannot vanish since the open
-	     count is too high and will be decremented in this loop.  So
-	     we release the lock so that some code which might be called
-	     from a destructor can directly or indirectly access the
-	     lock.  */
-	  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-
-	  /* 'maps' now contains the objects in the right order.  Now
-	     call the destructors.  We have to process this array from
-	     the front.  */
-	  for (i = 0; i < nmaps; ++i)
-	    {
-	      struct link_map *l = maps[i];
-
-	      if (l->l_init_called)
-		{
-		  /* Make sure nothing happens if we are called twice.  */
-		  l->l_init_called = 0;
-
-		  /* Is there a destructor function?  */
-		  if (l->l_info[DT_FINI_ARRAY] != NULL
-		      || l->l_info[DT_FINI] != NULL)
-		    {
-		      /* When debugging print a message first.  */
-		      if (__builtin_expect (GLRO(dl_debug_mask)
-					    & DL_DEBUG_IMPCALLS, 0))
-			_dl_debug_printf ("\ncalling fini: %s [%lu]\n\n",
-					  DSO_FILENAME (l->l_name),
-					  ns);
-
-		      /* First see whether an array is given.  */
-		      if (l->l_info[DT_FINI_ARRAY] != NULL)
-			{
-			  ElfW(Addr) *array =
-			    (ElfW(Addr) *) (l->l_addr
-					    + l->l_info[DT_FINI_ARRAY]->d_un.d_ptr);
-			  unsigned int i = (l->l_info[DT_FINI_ARRAYSZ]->d_un.d_val
-					    / sizeof (ElfW(Addr)));
-			  while (i-- > 0)
-			    ((fini_t) array[i]) ();
-			}
-
-		      /* Next try the old-style destructor.  */
-		      if (l->l_info[DT_FINI] != NULL)
-			DL_CALL_DT_FINI
-			  (l, l->l_addr + l->l_info[DT_FINI]->d_un.d_ptr);
-		    }
-
-#ifdef SHARED
-		  /* Auditing checkpoint: another object closed.  */
-		  if (!do_audit && __builtin_expect (GLRO(dl_naudit) > 0, 0))
-		    {
-		      struct audit_ifaces *afct = GLRO(dl_audit);
-		      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-			{
-			  if (afct->objclose != NULL)
-			    /* Return value is ignored.  */
-			    (void) afct->objclose (&l->l_audit[cnt].cookie);
-
-			  afct = afct->next;
-			}
-		    }
-#endif
-		}
-
-	      /* Correct the previous increment.  */
-	      --l->l_direct_opencount;
-	    }
-	}
-    }
-
-#ifdef SHARED
-  if (! do_audit && GLRO(dl_naudit) > 0)
-    {
-      do_audit = 1;
-      goto again;
-    }
-
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_STATISTICS))
-    _dl_debug_printf ("\nruntime linker statistics:\n"
-		      "           final number of relocations: %lu\n"
-		      "final number of relocations from cache: %lu\n",
-		      GL(dl_num_relocations),
-		      GL(dl_num_cache_relocations));
-#endif
-}
diff --git a/elf/dl-fptr.c b/elf/dl-fptr.c
deleted file mode 100644
index bf8ae43b51..0000000000
--- a/elf/dl-fptr.c
+++ /dev/null
@@ -1,322 +0,0 @@
-/* Manage function descriptors.  Generic version.
-   Copyright (C) 1999-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <libintl.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/param.h>
-#include <sys/mman.h>
-#include <link.h>
-#include <ldsodefs.h>
-#include <elf/dynamic-link.h>
-#include <dl-fptr.h>
-#include <dl-unmap-segments.h>
-#include <atomic.h>
-
-#ifndef ELF_MACHINE_BOOT_FPTR_TABLE_LEN
-/* ELF_MACHINE_BOOT_FPTR_TABLE_LEN should be greater than the number of
-   dynamic symbols in ld.so.  */
-# define ELF_MACHINE_BOOT_FPTR_TABLE_LEN 256
-#endif
-
-#ifndef ELF_MACHINE_LOAD_ADDRESS
-# error "ELF_MACHINE_LOAD_ADDRESS is not defined."
-#endif
-
-#ifndef COMPARE_AND_SWAP
-# define COMPARE_AND_SWAP(ptr, old, new) \
-  (catomic_compare_and_exchange_bool_acq (ptr, new, old) == 0)
-#endif
-
-ElfW(Addr) _dl_boot_fptr_table [ELF_MACHINE_BOOT_FPTR_TABLE_LEN];
-
-static struct local
-  {
-    struct fdesc_table *root;
-    struct fdesc *free_list;
-    unsigned int npages;		/* # of pages to allocate */
-    /* the next to members MUST be consecutive! */
-    struct fdesc_table boot_table;
-    struct fdesc boot_fdescs[1024];
-  }
-local =
-  {
-    .root = &local.boot_table,
-    .npages = 2,
-    .boot_table =
-      {
-	.len = sizeof (local.boot_fdescs) / sizeof (local.boot_fdescs[0]),
-	.first_unused = 0
-      }
-  };
-
-/* Create a new fdesc table and return a pointer to the first fdesc
-   entry.  The fdesc lock must have been acquired already.  */
-
-static struct fdesc_table *
-new_fdesc_table (struct local *l, size_t *size)
-{
-  size_t old_npages = l->npages;
-  size_t new_npages = old_npages + old_npages;
-  struct fdesc_table *new_table;
-
-  /* If someone has just created a new table, we return NULL to tell
-     the caller to use the new table.  */
-  if (! COMPARE_AND_SWAP (&l->npages, old_npages, new_npages))
-    return (struct fdesc_table *) NULL;
-
-  *size = old_npages * GLRO(dl_pagesize);
-  new_table = __mmap (NULL, *size,
-		      PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
-  if (new_table == MAP_FAILED)
-    _dl_signal_error (errno, NULL, NULL,
-		      N_("cannot map pages for fdesc table"));
-
-  new_table->len
-    = (*size - sizeof (*new_table)) / sizeof (struct fdesc);
-  new_table->first_unused = 1;
-  return new_table;
-}
-
-
-static ElfW(Addr)
-make_fdesc (ElfW(Addr) ip, ElfW(Addr) gp)
-{
-  struct fdesc *fdesc = NULL;
-  struct fdesc_table *root;
-  unsigned int old;
-  struct local *l;
-
-  ELF_MACHINE_LOAD_ADDRESS (l, local);
-
- retry:
-  root = l->root;
-  while (1)
-    {
-      old = root->first_unused;
-      if (old >= root->len)
-	break;
-      else if (COMPARE_AND_SWAP (&root->first_unused, old, old + 1))
-	{
-	  fdesc = &root->fdesc[old];
-	  goto install;
-	}
-    }
-
-  if (l->free_list)
-    {
-      /* Get it from free-list.  */
-      do
-	{
-	  fdesc = l->free_list;
-	  if (fdesc == NULL)
-	    goto retry;
-	}
-      while (! COMPARE_AND_SWAP ((ElfW(Addr) *) &l->free_list,
-				 (ElfW(Addr)) fdesc, fdesc->ip));
-    }
-  else
-    {
-      /* Create a new fdesc table.  */
-      size_t size;
-      struct fdesc_table *new_table = new_fdesc_table (l, &size);
-
-      if (new_table == NULL)
-	goto retry;
-
-      new_table->next = root;
-      if (! COMPARE_AND_SWAP ((ElfW(Addr) *) &l->root,
-			      (ElfW(Addr)) root,
-			      (ElfW(Addr)) new_table))
-	{
-	  /* Someone has just installed a new table. Return NULL to
-	     tell the caller to use the new table.  */
-	  __munmap (new_table, size);
-	  goto retry;
-	}
-
-      /* Note that the first entry was reserved while allocating the
-	 memory for the new page.  */
-      fdesc = &new_table->fdesc[0];
-    }
-
- install:
-  fdesc->ip = ip;
-  fdesc->gp = gp;
-
-  return (ElfW(Addr)) fdesc;
-}
-
-
-static inline ElfW(Addr) * __attribute__ ((always_inline))
-make_fptr_table (struct link_map *map)
-{
-  const ElfW(Sym) *symtab
-    = (const void *) D_PTR (map, l_info[DT_SYMTAB]);
-  const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
-  ElfW(Addr) *fptr_table;
-  size_t size;
-  size_t len;
-
-  /* XXX Apparently the only way to find out the size of the dynamic
-     symbol section is to assume that the string table follows right
-     afterwards...  */
-  len = ((strtab - (char *) symtab)
-	 / map->l_info[DT_SYMENT]->d_un.d_val);
-  size = ((len * sizeof (fptr_table[0]) + GLRO(dl_pagesize) - 1)
-	  & -GLRO(dl_pagesize));
-  /* XXX We don't support here in the moment systems without MAP_ANON.
-     There probably are none for IA-64.  In case this is proven wrong
-     we will have to open /dev/null here and use the file descriptor
-     instead of the hard-coded -1.  */
-  fptr_table = __mmap (NULL, size,
-		       PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE,
-		       -1, 0);
-  if (fptr_table == MAP_FAILED)
-    _dl_signal_error (errno, NULL, NULL,
-		      N_("cannot map pages for fptr table"));
-
-  if (COMPARE_AND_SWAP ((ElfW(Addr) *) &map->l_mach.fptr_table,
-			(ElfW(Addr)) NULL, (ElfW(Addr)) fptr_table))
-    map->l_mach.fptr_table_len = len;
-  else
-    __munmap (fptr_table, len * sizeof (fptr_table[0]));
-
-  return map->l_mach.fptr_table;
-}
-
-
-ElfW(Addr)
-_dl_make_fptr (struct link_map *map, const ElfW(Sym) *sym,
-	       ElfW(Addr) ip)
-{
-  ElfW(Addr) *ftab = map->l_mach.fptr_table;
-  const ElfW(Sym) *symtab;
-  Elf_Symndx symidx;
-  struct local *l;
-
-  if (__glibc_unlikely (ftab == NULL))
-    ftab = make_fptr_table (map);
-
-  symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]);
-  symidx = sym - symtab;
-
-  if (symidx >= map->l_mach.fptr_table_len)
-    _dl_signal_error (0, NULL, NULL,
-		      N_("internal error: symidx out of range of fptr table"));
-
-  while (ftab[symidx] == 0)
-    {
-      /* GOT has already been relocated in elf_get_dynamic_info -
-	 don't try to relocate it again.  */
-      ElfW(Addr) fdesc
-	= make_fdesc (ip, map->l_info[DT_PLTGOT]->d_un.d_ptr);
-
-      if (__builtin_expect (COMPARE_AND_SWAP (&ftab[symidx], (ElfW(Addr)) NULL,
-					      fdesc), 1))
-	{
-	  /* Noone has updated the entry and the new function
-	     descriptor has been installed.  */
-#if 0
-	  const char *strtab
-	    = (const void *) D_PTR (map, l_info[DT_STRTAB]);
-
-	  ELF_MACHINE_LOAD_ADDRESS (l, local);
-	  if (l->root != &l->boot_table
-	      || l->boot_table.first_unused > 20)
-	    _dl_debug_printf ("created fdesc symbol `%s' at %lx\n",
-			      strtab + sym->st_name, ftab[symidx]);
-#endif
-	  break;
-	}
-      else
-	{
-	  /* We created a duplicated function descriptor. We put it on
-	     free-list.  */
-	  struct fdesc *f = (struct fdesc *) fdesc;
-
-	  ELF_MACHINE_LOAD_ADDRESS (l, local);
-
-	  do
-	    f->ip = (ElfW(Addr)) l->free_list;
-	  while (! COMPARE_AND_SWAP ((ElfW(Addr) *) &l->free_list,
-				     f->ip, fdesc));
-	}
-    }
-
-  return ftab[symidx];
-}
-
-
-void
-_dl_unmap (struct link_map *map)
-{
-  ElfW(Addr) *ftab = map->l_mach.fptr_table;
-  struct fdesc *head = NULL, *tail = NULL;
-  size_t i;
-
-  _dl_unmap_segments (map);
-
-  if (ftab == NULL)
-    return;
-
-  /* String together the fdesc structures that are being freed.  */
-  for (i = 0; i < map->l_mach.fptr_table_len; ++i)
-    {
-      if (ftab[i])
-	{
-	  *(struct fdesc **) ftab[i] = head;
-	  head = (struct fdesc *) ftab[i];
-	  if (tail == NULL)
-	    tail = head;
-	}
-    }
-
-  /* Prepend the new list to the free_list: */
-  if (tail)
-    do
-      tail->ip = (ElfW(Addr)) local.free_list;
-    while (! COMPARE_AND_SWAP ((ElfW(Addr) *) &local.free_list,
-			       tail->ip, (ElfW(Addr)) head));
-
-  __munmap (ftab, (map->l_mach.fptr_table_len
-		   * sizeof (map->l_mach.fptr_table[0])));
-
-  map->l_mach.fptr_table = NULL;
-}
-
-
-ElfW(Addr)
-_dl_lookup_address (const void *address)
-{
-  ElfW(Addr) addr = (ElfW(Addr)) address;
-  struct fdesc_table *t;
-  unsigned long int i;
-
-  for (t = local.root; t != NULL; t = t->next)
-    {
-      i = (struct fdesc *) addr - &t->fdesc[0];
-      if (i < t->first_unused && addr == (ElfW(Addr)) &t->fdesc[i])
-	{
-	  addr = t->fdesc[i].ip;
-	  break;
-	}
-    }
-
-  return addr;
-}
diff --git a/elf/dl-hwcaps.c b/elf/dl-hwcaps.c
deleted file mode 100644
index ac50fd2c38..0000000000
--- a/elf/dl-hwcaps.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/* Hardware capability support for run-time dynamic loader.
-   Copyright (C) 2012-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <elf.h>
-#include <errno.h>
-#include <libintl.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-
-#include <dl-procinfo.h>
-#include <dl-hwcaps.h>
-
-#ifdef _DL_FIRST_PLATFORM
-# define _DL_FIRST_EXTRA (_DL_FIRST_PLATFORM + _DL_PLATFORMS_COUNT)
-#else
-# define _DL_FIRST_EXTRA _DL_HWCAP_COUNT
-#endif
-
-/* Return an array of useful/necessary hardware capability names.  */
-const struct r_strlenpair *
-internal_function
-_dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
-		      size_t *max_capstrlen)
-{
-  uint64_t hwcap_mask = GET_HWCAP_MASK();
-  /* Determine how many important bits are set.  */
-  uint64_t masked = GLRO(dl_hwcap) & hwcap_mask;
-  size_t cnt = platform != NULL;
-  size_t n, m;
-  size_t total;
-  struct r_strlenpair *result;
-  struct r_strlenpair *rp;
-  char *cp;
-
-  /* Count the number of bits set in the masked value.  */
-  for (n = 0; (~((1ULL << n) - 1) & masked) != 0; ++n)
-    if ((masked & (1ULL << n)) != 0)
-      ++cnt;
-
-#ifdef NEED_DL_SYSINFO_DSO
-  /* The system-supplied DSO can contain a note of type 2, vendor "GNU".
-     This gives us a list of names to treat as fake hwcap bits.  */
-
-  const char *dsocaps = NULL;
-  size_t dsocapslen = 0;
-  if (GLRO(dl_sysinfo_map) != NULL)
-    {
-      const ElfW(Phdr) *const phdr = GLRO(dl_sysinfo_map)->l_phdr;
-      const ElfW(Word) phnum = GLRO(dl_sysinfo_map)->l_phnum;
-      for (uint_fast16_t i = 0; i < phnum; ++i)
-	if (phdr[i].p_type == PT_NOTE)
-	  {
-	    const ElfW(Addr) start = (phdr[i].p_vaddr
-				      + GLRO(dl_sysinfo_map)->l_addr);
-	    /* The standard ELF note layout is exactly as the anonymous struct.
-	       The next element is a variable length vendor name of length
-	       VENDORLEN (with a real length rounded to ElfW(Word)), followed
-	       by the data of length DATALEN (with a real length rounded to
-	       ElfW(Word)).  */
-	    const struct
-	    {
-	      ElfW(Word) vendorlen;
-	      ElfW(Word) datalen;
-	      ElfW(Word) type;
-	    } *note = (const void *) start;
-	    while ((ElfW(Addr)) (note + 1) - start < phdr[i].p_memsz)
-	      {
-#define ROUND(len) (((len) + sizeof (ElfW(Word)) - 1) & -sizeof (ElfW(Word)))
-		/* The layout of the type 2, vendor "GNU" note is as follows:
-		   .long <Number of capabilities enabled by this note>
-		   .long <Capabilities mask> (as mask >> _DL_FIRST_EXTRA).
-		   .byte <The bit number for the next capability>
-		   .asciz <The name of the capability>.  */
-		if (note->type == NT_GNU_HWCAP
-		    && note->vendorlen == sizeof "GNU"
-		    && !memcmp ((note + 1), "GNU", sizeof "GNU")
-		    && note->datalen > 2 * sizeof (ElfW(Word)) + 2)
-		  {
-		    const ElfW(Word) *p = ((const void *) (note + 1)
-					   + ROUND (sizeof "GNU"));
-		    cnt += *p++;
-		    ++p;	/* Skip mask word.  */
-		    dsocaps = (const char *) p; /* Pseudo-string "<b>name"  */
-		    dsocapslen = note->datalen - sizeof *p * 2;
-		    break;
-		  }
-		note = ((const void *) (note + 1)
-			+ ROUND (note->vendorlen) + ROUND (note->datalen));
-#undef ROUND
-	      }
-	    if (dsocaps != NULL)
-	      break;
-	  }
-    }
-#endif
-
-  /* For TLS enabled builds always add 'tls'.  */
-  ++cnt;
-
-  /* Create temporary data structure to generate result table.  */
-  struct r_strlenpair temp[cnt];
-  m = 0;
-#ifdef NEED_DL_SYSINFO_DSO
-  if (dsocaps != NULL)
-    {
-      /* dsocaps points to the .asciz string, and -1 points to the mask
-         .long just before the string.  */
-      const ElfW(Word) mask = ((const ElfW(Word) *) dsocaps)[-1];
-      GLRO(dl_hwcap) |= (uint64_t) mask << _DL_FIRST_EXTRA;
-      /* Note that we add the dsocaps to the set already chosen by the
-	 LD_HWCAP_MASK environment variable (or default HWCAP_IMPORTANT).
-	 So there is no way to request ignoring an OS-supplied dsocap
-	 string and bit like you can ignore an OS-supplied HWCAP bit.  */
-      hwcap_mask |= (uint64_t) mask << _DL_FIRST_EXTRA;
-#if HAVE_TUNABLES
-      TUNABLE_SET (glibc, tune, hwcap_mask, uint64_t, hwcap_mask);
-#else
-      GLRO(dl_hwcap_mask) = hwcap_mask;
-#endif
-      size_t len;
-      for (const char *p = dsocaps; p < dsocaps + dsocapslen; p += len + 1)
-	{
-	  uint_fast8_t bit = *p++;
-	  len = strlen (p);
-
-	  /* Skip entries that are not enabled in the mask word.  */
-	  if (__glibc_likely (mask & ((ElfW(Word)) 1 << bit)))
-	    {
-	      temp[m].str = p;
-	      temp[m].len = len;
-	      ++m;
-	    }
-	  else
-	    --cnt;
-	}
-    }
-#endif
-  for (n = 0; masked != 0; ++n)
-    if ((masked & (1ULL << n)) != 0)
-      {
-	temp[m].str = _dl_hwcap_string (n);
-	temp[m].len = strlen (temp[m].str);
-	masked ^= 1ULL << n;
-	++m;
-      }
-  if (platform != NULL)
-    {
-      temp[m].str = platform;
-      temp[m].len = platform_len;
-      ++m;
-    }
-
-  temp[m].str = "tls";
-  temp[m].len = 3;
-  ++m;
-
-  assert (m == cnt);
-
-  /* Determine the total size of all strings together.  */
-  if (cnt == 1)
-    total = temp[0].len + 1;
-  else
-    {
-      total = temp[0].len + temp[cnt - 1].len + 2;
-      if (cnt > 2)
-	{
-	  total <<= 1;
-	  for (n = 1; n + 1 < cnt; ++n)
-	    total += temp[n].len + 1;
-	  if (cnt > 3
-	      && (cnt >= sizeof (size_t) * 8
-		  || total + (sizeof (*result) << 3)
-		     >= (1UL << (sizeof (size_t) * 8 - cnt + 3))))
-	    _dl_signal_error (ENOMEM, NULL, NULL,
-			      N_("cannot create capability list"));
-
-	  total <<= cnt - 3;
-	}
-    }
-
-  /* The result structure: we use a very compressed way to store the
-     various combinations of capability names.  */
-  *sz = 1 << cnt;
-  result = (struct r_strlenpair *) malloc (*sz * sizeof (*result) + total);
-  if (result == NULL)
-    _dl_signal_error (ENOMEM, NULL, NULL,
-		      N_("cannot create capability list"));
-
-  if (cnt == 1)
-    {
-      result[0].str = (char *) (result + *sz);
-      result[0].len = temp[0].len + 1;
-      result[1].str = (char *) (result + *sz);
-      result[1].len = 0;
-      cp = __mempcpy ((char *) (result + *sz), temp[0].str, temp[0].len);
-      *cp = '/';
-      *sz = 2;
-      *max_capstrlen = result[0].len;
-
-      return result;
-    }
-
-  /* Fill in the information.  This follows the following scheme
-     (indices from TEMP for four strings):
-	entry #0: 0, 1, 2, 3	binary: 1111
-	      #1: 0, 1, 3		1101
-	      #2: 0, 2, 3		1011
-	      #3: 0, 3			1001
-     This allows the representation of all possible combinations of
-     capability names in the string.  First generate the strings.  */
-  result[1].str = result[0].str = cp = (char *) (result + *sz);
-#define add(idx) \
-      cp = __mempcpy (__mempcpy (cp, temp[idx].str, temp[idx].len), "/", 1);
-  if (cnt == 2)
-    {
-      add (1);
-      add (0);
-    }
-  else
-    {
-      n = 1 << (cnt - 1);
-      do
-	{
-	  n -= 2;
-
-	  /* We always add the last string.  */
-	  add (cnt - 1);
-
-	  /* Add the strings which have the bit set in N.  */
-	  for (m = cnt - 2; m > 0; --m)
-	    if ((n & (1 << m)) != 0)
-	      add (m);
-
-	  /* Always add the first string.  */
-	  add (0);
-	}
-      while (n != 0);
-    }
-#undef add
-
-  /* Now we are ready to install the string pointers and length.  */
-  for (n = 0; n < (1UL << cnt); ++n)
-    result[n].len = 0;
-  n = cnt;
-  do
-    {
-      size_t mask = 1 << --n;
-
-      rp = result;
-      for (m = 1 << cnt; m > 0; ++rp)
-	if ((--m & mask) != 0)
-	  rp->len += temp[n].len + 1;
-    }
-  while (n != 0);
-
-  /* The first half of the strings all include the first string.  */
-  n = (1 << cnt) - 2;
-  rp = &result[2];
-  while (n != (1UL << (cnt - 1)))
-    {
-      if ((--n & 1) != 0)
-	rp[0].str = rp[-2].str + rp[-2].len;
-      else
-	rp[0].str = rp[-1].str;
-      ++rp;
-    }
-
-  /* The second half starts right after the first part of the string of
-     the corresponding entry in the first half.  */
-  do
-    {
-      rp[0].str = rp[-(1 << (cnt - 1))].str + temp[cnt - 1].len + 1;
-      ++rp;
-    }
-  while (--n != 0);
-
-  /* The maximum string length.  */
-  *max_capstrlen = result[0].len;
-
-  return result;
-}
diff --git a/elf/dl-hwcaps.h b/elf/dl-hwcaps.h
deleted file mode 100644
index 2c4fa3db02..0000000000
--- a/elf/dl-hwcaps.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Hardware capability support for run-time dynamic loader.
-   Copyright (C) 2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <elf/dl-tunables.h>
-
-#if HAVE_TUNABLES
-# define GET_HWCAP_MASK() TUNABLE_GET (glibc, tune, hwcap_mask, uint64_t, NULL)
-#else
-# ifdef SHARED
-#   define GET_HWCAP_MASK() GLRO(dl_hwcap_mask)
-# else
-/* HWCAP_MASK is ignored in static binaries when built without tunables.  */
-#  define GET_HWCAP_MASK() (0)
-# endif
-#endif
diff --git a/elf/dl-init.c b/elf/dl-init.c
deleted file mode 100644
index 5c5f3de365..0000000000
--- a/elf/dl-init.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/* Run initializers for newly loaded objects.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stddef.h>
-#include <ldsodefs.h>
-
-
-/* Type of the initializer.  */
-typedef void (*init_t) (int, char **, char **);
-
-
-static void
-call_init (struct link_map *l, int argc, char **argv, char **env)
-{
-  if (l->l_init_called)
-    /* This object is all done.  */
-    return;
-
-  /* Avoid handling this constructor again in case we have a circular
-     dependency.  */
-  l->l_init_called = 1;
-
-  /* Check for object which constructors we do not run here.  */
-  if (__builtin_expect (l->l_name[0], 'a') == '\0'
-      && l->l_type == lt_executable)
-    return;
-
-  /* Are there any constructors?  */
-  if (l->l_info[DT_INIT] == NULL
-      && __builtin_expect (l->l_info[DT_INIT_ARRAY] == NULL, 1))
-    return;
-
-  /* Print a debug message if wanted.  */
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS))
-    _dl_debug_printf ("\ncalling init: %s\n\n",
-		      DSO_FILENAME (l->l_name));
-
-  /* Now run the local constructors.  There are two forms of them:
-     - the one named by DT_INIT
-     - the others in the DT_INIT_ARRAY.
-  */
-  if (l->l_info[DT_INIT] != NULL)
-    DL_CALL_DT_INIT(l, l->l_addr + l->l_info[DT_INIT]->d_un.d_ptr, argc, argv, env);
-
-  /* Next see whether there is an array with initialization functions.  */
-  ElfW(Dyn) *init_array = l->l_info[DT_INIT_ARRAY];
-  if (init_array != NULL)
-    {
-      unsigned int j;
-      unsigned int jm;
-      ElfW(Addr) *addrs;
-
-      jm = l->l_info[DT_INIT_ARRAYSZ]->d_un.d_val / sizeof (ElfW(Addr));
-
-      addrs = (ElfW(Addr) *) (init_array->d_un.d_ptr + l->l_addr);
-      for (j = 0; j < jm; ++j)
-	((init_t) addrs[j]) (argc, argv, env);
-    }
-}
-
-
-void
-internal_function
-_dl_init (struct link_map *main_map, int argc, char **argv, char **env)
-{
-  ElfW(Dyn) *preinit_array = main_map->l_info[DT_PREINIT_ARRAY];
-  ElfW(Dyn) *preinit_array_size = main_map->l_info[DT_PREINIT_ARRAYSZ];
-  unsigned int i;
-
-  if (__glibc_unlikely (GL(dl_initfirst) != NULL))
-    {
-      call_init (GL(dl_initfirst), argc, argv, env);
-      GL(dl_initfirst) = NULL;
-    }
-
-  /* Don't do anything if there is no preinit array.  */
-  if (__builtin_expect (preinit_array != NULL, 0)
-      && preinit_array_size != NULL
-      && (i = preinit_array_size->d_un.d_val / sizeof (ElfW(Addr))) > 0)
-    {
-      ElfW(Addr) *addrs;
-      unsigned int cnt;
-
-      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS))
-	_dl_debug_printf ("\ncalling preinit: %s\n\n",
-			  DSO_FILENAME (main_map->l_name));
-
-      addrs = (ElfW(Addr) *) (preinit_array->d_un.d_ptr + main_map->l_addr);
-      for (cnt = 0; cnt < i; ++cnt)
-	((init_t) addrs[cnt]) (argc, argv, env);
-    }
-
-  /* Stupid users forced the ELF specification to be changed.  It now
-     says that the dynamic loader is responsible for determining the
-     order in which the constructors have to run.  The constructors
-     for all dependencies of an object must run before the constructor
-     for the object itself.  Circular dependencies are left unspecified.
-
-     This is highly questionable since it puts the burden on the dynamic
-     loader which has to find the dependencies at runtime instead of
-     letting the user do it right.  Stupidity rules!  */
-
-  i = main_map->l_searchlist.r_nlist;
-  while (i-- > 0)
-    call_init (main_map->l_initfini[i], argc, argv, env);
-
-#ifndef HAVE_INLINED_SYSCALLS
-  /* Finished starting up.  */
-  _dl_starting_up = 0;
-#endif
-}
diff --git a/elf/dl-iteratephdr.c b/elf/dl-iteratephdr.c
deleted file mode 100644
index ddd5bde831..0000000000
--- a/elf/dl-iteratephdr.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Get loaded objects program headers.
-   Copyright (C) 2001-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek <jakub@redhat.com>, 2001.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public License as
-   published by the Free Software Foundation; either version 2.1 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If
-   not, see <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <ldsodefs.h>
-#include <stddef.h>
-#include <libc-lock.h>
-
-static void
-cancel_handler (void *arg __attribute__((unused)))
-{
-  __rtld_lock_unlock_recursive (GL(dl_load_write_lock));
-}
-
-hidden_proto (__dl_iterate_phdr)
-int
-__dl_iterate_phdr (int (*callback) (struct dl_phdr_info *info,
-				    size_t size, void *data), void *data)
-{
-  struct link_map *l;
-  struct dl_phdr_info info;
-  int ret = 0;
-
-  /* Make sure nobody modifies the list of loaded objects.  */
-  __rtld_lock_lock_recursive (GL(dl_load_write_lock));
-  __libc_cleanup_push (cancel_handler, NULL);
-
-  /* We have to determine the namespace of the caller since this determines
-     which namespace is reported.  */
-  size_t nloaded = GL(dl_ns)[0]._ns_nloaded;
-  Lmid_t ns = 0;
-#ifdef SHARED
-  const void *caller = RETURN_ADDRESS (0);
-  for (Lmid_t cnt = GL(dl_nns) - 1; cnt > 0; --cnt)
-    for (struct link_map *l = GL(dl_ns)[cnt]._ns_loaded; l; l = l->l_next)
-      {
-	/* We have to count the total number of loaded objects.  */
-	nloaded += GL(dl_ns)[cnt]._ns_nloaded;
-
-	if (caller >= (const void *) l->l_map_start
-	    && caller < (const void *) l->l_map_end
-	    && (l->l_contiguous
-		|| _dl_addr_inside_object (l, (ElfW(Addr)) caller)))
-	  ns = cnt;
-      }
-#endif
-
-  for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next)
-    {
-      info.dlpi_addr = l->l_real->l_addr;
-      info.dlpi_name = l->l_real->l_name;
-      info.dlpi_phdr = l->l_real->l_phdr;
-      info.dlpi_phnum = l->l_real->l_phnum;
-      info.dlpi_adds = GL(dl_load_adds);
-      info.dlpi_subs = GL(dl_load_adds) - nloaded;
-      info.dlpi_tls_data = NULL;
-      info.dlpi_tls_modid = l->l_real->l_tls_modid;
-      if (info.dlpi_tls_modid != 0)
-	info.dlpi_tls_data = GLRO(dl_tls_get_addr_soft) (l->l_real);
-      ret = callback (&info, sizeof (struct dl_phdr_info), data);
-      if (ret)
-	break;
-    }
-
-  /* Release the lock.  */
-  __libc_cleanup_pop (0);
-  __rtld_lock_unlock_recursive (GL(dl_load_write_lock));
-
-  return ret;
-}
-hidden_def (__dl_iterate_phdr)
-
-weak_alias (__dl_iterate_phdr, dl_iterate_phdr);
diff --git a/elf/dl-libc.c b/elf/dl-libc.c
deleted file mode 100644
index 9fdc8b1130..0000000000
--- a/elf/dl-libc.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/* Handle loading and unloading shared objects for internal libc purposes.
-   Copyright (C) 1999-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Zack Weinberg <zack@rabi.columbia.edu>, 1999.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <ldsodefs.h>
-
-extern int __libc_argc attribute_hidden;
-extern char **__libc_argv attribute_hidden;
-
-extern char **__environ;
-
-/* The purpose of this file is to provide wrappers around the dynamic
-   linker error mechanism (similar to dlopen() et al in libdl) which
-   are usable from within libc.  Generally we want to throw away the
-   string that dlerror() would return and just pass back a null pointer
-   for errors.  This also lets the rest of libc not know about the error
-   handling mechanism.
-
-   Much of this code came from gconv_dl.c with slight modifications. */
-
-static int
-internal_function
-dlerror_run (void (*operate) (void *), void *args)
-{
-  const char *objname;
-  const char *last_errstring = NULL;
-  bool malloced;
-
-  int result = (_dl_catch_error (&objname, &last_errstring, &malloced,
-				operate, args)
-		?: last_errstring != NULL);
-
-  if (result && malloced)
-    free ((char *) last_errstring);
-
-  return result;
-}
-
-/* These functions are called by dlerror_run... */
-
-struct do_dlopen_args
-{
-  /* Argument to do_dlopen.  */
-  const char *name;
-  /* Opening mode.  */
-  int mode;
-  /* This is the caller of the dlopen() function.  */
-  const void *caller_dlopen;
-
-  /* Return from do_dlopen.  */
-  struct link_map *map;
-};
-
-struct do_dlsym_args
-{
-  /* Arguments to do_dlsym.  */
-  struct link_map *map;
-  const char *name;
-
-  /* Return values of do_dlsym.  */
-  lookup_t loadbase;
-  const ElfW(Sym) *ref;
-};
-
-static void
-do_dlopen (void *ptr)
-{
-  struct do_dlopen_args *args = (struct do_dlopen_args *) ptr;
-  /* Open and relocate the shared object.  */
-  args->map = GLRO(dl_open) (args->name, args->mode, args->caller_dlopen,
-			     __LM_ID_CALLER, __libc_argc, __libc_argv,
-			     __environ);
-}
-
-static void
-do_dlsym (void *ptr)
-{
-  struct do_dlsym_args *args = (struct do_dlsym_args *) ptr;
-  args->ref = NULL;
-  args->loadbase = GLRO(dl_lookup_symbol_x) (args->name, args->map, &args->ref,
-					     args->map->l_local_scope, NULL, 0,
-					     DL_LOOKUP_RETURN_NEWEST, NULL);
-}
-
-static void
-do_dlclose (void *ptr)
-{
-  GLRO(dl_close) ((struct link_map *) ptr);
-}
-
-/* This code is to support __libc_dlopen from __libc_dlopen'ed shared
-   libraries.  We need to ensure the statically linked __libc_dlopen
-   etc. functions are used instead of the dynamically loaded.  */
-struct dl_open_hook
-{
-  void *(*dlopen_mode) (const char *name, int mode);
-  void *(*dlsym) (void *map, const char *name);
-  int (*dlclose) (void *map);
-};
-
-#ifdef SHARED
-extern struct dl_open_hook *_dl_open_hook;
-libc_hidden_proto (_dl_open_hook);
-struct dl_open_hook *_dl_open_hook __attribute__ ((nocommon));
-libc_hidden_data_def (_dl_open_hook);
-#else
-static void
-do_dlsym_private (void *ptr)
-{
-  lookup_t l;
-  struct r_found_version vers;
-  vers.name = "GLIBC_PRIVATE";
-  vers.hidden = 1;
-  /* vers.hash = _dl_elf_hash (vers.name);  */
-  vers.hash = 0x0963cf85;
-  vers.filename = NULL;
-
-  struct do_dlsym_args *args = (struct do_dlsym_args *) ptr;
-  args->ref = NULL;
-  l = GLRO(dl_lookup_symbol_x) (args->name, args->map, &args->ref,
-				args->map->l_scope, &vers, 0, 0, NULL);
-  args->loadbase = l;
-}
-
-static struct dl_open_hook _dl_open_hook =
-  {
-    .dlopen_mode = __libc_dlopen_mode,
-    .dlsym = __libc_dlsym,
-    .dlclose = __libc_dlclose
-  };
-#endif
-
-/* ... and these functions call dlerror_run. */
-
-void *
-__libc_dlopen_mode (const char *name, int mode)
-{
-  struct do_dlopen_args args;
-  args.name = name;
-  args.mode = mode;
-  args.caller_dlopen = RETURN_ADDRESS (0);
-
-#ifdef SHARED
-  if (__glibc_unlikely (_dl_open_hook != NULL))
-    return _dl_open_hook->dlopen_mode (name, mode);
-  return (dlerror_run (do_dlopen, &args) ? NULL : (void *) args.map);
-#else
-  if (dlerror_run (do_dlopen, &args))
-    return NULL;
-
-  __libc_register_dl_open_hook (args.map);
-  __libc_register_dlfcn_hook (args.map);
-  return (void *) args.map;
-#endif
-}
-libc_hidden_def (__libc_dlopen_mode)
-
-#ifndef SHARED
-void *
-__libc_dlsym_private (struct link_map *map, const char *name)
-{
-  struct do_dlsym_args sargs;
-  sargs.map = map;
-  sargs.name = name;
-
-  if (! dlerror_run (do_dlsym_private, &sargs))
-    return DL_SYMBOL_ADDRESS (sargs.loadbase, sargs.ref);
-  return NULL;
-}
-
-void
-__libc_register_dl_open_hook (struct link_map *map)
-{
-  struct dl_open_hook **hook;
-
-  hook = (struct dl_open_hook **) __libc_dlsym_private (map, "_dl_open_hook");
-  if (hook != NULL)
-    *hook = &_dl_open_hook;
-}
-#endif
-
-void *
-__libc_dlsym (void *map, const char *name)
-{
-  struct do_dlsym_args args;
-  args.map = map;
-  args.name = name;
-
-#ifdef SHARED
-  if (__glibc_unlikely (_dl_open_hook != NULL))
-    return _dl_open_hook->dlsym (map, name);
-#endif
-  return (dlerror_run (do_dlsym, &args) ? NULL
-	  : (void *) (DL_SYMBOL_ADDRESS (args.loadbase, args.ref)));
-}
-libc_hidden_def (__libc_dlsym)
-
-int
-__libc_dlclose (void *map)
-{
-#ifdef SHARED
-  if (__glibc_unlikely (_dl_open_hook != NULL))
-    return _dl_open_hook->dlclose (map);
-#endif
-  return dlerror_run (do_dlclose, map);
-}
-libc_hidden_def (__libc_dlclose)
-
-
-static bool __libc_freeres_fn_section
-free_slotinfo (struct dtv_slotinfo_list **elemp)
-{
-  size_t cnt;
-
-  if (*elemp == NULL)
-    /* Nothing here, all is removed (or there never was anything).  */
-    return true;
-
-  if (!free_slotinfo (&(*elemp)->next))
-    /* We cannot free the entry.  */
-    return false;
-
-  /* That cleared our next pointer for us.  */
-
-  for (cnt = 0; cnt < (*elemp)->len; ++cnt)
-    if ((*elemp)->slotinfo[cnt].map != NULL)
-      /* Still used.  */
-      return false;
-
-  /* We can remove the list element.  */
-  free (*elemp);
-  *elemp = NULL;
-
-  return true;
-}
-
-
-libc_freeres_fn (free_mem)
-{
-  struct link_map *l;
-  struct r_search_path_elem *d;
-
-  /* Remove all search directories.  */
-  d = GL(dl_all_dirs);
-  while (d != GLRO(dl_init_all_dirs))
-    {
-      struct r_search_path_elem *old = d;
-      d = d->next;
-      free (old);
-    }
-
-  for (Lmid_t ns = 0; ns < GL(dl_nns); ++ns)
-    {
-      for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next)
-	{
-	  struct libname_list *lnp = l->l_libname->next;
-
-	  l->l_libname->next = NULL;
-
-	  /* Remove all additional names added to the objects.  */
-	  while (lnp != NULL)
-	    {
-	      struct libname_list *old = lnp;
-	      lnp = lnp->next;
-	      if (! old->dont_free)
-		free (old);
-	    }
-
-	  /* Free the initfini dependency list.  */
-	  if (l->l_free_initfini)
-	    free (l->l_initfini);
-	  l->l_initfini = NULL;
-	}
-
-      if (__builtin_expect (GL(dl_ns)[ns]._ns_global_scope_alloc, 0) != 0
-	  && (GL(dl_ns)[ns]._ns_main_searchlist->r_nlist
-	      // XXX Check whether we need NS-specific initial_searchlist
-	      == GLRO(dl_initial_searchlist).r_nlist))
-	{
-	  /* All object dynamically loaded by the program are unloaded.  Free
-	     the memory allocated for the global scope variable.  */
-	  struct link_map **old = GL(dl_ns)[ns]._ns_main_searchlist->r_list;
-
-	  /* Put the old map in.  */
-	  GL(dl_ns)[ns]._ns_main_searchlist->r_list
-	    // XXX Check whether we need NS-specific initial_searchlist
-	    = GLRO(dl_initial_searchlist).r_list;
-	  /* Signal that the original map is used.  */
-	  GL(dl_ns)[ns]._ns_global_scope_alloc = 0;
-
-	  /* Now free the old map.  */
-	  free (old);
-	}
-    }
-
-  /* Free the memory allocated for the dtv slotinfo array.  We can do
-     this only if all modules which used this memory are unloaded.  */
-#ifdef SHARED
-  if (GL(dl_initial_dtv) == NULL)
-    /* There was no initial TLS setup, it was set up later when
-       it used the normal malloc.  */
-    free_slotinfo (&GL(dl_tls_dtv_slotinfo_list));
-  else
-#endif
-    /* The first element of the list does not have to be deallocated.
-       It was allocated in the dynamic linker (i.e., with a different
-       malloc), and in the static library it's in .bss space.  */
-    free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next);
-
-  void *scope_free_list = GL(dl_scope_free_list);
-  GL(dl_scope_free_list) = NULL;
-  free (scope_free_list);
-}
diff --git a/elf/dl-load.c b/elf/dl-load.c
deleted file mode 100644
index c1b6d4ba0f..0000000000
--- a/elf/dl-load.c
+++ /dev/null
@@ -1,2307 +0,0 @@
-/* Map in a shared object's segments from the file.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <elf.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libintl.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-#include <bits/wordsize.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include "dynamic-link.h"
-#include <abi-tag.h>
-#include <stackinfo.h>
-#include <caller.h>
-#include <sysdep.h>
-#include <stap-probe.h>
-#include <libc-pointer-arith.h>
-
-#include <dl-dst.h>
-#include <dl-load.h>
-#include <dl-map-segments.h>
-#include <dl-unmap-segments.h>
-#include <dl-machine-reject-phdr.h>
-#include <dl-sysdep-open.h>
-
-
-#include <endian.h>
-#if BYTE_ORDER == BIG_ENDIAN
-# define byteorder ELFDATA2MSB
-#elif BYTE_ORDER == LITTLE_ENDIAN
-# define byteorder ELFDATA2LSB
-#else
-# error "Unknown BYTE_ORDER " BYTE_ORDER
-# define byteorder ELFDATANONE
-#endif
-
-#define STRING(x) __STRING (x)
-
-
-int __stack_prot attribute_hidden attribute_relro
-#if _STACK_GROWS_DOWN && defined PROT_GROWSDOWN
-  = PROT_GROWSDOWN;
-#elif _STACK_GROWS_UP && defined PROT_GROWSUP
-  = PROT_GROWSUP;
-#else
-  = 0;
-#endif
-
-
-/* Type for the buffer we put the ELF header and hopefully the program
-   header.  This buffer does not really have to be too large.  In most
-   cases the program header follows the ELF header directly.  If this
-   is not the case all bets are off and we can make the header
-   arbitrarily large and still won't get it read.  This means the only
-   question is how large are the ELF and program header combined.  The
-   ELF header 32-bit files is 52 bytes long and in 64-bit files is 64
-   bytes long.  Each program header entry is again 32 and 56 bytes
-   long respectively.  I.e., even with a file which has 10 program
-   header entries we only have to read 372B/624B respectively.  Add to
-   this a bit of margin for program notes and reading 512B and 832B
-   for 32-bit and 64-bit files respecitvely is enough.  If this
-   heuristic should really fail for some file the code in
-   `_dl_map_object_from_fd' knows how to recover.  */
-struct filebuf
-{
-  ssize_t len;
-#if __WORDSIZE == 32
-# define FILEBUF_SIZE 512
-#else
-# define FILEBUF_SIZE 832
-#endif
-  char buf[FILEBUF_SIZE] __attribute__ ((aligned (__alignof (ElfW(Ehdr)))));
-};
-
-/* This is the decomposed LD_LIBRARY_PATH search path.  */
-static struct r_search_path_struct env_path_list attribute_relro;
-
-/* List of the hardware capabilities we might end up using.  */
-static const struct r_strlenpair *capstr attribute_relro;
-static size_t ncapstr attribute_relro;
-static size_t max_capstrlen attribute_relro;
-
-
-/* Get the generated information about the trusted directories.  */
-#include "trusted-dirs.h"
-
-static const char system_dirs[] = SYSTEM_DIRS;
-static const size_t system_dirs_len[] =
-{
-  SYSTEM_DIRS_LEN
-};
-#define nsystem_dirs_len \
-  (sizeof (system_dirs_len) / sizeof (system_dirs_len[0]))
-
-
-static bool
-is_trusted_path (const char *path, size_t len)
-{
-  const char *trun = system_dirs;
-
-  for (size_t idx = 0; idx < nsystem_dirs_len; ++idx)
-    {
-      if (len == system_dirs_len[idx] && memcmp (trun, path, len) == 0)
-	/* Found it.  */
-	return true;
-
-      trun += system_dirs_len[idx] + 1;
-    }
-
-  return false;
-}
-
-
-static bool
-is_trusted_path_normalize (const char *path, size_t len)
-{
-  if (len == 0)
-    return false;
-
-  if (*path == ':')
-    {
-      ++path;
-      --len;
-    }
-
-  char *npath = (char *) alloca (len + 2);
-  char *wnp = npath;
-  while (*path != '\0')
-    {
-      if (path[0] == '/')
-	{
-	  if (path[1] == '.')
-	    {
-	      if (path[2] == '.' && (path[3] == '/' || path[3] == '\0'))
-		{
-		  while (wnp > npath && *--wnp != '/')
-		    ;
-		  path += 3;
-		  continue;
-		}
-	      else if (path[2] == '/' || path[2] == '\0')
-		{
-		  path += 2;
-		  continue;
-		}
-	    }
-
-	  if (wnp > npath && wnp[-1] == '/')
-	    {
-	      ++path;
-	      continue;
-	    }
-	}
-
-      *wnp++ = *path++;
-    }
-
-  if (wnp == npath || wnp[-1] != '/')
-    *wnp++ = '/';
-
-  const char *trun = system_dirs;
-
-  for (size_t idx = 0; idx < nsystem_dirs_len; ++idx)
-    {
-      if (wnp - npath >= system_dirs_len[idx]
-	  && memcmp (trun, npath, system_dirs_len[idx]) == 0)
-	/* Found it.  */
-	return true;
-
-      trun += system_dirs_len[idx] + 1;
-    }
-
-  return false;
-}
-
-
-static size_t
-is_dst (const char *start, const char *name, const char *str,
-	int is_path, int secure)
-{
-  size_t len;
-  bool is_curly = false;
-
-  if (name[0] == '{')
-    {
-      is_curly = true;
-      ++name;
-    }
-
-  len = 0;
-  while (name[len] == str[len] && name[len] != '\0')
-    ++len;
-
-  if (is_curly)
-    {
-      if (name[len] != '}')
-	return 0;
-
-      /* Point again at the beginning of the name.  */
-      --name;
-      /* Skip over closing curly brace and adjust for the --name.  */
-      len += 2;
-    }
-  else if (name[len] != '\0' && name[len] != '/'
-	   && (!is_path || name[len] != ':'))
-    return 0;
-
-  if (__glibc_unlikely (secure)
-      && ((name[len] != '\0' && name[len] != '/'
-	   && (!is_path || name[len] != ':'))
-	  || (name != start + 1 && (!is_path || name[-2] != ':'))))
-    return 0;
-
-  return len;
-}
-
-
-size_t
-_dl_dst_count (const char *name, int is_path)
-{
-  const char *const start = name;
-  size_t cnt = 0;
-
-  do
-    {
-      size_t len;
-
-      /* $ORIGIN is not expanded for SUID/GUID programs (except if it
-	 is $ORIGIN alone) and it must always appear first in path.  */
-      ++name;
-      if ((len = is_dst (start, name, "ORIGIN", is_path,
-			 __libc_enable_secure)) != 0
-	  || (len = is_dst (start, name, "PLATFORM", is_path, 0)) != 0
-	  || (len = is_dst (start, name, "LIB", is_path, 0)) != 0)
-	++cnt;
-
-      name = strchr (name + len, '$');
-    }
-  while (name != NULL);
-
-  return cnt;
-}
-
-
-char *
-_dl_dst_substitute (struct link_map *l, const char *name, char *result,
-		    int is_path)
-{
-  const char *const start = name;
-
-  /* Now fill the result path.  While copying over the string we keep
-     track of the start of the last path element.  When we come across
-     a DST we copy over the value or (if the value is not available)
-     leave the entire path element out.  */
-  char *wp = result;
-  char *last_elem = result;
-  bool check_for_trusted = false;
-
-  do
-    {
-      if (__glibc_unlikely (*name == '$'))
-	{
-	  const char *repl = NULL;
-	  size_t len;
-
-	  ++name;
-	  if ((len = is_dst (start, name, "ORIGIN", is_path,
-			     __libc_enable_secure)) != 0)
-	    {
-	      repl = l->l_origin;
-	      check_for_trusted = (__libc_enable_secure
-				   && l->l_type == lt_executable);
-	    }
-	  else if ((len = is_dst (start, name, "PLATFORM", is_path, 0)) != 0)
-	    repl = GLRO(dl_platform);
-	  else if ((len = is_dst (start, name, "LIB", is_path, 0)) != 0)
-	    repl = DL_DST_LIB;
-
-	  if (repl != NULL && repl != (const char *) -1)
-	    {
-	      wp = __stpcpy (wp, repl);
-	      name += len;
-	    }
-	  else if (len > 1)
-	    {
-	      /* We cannot use this path element, the value of the
-		 replacement is unknown.  */
-	      wp = last_elem;
-	      name += len;
-	      while (*name != '\0' && (!is_path || *name != ':'))
-		++name;
-	      /* Also skip following colon if this is the first rpath
-		 element, but keep an empty element at the end.  */
-	      if (wp == result && is_path && *name == ':' && name[1] != '\0')
-		++name;
-	    }
-	  else
-	    /* No DST we recognize.  */
-	    *wp++ = '$';
-	}
-      else
-	{
-	  *wp++ = *name++;
-	  if (is_path && *name == ':')
-	    {
-	      /* In SUID/SGID programs, after $ORIGIN expansion the
-		 normalized path must be rooted in one of the trusted
-		 directories.  */
-	      if (__glibc_unlikely (check_for_trusted)
-		  && !is_trusted_path_normalize (last_elem, wp - last_elem))
-		wp = last_elem;
-	      else
-		last_elem = wp;
-
-	      check_for_trusted = false;
-	    }
-	}
-    }
-  while (*name != '\0');
-
-  /* In SUID/SGID programs, after $ORIGIN expansion the normalized
-     path must be rooted in one of the trusted directories.  */
-  if (__glibc_unlikely (check_for_trusted)
-      && !is_trusted_path_normalize (last_elem, wp - last_elem))
-    wp = last_elem;
-
-  *wp = '\0';
-
-  return result;
-}
-
-
-/* Return copy of argument with all recognized dynamic string tokens
-   ($ORIGIN and $PLATFORM for now) replaced.  On some platforms it
-   might not be possible to determine the path from which the object
-   belonging to the map is loaded.  In this case the path element
-   containing $ORIGIN is left out.  */
-static char *
-expand_dynamic_string_token (struct link_map *l, const char *s, int is_path)
-{
-  /* We make two runs over the string.  First we determine how large the
-     resulting string is and then we copy it over.  Since this is no
-     frequently executed operation we are looking here not for performance
-     but rather for code size.  */
-  size_t cnt;
-  size_t total;
-  char *result;
-
-  /* Determine the number of DST elements.  */
-  cnt = DL_DST_COUNT (s, is_path);
-
-  /* If we do not have to replace anything simply copy the string.  */
-  if (__glibc_likely (cnt == 0))
-    return __strdup (s);
-
-  /* Determine the length of the substituted string.  */
-  total = DL_DST_REQUIRED (l, s, strlen (s), cnt);
-
-  /* Allocate the necessary memory.  */
-  result = (char *) malloc (total + 1);
-  if (result == NULL)
-    return NULL;
-
-  return _dl_dst_substitute (l, s, result, is_path);
-}
-
-
-/* Add `name' to the list of names for a particular shared object.
-   `name' is expected to have been allocated with malloc and will
-   be freed if the shared object already has this name.
-   Returns false if the object already had this name.  */
-static void
-internal_function
-add_name_to_object (struct link_map *l, const char *name)
-{
-  struct libname_list *lnp, *lastp;
-  struct libname_list *newname;
-  size_t name_len;
-
-  lastp = NULL;
-  for (lnp = l->l_libname; lnp != NULL; lastp = lnp, lnp = lnp->next)
-    if (strcmp (name, lnp->name) == 0)
-      return;
-
-  name_len = strlen (name) + 1;
-  newname = (struct libname_list *) malloc (sizeof *newname + name_len);
-  if (newname == NULL)
-    {
-      /* No more memory.  */
-      _dl_signal_error (ENOMEM, name, NULL, N_("cannot allocate name record"));
-      return;
-    }
-  /* The object should have a libname set from _dl_new_object.  */
-  assert (lastp != NULL);
-
-  newname->name = memcpy (newname + 1, name, name_len);
-  newname->next = NULL;
-  newname->dont_free = 0;
-  lastp->next = newname;
-}
-
-/* Standard search directories.  */
-static struct r_search_path_struct rtld_search_dirs attribute_relro;
-
-static size_t max_dirnamelen;
-
-static struct r_search_path_elem **
-fillin_rpath (char *rpath, struct r_search_path_elem **result, const char *sep,
-	      int check_trusted, const char *what, const char *where,
-	      struct link_map *l)
-{
-  char *cp;
-  size_t nelems = 0;
-  char *to_free;
-
-  while ((cp = __strsep (&rpath, sep)) != NULL)
-    {
-      struct r_search_path_elem *dirp;
-
-      to_free = cp = expand_dynamic_string_token (l, cp, 1);
-
-      size_t len = strlen (cp);
-
-      /* `strsep' can pass an empty string.  This has to be
-	 interpreted as `use the current directory'. */
-      if (len == 0)
-	{
-	  static const char curwd[] = "./";
-	  cp = (char *) curwd;
-	}
-
-      /* Remove trailing slashes (except for "/").  */
-      while (len > 1 && cp[len - 1] == '/')
-	--len;
-
-      /* Now add one if there is none so far.  */
-      if (len > 0 && cp[len - 1] != '/')
-	cp[len++] = '/';
-
-      /* Make sure we don't use untrusted directories if we run SUID.  */
-      if (__glibc_unlikely (check_trusted) && !is_trusted_path (cp, len))
-	{
-	  free (to_free);
-	  continue;
-	}
-
-      /* See if this directory is already known.  */
-      for (dirp = GL(dl_all_dirs); dirp != NULL; dirp = dirp->next)
-	if (dirp->dirnamelen == len && memcmp (cp, dirp->dirname, len) == 0)
-	  break;
-
-      if (dirp != NULL)
-	{
-	  /* It is available, see whether it's on our own list.  */
-	  size_t cnt;
-	  for (cnt = 0; cnt < nelems; ++cnt)
-	    if (result[cnt] == dirp)
-	      break;
-
-	  if (cnt == nelems)
-	    result[nelems++] = dirp;
-	}
-      else
-	{
-	  size_t cnt;
-	  enum r_dir_status init_val;
-	  size_t where_len = where ? strlen (where) + 1 : 0;
-
-	  /* It's a new directory.  Create an entry and add it.  */
-	  dirp = (struct r_search_path_elem *)
-	    malloc (sizeof (*dirp) + ncapstr * sizeof (enum r_dir_status)
-		    + where_len + len + 1);
-	  if (dirp == NULL)
-	    _dl_signal_error (ENOMEM, NULL, NULL,
-			      N_("cannot create cache for search path"));
-
-	  dirp->dirname = ((char *) dirp + sizeof (*dirp)
-			   + ncapstr * sizeof (enum r_dir_status));
-	  *((char *) __mempcpy ((char *) dirp->dirname, cp, len)) = '\0';
-	  dirp->dirnamelen = len;
-
-	  if (len > max_dirnamelen)
-	    max_dirnamelen = len;
-
-	  /* We have to make sure all the relative directories are
-	     never ignored.  The current directory might change and
-	     all our saved information would be void.  */
-	  init_val = cp[0] != '/' ? existing : unknown;
-	  for (cnt = 0; cnt < ncapstr; ++cnt)
-	    dirp->status[cnt] = init_val;
-
-	  dirp->what = what;
-	  if (__glibc_likely (where != NULL))
-	    dirp->where = memcpy ((char *) dirp + sizeof (*dirp) + len + 1
-				  + (ncapstr * sizeof (enum r_dir_status)),
-				  where, where_len);
-	  else
-	    dirp->where = NULL;
-
-	  dirp->next = GL(dl_all_dirs);
-	  GL(dl_all_dirs) = dirp;
-
-	  /* Put it in the result array.  */
-	  result[nelems++] = dirp;
-	}
-      free (to_free);
-    }
-
-  /* Terminate the array.  */
-  result[nelems] = NULL;
-
-  return result;
-}
-
-
-static bool
-internal_function
-decompose_rpath (struct r_search_path_struct *sps,
-		 const char *rpath, struct link_map *l, const char *what)
-{
-  /* Make a copy we can work with.  */
-  const char *where = l->l_name;
-  char *copy;
-  char *cp;
-  struct r_search_path_elem **result;
-  size_t nelems;
-  /* Initialize to please the compiler.  */
-  const char *errstring = NULL;
-
-  /* First see whether we must forget the RUNPATH and RPATH from this
-     object.  */
-  if (__glibc_unlikely (GLRO(dl_inhibit_rpath) != NULL)
-      && !__libc_enable_secure)
-    {
-      const char *inhp = GLRO(dl_inhibit_rpath);
-
-      do
-	{
-	  const char *wp = where;
-
-	  while (*inhp == *wp && *wp != '\0')
-	    {
-	      ++inhp;
-	      ++wp;
-	    }
-
-	  if (*wp == '\0' && (*inhp == '\0' || *inhp == ':'))
-	    {
-	      /* This object is on the list of objects for which the
-		 RUNPATH and RPATH must not be used.  */
-	      sps->dirs = (void *) -1;
-	      return false;
-	    }
-
-	  while (*inhp != '\0')
-	    if (*inhp++ == ':')
-	      break;
-	}
-      while (*inhp != '\0');
-    }
-
-  /* Make a writable copy.  */
-  copy = __strdup (rpath);
-  if (copy == NULL)
-    {
-      errstring = N_("cannot create RUNPATH/RPATH copy");
-      goto signal_error;
-    }
-
-  /* Ignore empty rpaths.  */
-  if (*copy == 0)
-    {
-      free (copy);
-      sps->dirs = (struct r_search_path_elem **) -1;
-      return false;
-    }
-
-  /* Count the number of necessary elements in the result array.  */
-  nelems = 0;
-  for (cp = copy; *cp != '\0'; ++cp)
-    if (*cp == ':')
-      ++nelems;
-
-  /* Allocate room for the result.  NELEMS + 1 is an upper limit for the
-     number of necessary entries.  */
-  result = (struct r_search_path_elem **) malloc ((nelems + 1 + 1)
-						  * sizeof (*result));
-  if (result == NULL)
-    {
-      free (copy);
-      errstring = N_("cannot create cache for search path");
-    signal_error:
-      _dl_signal_error (ENOMEM, NULL, NULL, errstring);
-    }
-
-  fillin_rpath (copy, result, ":", 0, what, where, l);
-
-  /* Free the copied RPATH string.  `fillin_rpath' make own copies if
-     necessary.  */
-  free (copy);
-
-  sps->dirs = result;
-  /* The caller will change this value if we haven't used a real malloc.  */
-  sps->malloced = 1;
-  return true;
-}
-
-/* Make sure cached path information is stored in *SP
-   and return true if there are any paths to search there.  */
-static bool
-cache_rpath (struct link_map *l,
-	     struct r_search_path_struct *sp,
-	     int tag,
-	     const char *what)
-{
-  if (sp->dirs == (void *) -1)
-    return false;
-
-  if (sp->dirs != NULL)
-    return true;
-
-  if (l->l_info[tag] == NULL)
-    {
-      /* There is no path.  */
-      sp->dirs = (void *) -1;
-      return false;
-    }
-
-  /* Make sure the cache information is available.  */
-  return decompose_rpath (sp, (const char *) (D_PTR (l, l_info[DT_STRTAB])
-					      + l->l_info[tag]->d_un.d_val),
-			  l, what);
-}
-
-
-void
-internal_function
-_dl_init_paths (const char *llp)
-{
-  size_t idx;
-  const char *strp;
-  struct r_search_path_elem *pelem, **aelem;
-  size_t round_size;
-  struct link_map __attribute__ ((unused)) *l = NULL;
-  /* Initialize to please the compiler.  */
-  const char *errstring = NULL;
-
-  /* Fill in the information about the application's RPATH and the
-     directories addressed by the LD_LIBRARY_PATH environment variable.  */
-
-  /* Get the capabilities.  */
-  capstr = _dl_important_hwcaps (GLRO(dl_platform), GLRO(dl_platformlen),
-				 &ncapstr, &max_capstrlen);
-
-  /* First set up the rest of the default search directory entries.  */
-  aelem = rtld_search_dirs.dirs = (struct r_search_path_elem **)
-    malloc ((nsystem_dirs_len + 1) * sizeof (struct r_search_path_elem *));
-  if (rtld_search_dirs.dirs == NULL)
-    {
-      errstring = N_("cannot create search path array");
-    signal_error:
-      _dl_signal_error (ENOMEM, NULL, NULL, errstring);
-    }
-
-  round_size = ((2 * sizeof (struct r_search_path_elem) - 1
-		 + ncapstr * sizeof (enum r_dir_status))
-		/ sizeof (struct r_search_path_elem));
-
-  rtld_search_dirs.dirs[0] = (struct r_search_path_elem *)
-    malloc ((sizeof (system_dirs) / sizeof (system_dirs[0]))
-	    * round_size * sizeof (struct r_search_path_elem));
-  if (rtld_search_dirs.dirs[0] == NULL)
-    {
-      errstring = N_("cannot create cache for search path");
-      goto signal_error;
-    }
-
-  rtld_search_dirs.malloced = 0;
-  pelem = GL(dl_all_dirs) = rtld_search_dirs.dirs[0];
-  strp = system_dirs;
-  idx = 0;
-
-  do
-    {
-      size_t cnt;
-
-      *aelem++ = pelem;
-
-      pelem->what = "system search path";
-      pelem->where = NULL;
-
-      pelem->dirname = strp;
-      pelem->dirnamelen = system_dirs_len[idx];
-      strp += system_dirs_len[idx] + 1;
-
-      /* System paths must be absolute.  */
-      assert (pelem->dirname[0] == '/');
-      for (cnt = 0; cnt < ncapstr; ++cnt)
-	pelem->status[cnt] = unknown;
-
-      pelem->next = (++idx == nsystem_dirs_len ? NULL : (pelem + round_size));
-
-      pelem += round_size;
-    }
-  while (idx < nsystem_dirs_len);
-
-  max_dirnamelen = SYSTEM_DIRS_MAX_LEN;
-  *aelem = NULL;
-
-#ifdef SHARED
-  /* This points to the map of the main object.  */
-  l = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
-  if (l != NULL)
-    {
-      assert (l->l_type != lt_loaded);
-
-      if (l->l_info[DT_RUNPATH])
-	{
-	  /* Allocate room for the search path and fill in information
-	     from RUNPATH.  */
-	  decompose_rpath (&l->l_runpath_dirs,
-			   (const void *) (D_PTR (l, l_info[DT_STRTAB])
-					   + l->l_info[DT_RUNPATH]->d_un.d_val),
-			   l, "RUNPATH");
-	  /* During rtld init the memory is allocated by the stub malloc,
-	     prevent any attempt to free it by the normal malloc.  */
-	  l->l_runpath_dirs.malloced = 0;
-
-	  /* The RPATH is ignored.  */
-	  l->l_rpath_dirs.dirs = (void *) -1;
-	}
-      else
-	{
-	  l->l_runpath_dirs.dirs = (void *) -1;
-
-	  if (l->l_info[DT_RPATH])
-	    {
-	      /* Allocate room for the search path and fill in information
-		 from RPATH.  */
-	      decompose_rpath (&l->l_rpath_dirs,
-			       (const void *) (D_PTR (l, l_info[DT_STRTAB])
-					       + l->l_info[DT_RPATH]->d_un.d_val),
-			       l, "RPATH");
-	      /* During rtld init the memory is allocated by the stub
-		 malloc, prevent any attempt to free it by the normal
-		 malloc.  */
-	      l->l_rpath_dirs.malloced = 0;
-	    }
-	  else
-	    l->l_rpath_dirs.dirs = (void *) -1;
-	}
-    }
-#endif	/* SHARED */
-
-  if (llp != NULL && *llp != '\0')
-    {
-      size_t nllp;
-      const char *cp = llp;
-      char *llp_tmp;
-
-#ifdef SHARED
-      /* Expand DSTs.  */
-      size_t cnt = DL_DST_COUNT (llp, 1);
-      if (__glibc_likely (cnt == 0))
-	llp_tmp = strdupa (llp);
-      else
-	{
-	  /* Determine the length of the substituted string.  */
-	  size_t total = DL_DST_REQUIRED (l, llp, strlen (llp), cnt);
-
-	  /* Allocate the necessary memory.  */
-	  llp_tmp = (char *) alloca (total + 1);
-	  llp_tmp = _dl_dst_substitute (l, llp, llp_tmp, 1);
-	}
-#else
-      llp_tmp = strdupa (llp);
-#endif
-
-      /* Decompose the LD_LIBRARY_PATH contents.  First determine how many
-	 elements it has.  */
-      nllp = 1;
-      while (*cp)
-	{
-	  if (*cp == ':' || *cp == ';')
-	    ++nllp;
-	  ++cp;
-	}
-
-      env_path_list.dirs = (struct r_search_path_elem **)
-	malloc ((nllp + 1) * sizeof (struct r_search_path_elem *));
-      if (env_path_list.dirs == NULL)
-	{
-	  errstring = N_("cannot create cache for search path");
-	  goto signal_error;
-	}
-
-      (void) fillin_rpath (llp_tmp, env_path_list.dirs, ":;",
-			   __libc_enable_secure, "LD_LIBRARY_PATH",
-			   NULL, l);
-
-      if (env_path_list.dirs[0] == NULL)
-	{
-	  free (env_path_list.dirs);
-	  env_path_list.dirs = (void *) -1;
-	}
-
-      env_path_list.malloced = 0;
-    }
-  else
-    env_path_list.dirs = (void *) -1;
-}
-
-
-static void
-__attribute__ ((noreturn, noinline))
-lose (int code, int fd, const char *name, char *realname, struct link_map *l,
-      const char *msg, struct r_debug *r, Lmid_t nsid)
-{
-  /* The file might already be closed.  */
-  if (fd != -1)
-    (void) __close (fd);
-  if (l != NULL && l->l_origin != (char *) -1l)
-    free ((char *) l->l_origin);
-  free (l);
-  free (realname);
-
-  if (r != NULL)
-    {
-      r->r_state = RT_CONSISTENT;
-      _dl_debug_state ();
-      LIBC_PROBE (map_failed, 2, nsid, r);
-    }
-
-  _dl_signal_error (code, name, NULL, msg);
-}
-
-
-/* Map in the shared object NAME, actually located in REALNAME, and already
-   opened on FD.  */
-
-#ifndef EXTERNAL_MAP_FROM_FD
-static
-#endif
-struct link_map *
-_dl_map_object_from_fd (const char *name, const char *origname, int fd,
-			struct filebuf *fbp, char *realname,
-			struct link_map *loader, int l_type, int mode,
-			void **stack_endp, Lmid_t nsid)
-{
-  struct link_map *l = NULL;
-  const ElfW(Ehdr) *header;
-  const ElfW(Phdr) *phdr;
-  const ElfW(Phdr) *ph;
-  size_t maplength;
-  int type;
-  /* Initialize to keep the compiler happy.  */
-  const char *errstring = NULL;
-  int errval = 0;
-  struct r_debug *r = _dl_debug_initialize (0, nsid);
-  bool make_consistent = false;
-
-  /* Get file information.  */
-  struct r_file_id id;
-  if (__glibc_unlikely (!_dl_get_file_id (fd, &id)))
-    {
-      errstring = N_("cannot stat shared object");
-    call_lose_errno:
-      errval = errno;
-    call_lose:
-      lose (errval, fd, name, realname, l, errstring,
-	    make_consistent ? r : NULL, nsid);
-    }
-
-  /* Look again to see if the real name matched another already loaded.  */
-  for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next)
-    if (!l->l_removed && _dl_file_id_match_p (&l->l_file_id, &id))
-      {
-	/* The object is already loaded.
-	   Just bump its reference count and return it.  */
-	__close (fd);
-
-	/* If the name is not in the list of names for this object add
-	   it.  */
-	free (realname);
-	add_name_to_object (l, name);
-
-	return l;
-      }
-
-#ifdef SHARED
-  /* When loading into a namespace other than the base one we must
-     avoid loading ld.so since there can only be one copy.  Ever.  */
-  if (__glibc_unlikely (nsid != LM_ID_BASE)
-      && (_dl_file_id_match_p (&id, &GL(dl_rtld_map).l_file_id)
-	  || _dl_name_match_p (name, &GL(dl_rtld_map))))
-    {
-      /* This is indeed ld.so.  Create a new link_map which refers to
-	 the real one for almost everything.  */
-      l = _dl_new_object (realname, name, l_type, loader, mode, nsid);
-      if (l == NULL)
-	goto fail_new;
-
-      /* Refer to the real descriptor.  */
-      l->l_real = &GL(dl_rtld_map);
-
-      /* No need to bump the refcount of the real object, ld.so will
-	 never be unloaded.  */
-      __close (fd);
-
-      /* Add the map for the mirrored object to the object list.  */
-      _dl_add_to_namespace_list (l, nsid);
-
-      return l;
-    }
-#endif
-
-  if (mode & RTLD_NOLOAD)
-    {
-      /* We are not supposed to load the object unless it is already
-	 loaded.  So return now.  */
-      free (realname);
-      __close (fd);
-      return NULL;
-    }
-
-  /* Print debugging message.  */
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
-    _dl_debug_printf ("file=%s [%lu];  generating link map\n", name, nsid);
-
-  /* This is the ELF header.  We read it in `open_verify'.  */
-  header = (void *) fbp->buf;
-
-#ifndef MAP_ANON
-# define MAP_ANON 0
-  if (_dl_zerofd == -1)
-    {
-      _dl_zerofd = _dl_sysdep_open_zero_fill ();
-      if (_dl_zerofd == -1)
-	{
-	  free (realname);
-	  __close (fd);
-	  _dl_signal_error (errno, NULL, NULL,
-			    N_("cannot open zero fill device"));
-	}
-    }
-#endif
-
-  /* Signal that we are going to add new objects.  */
-  if (r->r_state == RT_CONSISTENT)
-    {
-#ifdef SHARED
-      /* Auditing checkpoint: we are going to add new objects.  */
-      if ((mode & __RTLD_AUDIT) == 0
-	  && __glibc_unlikely (GLRO(dl_naudit) > 0))
-	{
-	  struct link_map *head = GL(dl_ns)[nsid]._ns_loaded;
-	  /* Do not call the functions for any auditing object.  */
-	  if (head->l_auditing == 0)
-	    {
-	      struct audit_ifaces *afct = GLRO(dl_audit);
-	      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-		{
-		  if (afct->activity != NULL)
-		    afct->activity (&head->l_audit[cnt].cookie, LA_ACT_ADD);
-
-		  afct = afct->next;
-		}
-	    }
-	}
-#endif
-
-      /* Notify the debugger we have added some objects.  We need to
-	 call _dl_debug_initialize in a static program in case dynamic
-	 linking has not been used before.  */
-      r->r_state = RT_ADD;
-      _dl_debug_state ();
-      LIBC_PROBE (map_start, 2, nsid, r);
-      make_consistent = true;
-    }
-  else
-    assert (r->r_state == RT_ADD);
-
-  /* Enter the new object in the list of loaded objects.  */
-  l = _dl_new_object (realname, name, l_type, loader, mode, nsid);
-  if (__glibc_unlikely (l == NULL))
-    {
-#ifdef SHARED
-    fail_new:
-#endif
-      errstring = N_("cannot create shared object descriptor");
-      goto call_lose_errno;
-    }
-
-  /* Extract the remaining details we need from the ELF header
-     and then read in the program header table.  */
-  l->l_entry = header->e_entry;
-  type = header->e_type;
-  l->l_phnum = header->e_phnum;
-
-  maplength = header->e_phnum * sizeof (ElfW(Phdr));
-  if (header->e_phoff + maplength <= (size_t) fbp->len)
-    phdr = (void *) (fbp->buf + header->e_phoff);
-  else
-    {
-      phdr = alloca (maplength);
-      __lseek (fd, header->e_phoff, SEEK_SET);
-      if ((size_t) __libc_read (fd, (void *) phdr, maplength) != maplength)
-	{
-	  errstring = N_("cannot read file data");
-	  goto call_lose_errno;
-	}
-    }
-
-   /* On most platforms presume that PT_GNU_STACK is absent and the stack is
-    * executable.  Other platforms default to a nonexecutable stack and don't
-    * need PT_GNU_STACK to do so.  */
-   uint_fast16_t stack_flags = DEFAULT_STACK_PERMS;
-
-  {
-    /* Scan the program header table, collecting its load commands.  */
-    struct loadcmd loadcmds[l->l_phnum];
-    size_t nloadcmds = 0;
-    bool has_holes = false;
-
-    /* The struct is initialized to zero so this is not necessary:
-    l->l_ld = 0;
-    l->l_phdr = 0;
-    l->l_addr = 0; */
-    for (ph = phdr; ph < &phdr[l->l_phnum]; ++ph)
-      switch (ph->p_type)
-	{
-	  /* These entries tell us where to find things once the file's
-	     segments are mapped in.  We record the addresses it says
-	     verbatim, and later correct for the run-time load address.  */
-	case PT_DYNAMIC:
-	  l->l_ld = (void *) ph->p_vaddr;
-	  l->l_ldnum = ph->p_memsz / sizeof (ElfW(Dyn));
-	  break;
-
-	case PT_PHDR:
-	  l->l_phdr = (void *) ph->p_vaddr;
-	  break;
-
-	case PT_LOAD:
-	  /* A load command tells us to map in part of the file.
-	     We record the load commands and process them all later.  */
-	  if (__glibc_unlikely ((ph->p_align & (GLRO(dl_pagesize) - 1)) != 0))
-	    {
-	      errstring = N_("ELF load command alignment not page-aligned");
-	      goto call_lose;
-	    }
-	  if (__glibc_unlikely (((ph->p_vaddr - ph->p_offset)
-				 & (ph->p_align - 1)) != 0))
-	    {
-	      errstring
-		= N_("ELF load command address/offset not properly aligned");
-	      goto call_lose;
-	    }
-
-	  struct loadcmd *c = &loadcmds[nloadcmds++];
-	  c->mapstart = ALIGN_DOWN (ph->p_vaddr, GLRO(dl_pagesize));
-	  c->mapend = ALIGN_UP (ph->p_vaddr + ph->p_filesz, GLRO(dl_pagesize));
-	  c->dataend = ph->p_vaddr + ph->p_filesz;
-	  c->allocend = ph->p_vaddr + ph->p_memsz;
-	  c->mapoff = ALIGN_DOWN (ph->p_offset, GLRO(dl_pagesize));
-
-	  /* Determine whether there is a gap between the last segment
-	     and this one.  */
-	  if (nloadcmds > 1 && c[-1].mapend != c->mapstart)
-	    has_holes = true;
-
-	  /* Optimize a common case.  */
-#if (PF_R | PF_W | PF_X) == 7 && (PROT_READ | PROT_WRITE | PROT_EXEC) == 7
-	  c->prot = (PF_TO_PROT
-		     >> ((ph->p_flags & (PF_R | PF_W | PF_X)) * 4)) & 0xf;
-#else
-	  c->prot = 0;
-	  if (ph->p_flags & PF_R)
-	    c->prot |= PROT_READ;
-	  if (ph->p_flags & PF_W)
-	    c->prot |= PROT_WRITE;
-	  if (ph->p_flags & PF_X)
-	    c->prot |= PROT_EXEC;
-#endif
-	  break;
-
-	case PT_TLS:
-	  if (ph->p_memsz == 0)
-	    /* Nothing to do for an empty segment.  */
-	    break;
-
-	  l->l_tls_blocksize = ph->p_memsz;
-	  l->l_tls_align = ph->p_align;
-	  if (ph->p_align == 0)
-	    l->l_tls_firstbyte_offset = 0;
-	  else
-	    l->l_tls_firstbyte_offset = ph->p_vaddr & (ph->p_align - 1);
-	  l->l_tls_initimage_size = ph->p_filesz;
-	  /* Since we don't know the load address yet only store the
-	     offset.  We will adjust it later.  */
-	  l->l_tls_initimage = (void *) ph->p_vaddr;
-
-	  /* If not loading the initial set of shared libraries,
-	     check whether we should permit loading a TLS segment.  */
-	  if (__glibc_likely (l->l_type == lt_library)
-	      /* If GL(dl_tls_dtv_slotinfo_list) == NULL, then rtld.c did
-		 not set up TLS data structures, so don't use them now.  */
-	      || __glibc_likely (GL(dl_tls_dtv_slotinfo_list) != NULL))
-	    {
-	      /* Assign the next available module ID.  */
-	      l->l_tls_modid = _dl_next_tls_modid ();
-	      break;
-	    }
-
-#ifdef SHARED
-	  /* We are loading the executable itself when the dynamic
-	     linker was executed directly.  The setup will happen
-	     later.  Otherwise, the TLS data structures are already
-	     initialized, and we assigned a TLS modid above.  */
-	  assert (l->l_prev == NULL || (mode & __RTLD_AUDIT) != 0);
-#else
-	  assert (false && "TLS not initialized in static application");
-#endif
-	  break;
-
-	case PT_GNU_STACK:
-	  stack_flags = ph->p_flags;
-	  break;
-
-	case PT_GNU_RELRO:
-	  l->l_relro_addr = ph->p_vaddr;
-	  l->l_relro_size = ph->p_memsz;
-	  break;
-	}
-
-    if (__glibc_unlikely (nloadcmds == 0))
-      {
-	/* This only happens for a bogus object that will be caught with
-	   another error below.  But we don't want to go through the
-	   calculations below using NLOADCMDS - 1.  */
-	errstring = N_("object file has no loadable segments");
-	goto call_lose;
-      }
-
-    if (__glibc_unlikely (type != ET_DYN)
-	&& __glibc_unlikely ((mode & __RTLD_OPENEXEC) == 0))
-      {
-	/* This object is loaded at a fixed address.  This must never
-	   happen for objects loaded with dlopen.  */
-	errstring = N_("cannot dynamically load executable");
-	goto call_lose;
-      }
-
-    /* Length of the sections to be loaded.  */
-    maplength = loadcmds[nloadcmds - 1].allocend - loadcmds[0].mapstart;
-
-    /* Now process the load commands and map segments into memory.
-       This is responsible for filling in:
-       l_map_start, l_map_end, l_addr, l_contiguous, l_text_end, l_phdr
-     */
-    errstring = _dl_map_segments (l, fd, header, type, loadcmds, nloadcmds,
-				  maplength, has_holes, loader);
-    if (__glibc_unlikely (errstring != NULL))
-      goto call_lose;
-  }
-
-  if (l->l_ld == 0)
-    {
-      if (__glibc_unlikely (type == ET_DYN))
-	{
-	  errstring = N_("object file has no dynamic section");
-	  goto call_lose;
-	}
-    }
-  else
-    l->l_ld = (ElfW(Dyn) *) ((ElfW(Addr)) l->l_ld + l->l_addr);
-
-  elf_get_dynamic_info (l, NULL);
-
-  /* Make sure we are not dlopen'ing an object that has the
-     DF_1_NOOPEN flag set.  */
-  if (__glibc_unlikely (l->l_flags_1 & DF_1_NOOPEN)
-      && (mode & __RTLD_DLOPEN))
-    {
-      /* We are not supposed to load this object.  Free all resources.  */
-      _dl_unmap_segments (l);
-
-      if (!l->l_libname->dont_free)
-	free (l->l_libname);
-
-      if (l->l_phdr_allocated)
-	free ((void *) l->l_phdr);
-
-      errstring = N_("shared object cannot be dlopen()ed");
-      goto call_lose;
-    }
-
-  if (l->l_phdr == NULL)
-    {
-      /* The program header is not contained in any of the segments.
-	 We have to allocate memory ourself and copy it over from out
-	 temporary place.  */
-      ElfW(Phdr) *newp = (ElfW(Phdr) *) malloc (header->e_phnum
-						* sizeof (ElfW(Phdr)));
-      if (newp == NULL)
-	{
-	  errstring = N_("cannot allocate memory for program header");
-	  goto call_lose_errno;
-	}
-
-      l->l_phdr = memcpy (newp, phdr,
-			  (header->e_phnum * sizeof (ElfW(Phdr))));
-      l->l_phdr_allocated = 1;
-    }
-  else
-    /* Adjust the PT_PHDR value by the runtime load address.  */
-    l->l_phdr = (ElfW(Phdr) *) ((ElfW(Addr)) l->l_phdr + l->l_addr);
-
-  if (__glibc_unlikely ((stack_flags &~ GL(dl_stack_flags)) & PF_X))
-    {
-      if (__glibc_unlikely (__check_caller (RETURN_ADDRESS (0), allow_ldso) != 0))
-	{
-	  errstring = N_("invalid caller");
-	  goto call_lose;
-	}
-
-      /* The stack is presently not executable, but this module
-	 requires that it be executable.  We must change the
-	 protection of the variable which contains the flags used in
-	 the mprotect calls.  */
-#ifdef SHARED
-      if ((mode & (__RTLD_DLOPEN | __RTLD_AUDIT)) == __RTLD_DLOPEN)
-	{
-	  const uintptr_t p = (uintptr_t) &__stack_prot & -GLRO(dl_pagesize);
-	  const size_t s = (uintptr_t) (&__stack_prot + 1) - p;
-
-	  struct link_map *const m = &GL(dl_rtld_map);
-	  const uintptr_t relro_end = ((m->l_addr + m->l_relro_addr
-					+ m->l_relro_size)
-				       & -GLRO(dl_pagesize));
-	  if (__glibc_likely (p + s <= relro_end))
-	    {
-	      /* The variable lies in the region protected by RELRO.  */
-	      if (__mprotect ((void *) p, s, PROT_READ|PROT_WRITE) < 0)
-		{
-		  errstring = N_("cannot change memory protections");
-		  goto call_lose_errno;
-		}
-	      __stack_prot |= PROT_READ|PROT_WRITE|PROT_EXEC;
-	      __mprotect ((void *) p, s, PROT_READ);
-	    }
-	  else
-	    __stack_prot |= PROT_READ|PROT_WRITE|PROT_EXEC;
-	}
-      else
-#endif
-	__stack_prot |= PROT_READ|PROT_WRITE|PROT_EXEC;
-
-#ifdef check_consistency
-      check_consistency ();
-#endif
-
-      errval = (*GL(dl_make_stack_executable_hook)) (stack_endp);
-      if (errval)
-	{
-	  errstring = N_("\
-cannot enable executable stack as shared object requires");
-	  goto call_lose;
-	}
-    }
-
-  /* Adjust the address of the TLS initialization image.  */
-  if (l->l_tls_initimage != NULL)
-    l->l_tls_initimage = (char *) l->l_tls_initimage + l->l_addr;
-
-  /* We are done mapping in the file.  We no longer need the descriptor.  */
-  if (__glibc_unlikely (__close (fd) != 0))
-    {
-      errstring = N_("cannot close file descriptor");
-      goto call_lose_errno;
-    }
-  /* Signal that we closed the file.  */
-  fd = -1;
-
-  /* If this is ET_EXEC, we should have loaded it as lt_executable.  */
-  assert (type != ET_EXEC || l->l_type == lt_executable);
-
-  l->l_entry += l->l_addr;
-
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
-    _dl_debug_printf ("\
-  dynamic: 0x%0*lx  base: 0x%0*lx   size: 0x%0*Zx\n\
-    entry: 0x%0*lx  phdr: 0x%0*lx  phnum:   %*u\n\n",
-			   (int) sizeof (void *) * 2,
-			   (unsigned long int) l->l_ld,
-			   (int) sizeof (void *) * 2,
-			   (unsigned long int) l->l_addr,
-			   (int) sizeof (void *) * 2, maplength,
-			   (int) sizeof (void *) * 2,
-			   (unsigned long int) l->l_entry,
-			   (int) sizeof (void *) * 2,
-			   (unsigned long int) l->l_phdr,
-			   (int) sizeof (void *) * 2, l->l_phnum);
-
-  /* Set up the symbol hash table.  */
-  _dl_setup_hash (l);
-
-  /* If this object has DT_SYMBOLIC set modify now its scope.  We don't
-     have to do this for the main map.  */
-  if ((mode & RTLD_DEEPBIND) == 0
-      && __glibc_unlikely (l->l_info[DT_SYMBOLIC] != NULL)
-      && &l->l_searchlist != l->l_scope[0])
-    {
-      /* Create an appropriate searchlist.  It contains only this map.
-	 This is the definition of DT_SYMBOLIC in SysVr4.  */
-      l->l_symbolic_searchlist.r_list[0] = l;
-      l->l_symbolic_searchlist.r_nlist = 1;
-
-      /* Now move the existing entries one back.  */
-      memmove (&l->l_scope[1], &l->l_scope[0],
-	       (l->l_scope_max - 1) * sizeof (l->l_scope[0]));
-
-      /* Now add the new entry.  */
-      l->l_scope[0] = &l->l_symbolic_searchlist;
-    }
-
-  /* Remember whether this object must be initialized first.  */
-  if (l->l_flags_1 & DF_1_INITFIRST)
-    GL(dl_initfirst) = l;
-
-  /* Finally the file information.  */
-  l->l_file_id = id;
-
-#ifdef SHARED
-  /* When auditing is used the recorded names might not include the
-     name by which the DSO is actually known.  Add that as well.  */
-  if (__glibc_unlikely (origname != NULL))
-    add_name_to_object (l, origname);
-#else
-  /* Audit modules only exist when linking is dynamic so ORIGNAME
-     cannot be non-NULL.  */
-  assert (origname == NULL);
-#endif
-
-  /* When we profile the SONAME might be needed for something else but
-     loading.  Add it right away.  */
-  if (__glibc_unlikely (GLRO(dl_profile) != NULL)
-      && l->l_info[DT_SONAME] != NULL)
-    add_name_to_object (l, ((const char *) D_PTR (l, l_info[DT_STRTAB])
-			    + l->l_info[DT_SONAME]->d_un.d_val));
-
-#ifdef DL_AFTER_LOAD
-  DL_AFTER_LOAD (l);
-#endif
-
-  /* Now that the object is fully initialized add it to the object list.  */
-  _dl_add_to_namespace_list (l, nsid);
-
-#ifdef SHARED
-  /* Auditing checkpoint: we have a new object.  */
-  if (__glibc_unlikely (GLRO(dl_naudit) > 0)
-      && !GL(dl_ns)[l->l_ns]._ns_loaded->l_auditing)
-    {
-      struct audit_ifaces *afct = GLRO(dl_audit);
-      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-	{
-	  if (afct->objopen != NULL)
-	    {
-	      l->l_audit[cnt].bindflags
-		= afct->objopen (l, nsid, &l->l_audit[cnt].cookie);
-
-	      l->l_audit_any_plt |= l->l_audit[cnt].bindflags != 0;
-	    }
-
-	  afct = afct->next;
-	}
-    }
-#endif
-
-  return l;
-}
-
-/* Print search path.  */
-static void
-print_search_path (struct r_search_path_elem **list,
-		   const char *what, const char *name)
-{
-  char buf[max_dirnamelen + max_capstrlen];
-  int first = 1;
-
-  _dl_debug_printf (" search path=");
-
-  while (*list != NULL && (*list)->what == what) /* Yes, ==.  */
-    {
-      char *endp = __mempcpy (buf, (*list)->dirname, (*list)->dirnamelen);
-      size_t cnt;
-
-      for (cnt = 0; cnt < ncapstr; ++cnt)
-	if ((*list)->status[cnt] != nonexisting)
-	  {
-	    char *cp = __mempcpy (endp, capstr[cnt].str, capstr[cnt].len);
-	    if (cp == buf || (cp == buf + 1 && buf[0] == '/'))
-	      cp[0] = '\0';
-	    else
-	      cp[-1] = '\0';
-
-	    _dl_debug_printf_c (first ? "%s" : ":%s", buf);
-	    first = 0;
-	  }
-
-      ++list;
-    }
-
-  if (name != NULL)
-    _dl_debug_printf_c ("\t\t(%s from file %s)\n", what,
-			DSO_FILENAME (name));
-  else
-    _dl_debug_printf_c ("\t\t(%s)\n", what);
-}
-
-/* Open a file and verify it is an ELF file for this architecture.  We
-   ignore only ELF files for other architectures.  Non-ELF files and
-   ELF files with different header information cause fatal errors since
-   this could mean there is something wrong in the installation and the
-   user might want to know about this.
-
-   If FD is not -1, then the file is already open and FD refers to it.
-   In that case, FD is consumed for both successful and error returns.  */
-static int
-open_verify (const char *name, int fd,
-             struct filebuf *fbp, struct link_map *loader,
-	     int whatcode, int mode, bool *found_other_class, bool free_name)
-{
-  /* This is the expected ELF header.  */
-#define ELF32_CLASS ELFCLASS32
-#define ELF64_CLASS ELFCLASS64
-#ifndef VALID_ELF_HEADER
-# define VALID_ELF_HEADER(hdr,exp,size)	(memcmp (hdr, exp, size) == 0)
-# define VALID_ELF_OSABI(osabi)		(osabi == ELFOSABI_SYSV)
-# define VALID_ELF_ABIVERSION(osabi,ver) (ver == 0)
-#elif defined MORE_ELF_HEADER_DATA
-  MORE_ELF_HEADER_DATA;
-#endif
-  static const unsigned char expected[EI_NIDENT] =
-  {
-    [EI_MAG0] = ELFMAG0,
-    [EI_MAG1] = ELFMAG1,
-    [EI_MAG2] = ELFMAG2,
-    [EI_MAG3] = ELFMAG3,
-    [EI_CLASS] = ELFW(CLASS),
-    [EI_DATA] = byteorder,
-    [EI_VERSION] = EV_CURRENT,
-    [EI_OSABI] = ELFOSABI_SYSV,
-    [EI_ABIVERSION] = 0
-  };
-  static const struct
-  {
-    ElfW(Word) vendorlen;
-    ElfW(Word) datalen;
-    ElfW(Word) type;
-    char vendor[4];
-  } expected_note = { 4, 16, 1, "GNU" };
-  /* Initialize it to make the compiler happy.  */
-  const char *errstring = NULL;
-  int errval = 0;
-
-#ifdef SHARED
-  /* Give the auditing libraries a chance.  */
-  if (__glibc_unlikely (GLRO(dl_naudit) > 0) && whatcode != 0
-      && loader->l_auditing == 0)
-    {
-      const char *original_name = name;
-      struct audit_ifaces *afct = GLRO(dl_audit);
-      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-	{
-	  if (afct->objsearch != NULL)
-	    {
-	      name = afct->objsearch (name, &loader->l_audit[cnt].cookie,
-				      whatcode);
-	      if (name == NULL)
-		/* Ignore the path.  */
-		return -1;
-	    }
-
-	  afct = afct->next;
-	}
-
-      if (fd != -1 && name != original_name && strcmp (name, original_name))
-        {
-          /* An audit library changed what we're supposed to open,
-             so FD no longer matches it.  */
-          __close (fd);
-          fd = -1;
-        }
-    }
-#endif
-
-  if (fd == -1)
-    /* Open the file.  We always open files read-only.  */
-    fd = __open (name, O_RDONLY | O_CLOEXEC);
-
-  if (fd != -1)
-    {
-      ElfW(Ehdr) *ehdr;
-      ElfW(Phdr) *phdr, *ph;
-      ElfW(Word) *abi_note;
-      unsigned int osversion;
-      size_t maplength;
-
-      /* We successfully opened the file.  Now verify it is a file
-	 we can use.  */
-      __set_errno (0);
-      fbp->len = 0;
-      assert (sizeof (fbp->buf) > sizeof (ElfW(Ehdr)));
-      /* Read in the header.  */
-      do
-	{
-	  ssize_t retlen = __libc_read (fd, fbp->buf + fbp->len,
-					sizeof (fbp->buf) - fbp->len);
-	  if (retlen <= 0)
-	    break;
-	  fbp->len += retlen;
-	}
-      while (__glibc_unlikely (fbp->len < sizeof (ElfW(Ehdr))));
-
-      /* This is where the ELF header is loaded.  */
-      ehdr = (ElfW(Ehdr) *) fbp->buf;
-
-      /* Now run the tests.  */
-      if (__glibc_unlikely (fbp->len < (ssize_t) sizeof (ElfW(Ehdr))))
-	{
-	  errval = errno;
-	  errstring = (errval == 0
-		       ? N_("file too short") : N_("cannot read file data"));
-	call_lose:
-	  if (free_name)
-	    {
-	      char *realname = (char *) name;
-	      name = strdupa (realname);
-	      free (realname);
-	    }
-	  lose (errval, fd, name, NULL, NULL, errstring, NULL, 0);
-	}
-
-      /* See whether the ELF header is what we expect.  */
-      if (__glibc_unlikely (! VALID_ELF_HEADER (ehdr->e_ident, expected,
-						EI_ABIVERSION)
-			    || !VALID_ELF_ABIVERSION (ehdr->e_ident[EI_OSABI],
-						      ehdr->e_ident[EI_ABIVERSION])
-			    || memcmp (&ehdr->e_ident[EI_PAD],
-				       &expected[EI_PAD],
-				       EI_NIDENT - EI_PAD) != 0))
-	{
-	  /* Something is wrong.  */
-	  const Elf32_Word *magp = (const void *) ehdr->e_ident;
-	  if (*magp !=
-#if BYTE_ORDER == LITTLE_ENDIAN
-	      ((ELFMAG0 << (EI_MAG0 * 8)) |
-	       (ELFMAG1 << (EI_MAG1 * 8)) |
-	       (ELFMAG2 << (EI_MAG2 * 8)) |
-	       (ELFMAG3 << (EI_MAG3 * 8)))
-#else
-	      ((ELFMAG0 << (EI_MAG3 * 8)) |
-	       (ELFMAG1 << (EI_MAG2 * 8)) |
-	       (ELFMAG2 << (EI_MAG1 * 8)) |
-	       (ELFMAG3 << (EI_MAG0 * 8)))
-#endif
-	      )
-	    errstring = N_("invalid ELF header");
-	  else if (ehdr->e_ident[EI_CLASS] != ELFW(CLASS))
-	    {
-	      /* This is not a fatal error.  On architectures where
-		 32-bit and 64-bit binaries can be run this might
-		 happen.  */
-	      *found_other_class = true;
-	      goto close_and_out;
-	    }
-	  else if (ehdr->e_ident[EI_DATA] != byteorder)
-	    {
-	      if (BYTE_ORDER == BIG_ENDIAN)
-		errstring = N_("ELF file data encoding not big-endian");
-	      else
-		errstring = N_("ELF file data encoding not little-endian");
-	    }
-	  else if (ehdr->e_ident[EI_VERSION] != EV_CURRENT)
-	    errstring
-	      = N_("ELF file version ident does not match current one");
-	  /* XXX We should be able so set system specific versions which are
-	     allowed here.  */
-	  else if (!VALID_ELF_OSABI (ehdr->e_ident[EI_OSABI]))
-	    errstring = N_("ELF file OS ABI invalid");
-	  else if (!VALID_ELF_ABIVERSION (ehdr->e_ident[EI_OSABI],
-					  ehdr->e_ident[EI_ABIVERSION]))
-	    errstring = N_("ELF file ABI version invalid");
-	  else if (memcmp (&ehdr->e_ident[EI_PAD], &expected[EI_PAD],
-			   EI_NIDENT - EI_PAD) != 0)
-	    errstring = N_("nonzero padding in e_ident");
-	  else
-	    /* Otherwise we don't know what went wrong.  */
-	    errstring = N_("internal error");
-
-	  goto call_lose;
-	}
-
-      if (__glibc_unlikely (ehdr->e_version != EV_CURRENT))
-	{
-	  errstring = N_("ELF file version does not match current one");
-	  goto call_lose;
-	}
-      if (! __glibc_likely (elf_machine_matches_host (ehdr)))
-	goto close_and_out;
-      else if (__glibc_unlikely (ehdr->e_type != ET_DYN
-				 && ehdr->e_type != ET_EXEC))
-	{
-	  errstring = N_("only ET_DYN and ET_EXEC can be loaded");
-	  goto call_lose;
-	}
-      else if (__glibc_unlikely (ehdr->e_type == ET_EXEC
-				 && (mode & __RTLD_OPENEXEC) == 0))
-	{
-	  /* BZ #16634. It is an error to dlopen ET_EXEC (unless
-	     __RTLD_OPENEXEC is explicitly set).  We return error here
-	     so that code in _dl_map_object_from_fd does not try to set
-	     l_tls_modid for this module.  */
-
-	  errstring = N_("cannot dynamically load executable");
-	  goto call_lose;
-	}
-      else if (__glibc_unlikely (ehdr->e_phentsize != sizeof (ElfW(Phdr))))
-	{
-	  errstring = N_("ELF file's phentsize not the expected size");
-	  goto call_lose;
-	}
-
-      maplength = ehdr->e_phnum * sizeof (ElfW(Phdr));
-      if (ehdr->e_phoff + maplength <= (size_t) fbp->len)
-	phdr = (void *) (fbp->buf + ehdr->e_phoff);
-      else
-	{
-	  phdr = alloca (maplength);
-	  __lseek (fd, ehdr->e_phoff, SEEK_SET);
-	  if ((size_t) __libc_read (fd, (void *) phdr, maplength) != maplength)
-	    {
-	    read_error:
-	      errval = errno;
-	      errstring = N_("cannot read file data");
-	      goto call_lose;
-	    }
-	}
-
-      if (__glibc_unlikely (elf_machine_reject_phdr_p
-			    (phdr, ehdr->e_phnum, fbp->buf, fbp->len,
-			     loader, fd)))
-	goto close_and_out;
-
-      /* Check .note.ABI-tag if present.  */
-      for (ph = phdr; ph < &phdr[ehdr->e_phnum]; ++ph)
-	if (ph->p_type == PT_NOTE && ph->p_filesz >= 32 && ph->p_align >= 4)
-	  {
-	    ElfW(Addr) size = ph->p_filesz;
-
-	    if (ph->p_offset + size <= (size_t) fbp->len)
-	      abi_note = (void *) (fbp->buf + ph->p_offset);
-	    else
-	      {
-		abi_note = alloca (size);
-		__lseek (fd, ph->p_offset, SEEK_SET);
-		if (__libc_read (fd, (void *) abi_note, size) != size)
-		  goto read_error;
-	      }
-
-	    while (memcmp (abi_note, &expected_note, sizeof (expected_note)))
-	      {
-#define ROUND(len) (((len) + sizeof (ElfW(Word)) - 1) & -sizeof (ElfW(Word)))
-		ElfW(Addr) note_size = 3 * sizeof (ElfW(Word))
-				       + ROUND (abi_note[0])
-				       + ROUND (abi_note[1]);
-
-		if (size - 32 < note_size)
-		  {
-		    size = 0;
-		    break;
-		  }
-		size -= note_size;
-		abi_note = (void *) abi_note + note_size;
-	      }
-
-	    if (size == 0)
-	      continue;
-
-	    osversion = (abi_note[5] & 0xff) * 65536
-			+ (abi_note[6] & 0xff) * 256
-			+ (abi_note[7] & 0xff);
-	    if (abi_note[4] != __ABI_TAG_OS
-		|| (GLRO(dl_osversion) && GLRO(dl_osversion) < osversion))
-	      {
-	      close_and_out:
-		__close (fd);
-		__set_errno (ENOENT);
-		fd = -1;
-	      }
-
-	    break;
-	  }
-    }
-
-  return fd;
-}
-
-/* Try to open NAME in one of the directories in *DIRSP.
-   Return the fd, or -1.  If successful, fill in *REALNAME
-   with the malloc'd full directory name.  If it turns out
-   that none of the directories in *DIRSP exists, *DIRSP is
-   replaced with (void *) -1, and the old value is free()d
-   if MAY_FREE_DIRS is true.  */
-
-static int
-open_path (const char *name, size_t namelen, int mode,
-	   struct r_search_path_struct *sps, char **realname,
-	   struct filebuf *fbp, struct link_map *loader, int whatcode,
-	   bool *found_other_class)
-{
-  struct r_search_path_elem **dirs = sps->dirs;
-  char *buf;
-  int fd = -1;
-  const char *current_what = NULL;
-  int any = 0;
-
-  if (__glibc_unlikely (dirs == NULL))
-    /* We're called before _dl_init_paths when loading the main executable
-       given on the command line when rtld is run directly.  */
-    return -1;
-
-  buf = alloca (max_dirnamelen + max_capstrlen + namelen);
-  do
-    {
-      struct r_search_path_elem *this_dir = *dirs;
-      size_t buflen = 0;
-      size_t cnt;
-      char *edp;
-      int here_any = 0;
-      int err;
-
-      /* If we are debugging the search for libraries print the path
-	 now if it hasn't happened now.  */
-      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS)
-	  && current_what != this_dir->what)
-	{
-	  current_what = this_dir->what;
-	  print_search_path (dirs, current_what, this_dir->where);
-	}
-
-      edp = (char *) __mempcpy (buf, this_dir->dirname, this_dir->dirnamelen);
-      for (cnt = 0; fd == -1 && cnt < ncapstr; ++cnt)
-	{
-	  /* Skip this directory if we know it does not exist.  */
-	  if (this_dir->status[cnt] == nonexisting)
-	    continue;
-
-	  buflen =
-	    ((char *) __mempcpy (__mempcpy (edp, capstr[cnt].str,
-					    capstr[cnt].len),
-				 name, namelen)
-	     - buf);
-
-	  /* Print name we try if this is wanted.  */
-	  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
-	    _dl_debug_printf ("  trying file=%s\n", buf);
-
-	  fd = open_verify (buf, -1, fbp, loader, whatcode, mode,
-			    found_other_class, false);
-	  if (this_dir->status[cnt] == unknown)
-	    {
-	      if (fd != -1)
-		this_dir->status[cnt] = existing;
-	      /* Do not update the directory information when loading
-		 auditing code.  We must try to disturb the program as
-		 little as possible.  */
-	      else if (loader == NULL
-		       || GL(dl_ns)[loader->l_ns]._ns_loaded->l_auditing == 0)
-		{
-		  /* We failed to open machine dependent library.  Let's
-		     test whether there is any directory at all.  */
-		  struct stat64 st;
-
-		  buf[buflen - namelen - 1] = '\0';
-
-		  if (__xstat64 (_STAT_VER, buf, &st) != 0
-		      || ! S_ISDIR (st.st_mode))
-		    /* The directory does not exist or it is no directory.  */
-		    this_dir->status[cnt] = nonexisting;
-		  else
-		    this_dir->status[cnt] = existing;
-		}
-	    }
-
-	  /* Remember whether we found any existing directory.  */
-	  here_any |= this_dir->status[cnt] != nonexisting;
-
-	  if (fd != -1 && __glibc_unlikely (mode & __RTLD_SECURE)
-	      && __libc_enable_secure)
-	    {
-	      /* This is an extra security effort to make sure nobody can
-		 preload broken shared objects which are in the trusted
-		 directories and so exploit the bugs.  */
-	      struct stat64 st;
-
-	      if (__fxstat64 (_STAT_VER, fd, &st) != 0
-		  || (st.st_mode & S_ISUID) == 0)
-		{
-		  /* The shared object cannot be tested for being SUID
-		     or this bit is not set.  In this case we must not
-		     use this object.  */
-		  __close (fd);
-		  fd = -1;
-		  /* We simply ignore the file, signal this by setting
-		     the error value which would have been set by `open'.  */
-		  errno = ENOENT;
-		}
-	    }
-	}
-
-      if (fd != -1)
-	{
-	  *realname = (char *) malloc (buflen);
-	  if (*realname != NULL)
-	    {
-	      memcpy (*realname, buf, buflen);
-	      return fd;
-	    }
-	  else
-	    {
-	      /* No memory for the name, we certainly won't be able
-		 to load and link it.  */
-	      __close (fd);
-	      return -1;
-	    }
-	}
-      if (here_any && (err = errno) != ENOENT && err != EACCES)
-	/* The file exists and is readable, but something went wrong.  */
-	return -1;
-
-      /* Remember whether we found anything.  */
-      any |= here_any;
-    }
-  while (*++dirs != NULL);
-
-  /* Remove the whole path if none of the directories exists.  */
-  if (__glibc_unlikely (! any))
-    {
-      /* Paths which were allocated using the minimal malloc() in ld.so
-	 must not be freed using the general free() in libc.  */
-      if (sps->malloced)
-	free (sps->dirs);
-
-      /* rtld_search_dirs and env_path_list are attribute_relro, therefore
-	 avoid writing into it.  */
-      if (sps != &rtld_search_dirs && sps != &env_path_list)
-	sps->dirs = (void *) -1;
-    }
-
-  return -1;
-}
-
-/* Map in the shared object file NAME.  */
-
-struct link_map *
-internal_function
-_dl_map_object (struct link_map *loader, const char *name,
-		int type, int trace_mode, int mode, Lmid_t nsid)
-{
-  int fd;
-  const char *origname = NULL;
-  char *realname;
-  char *name_copy;
-  struct link_map *l;
-  struct filebuf fb;
-
-  assert (nsid >= 0);
-  assert (nsid < GL(dl_nns));
-
-  /* Look for this name among those already loaded.  */
-  for (l = GL(dl_ns)[nsid]._ns_loaded; l; l = l->l_next)
-    {
-      /* If the requested name matches the soname of a loaded object,
-	 use that object.  Elide this check for names that have not
-	 yet been opened.  */
-      if (__glibc_unlikely ((l->l_faked | l->l_removed) != 0))
-	continue;
-      if (!_dl_name_match_p (name, l))
-	{
-	  const char *soname;
-
-	  if (__glibc_likely (l->l_soname_added)
-	      || l->l_info[DT_SONAME] == NULL)
-	    continue;
-
-	  soname = ((const char *) D_PTR (l, l_info[DT_STRTAB])
-		    + l->l_info[DT_SONAME]->d_un.d_val);
-	  if (strcmp (name, soname) != 0)
-	    continue;
-
-	  /* We have a match on a new name -- cache it.  */
-	  add_name_to_object (l, soname);
-	  l->l_soname_added = 1;
-	}
-
-      /* We have a match.  */
-      return l;
-    }
-
-  /* Display information if we are debugging.  */
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES)
-      && loader != NULL)
-    _dl_debug_printf ((mode & __RTLD_CALLMAP) == 0
-		      ? "\nfile=%s [%lu];  needed by %s [%lu]\n"
-		      : "\nfile=%s [%lu];  dynamically loaded by %s [%lu]\n",
-		      name, nsid, DSO_FILENAME (loader->l_name), loader->l_ns);
-
-#ifdef SHARED
-  /* Give the auditing libraries a chance to change the name before we
-     try anything.  */
-  if (__glibc_unlikely (GLRO(dl_naudit) > 0)
-      && (loader == NULL || loader->l_auditing == 0))
-    {
-      struct audit_ifaces *afct = GLRO(dl_audit);
-      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-	{
-	  if (afct->objsearch != NULL)
-	    {
-	      const char *before = name;
-	      name = afct->objsearch (name, &loader->l_audit[cnt].cookie,
-				      LA_SER_ORIG);
-	      if (name == NULL)
-		{
-		  /* Do not try anything further.  */
-		  fd = -1;
-		  goto no_file;
-		}
-	      if (before != name && strcmp (before, name) != 0)
-		{
-		  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
-		    _dl_debug_printf ("audit changed filename %s -> %s\n",
-				      before, name);
-
-		  if (origname == NULL)
-		    origname = before;
-		}
-	    }
-
-	  afct = afct->next;
-	}
-    }
-#endif
-
-  /* Will be true if we found a DSO which is of the other ELF class.  */
-  bool found_other_class = false;
-
-  if (strchr (name, '/') == NULL)
-    {
-      /* Search for NAME in several places.  */
-
-      size_t namelen = strlen (name) + 1;
-
-      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
-	_dl_debug_printf ("find library=%s [%lu]; searching\n", name, nsid);
-
-      fd = -1;
-
-      /* When the object has the RUNPATH information we don't use any
-	 RPATHs.  */
-      if (loader == NULL || loader->l_info[DT_RUNPATH] == NULL)
-	{
-	  /* This is the executable's map (if there is one).  Make sure that
-	     we do not look at it twice.  */
-	  struct link_map *main_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
-	  bool did_main_map = false;
-
-	  /* First try the DT_RPATH of the dependent object that caused NAME
-	     to be loaded.  Then that object's dependent, and on up.  */
-	  for (l = loader; l; l = l->l_loader)
-	    if (cache_rpath (l, &l->l_rpath_dirs, DT_RPATH, "RPATH"))
-	      {
-		fd = open_path (name, namelen, mode,
-				&l->l_rpath_dirs,
-				&realname, &fb, loader, LA_SER_RUNPATH,
-				&found_other_class);
-		if (fd != -1)
-		  break;
-
-		did_main_map |= l == main_map;
-	      }
-
-	  /* If dynamically linked, try the DT_RPATH of the executable
-	     itself.  NB: we do this for lookups in any namespace.  */
-	  if (fd == -1 && !did_main_map
-	      && main_map != NULL && main_map->l_type != lt_loaded
-	      && cache_rpath (main_map, &main_map->l_rpath_dirs, DT_RPATH,
-			      "RPATH"))
-	    fd = open_path (name, namelen, mode,
-			    &main_map->l_rpath_dirs,
-			    &realname, &fb, loader ?: main_map, LA_SER_RUNPATH,
-			    &found_other_class);
-	}
-
-      /* Try the LD_LIBRARY_PATH environment variable.  */
-      if (fd == -1 && env_path_list.dirs != (void *) -1)
-	fd = open_path (name, namelen, mode, &env_path_list,
-			&realname, &fb,
-			loader ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded,
-			LA_SER_LIBPATH, &found_other_class);
-
-      /* Look at the RUNPATH information for this binary.  */
-      if (fd == -1 && loader != NULL
-	  && cache_rpath (loader, &loader->l_runpath_dirs,
-			  DT_RUNPATH, "RUNPATH"))
-	fd = open_path (name, namelen, mode,
-			&loader->l_runpath_dirs, &realname, &fb, loader,
-			LA_SER_RUNPATH, &found_other_class);
-
-      if (fd == -1)
-        {
-          realname = _dl_sysdep_open_object (name, namelen, &fd);
-          if (realname != NULL)
-            {
-              fd = open_verify (realname, fd,
-                                &fb, loader ?: GL(dl_ns)[nsid]._ns_loaded,
-                                LA_SER_CONFIG, mode, &found_other_class,
-                                false);
-              if (fd == -1)
-                free (realname);
-            }
-        }
-
-#ifdef USE_LDCONFIG
-      if (fd == -1
-	  && (__glibc_likely ((mode & __RTLD_SECURE) == 0)
-	      || ! __libc_enable_secure)
-	  && __glibc_likely (GLRO(dl_inhibit_cache) == 0))
-	{
-	  /* Check the list of libraries in the file /etc/ld.so.cache,
-	     for compatibility with Linux's ldconfig program.  */
-	  char *cached = _dl_load_cache_lookup (name);
-
-	  if (cached != NULL)
-	    {
-	      // XXX Correct to unconditionally default to namespace 0?
-	      l = (loader
-		   ?: GL(dl_ns)[LM_ID_BASE]._ns_loaded
-# ifdef SHARED
-		   ?: &GL(dl_rtld_map)
-# endif
-		  );
-
-	      /* If the loader has the DF_1_NODEFLIB flag set we must not
-		 use a cache entry from any of these directories.  */
-	      if (__glibc_unlikely (l->l_flags_1 & DF_1_NODEFLIB))
-		{
-		  const char *dirp = system_dirs;
-		  unsigned int cnt = 0;
-
-		  do
-		    {
-		      if (memcmp (cached, dirp, system_dirs_len[cnt]) == 0)
-			{
-			  /* The prefix matches.  Don't use the entry.  */
-			  free (cached);
-			  cached = NULL;
-			  break;
-			}
-
-		      dirp += system_dirs_len[cnt] + 1;
-		      ++cnt;
-		    }
-		  while (cnt < nsystem_dirs_len);
-		}
-
-	      if (cached != NULL)
-		{
-		  fd = open_verify (cached, -1,
-				    &fb, loader ?: GL(dl_ns)[nsid]._ns_loaded,
-				    LA_SER_CONFIG, mode, &found_other_class,
-				    false);
-		  if (__glibc_likely (fd != -1))
-		    realname = cached;
-		  else
-		    free (cached);
-		}
-	    }
-	}
-#endif
-
-      /* Finally, try the default path.  */
-      if (fd == -1
-	  && ((l = loader ?: GL(dl_ns)[nsid]._ns_loaded) == NULL
-	      || __glibc_likely (!(l->l_flags_1 & DF_1_NODEFLIB)))
-	  && rtld_search_dirs.dirs != (void *) -1)
-	fd = open_path (name, namelen, mode, &rtld_search_dirs,
-			&realname, &fb, l, LA_SER_DEFAULT, &found_other_class);
-
-      /* Add another newline when we are tracing the library loading.  */
-      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
-	_dl_debug_printf ("\n");
-    }
-  else
-    {
-      /* The path may contain dynamic string tokens.  */
-      realname = (loader
-		  ? expand_dynamic_string_token (loader, name, 0)
-		  : __strdup (name));
-      if (realname == NULL)
-	fd = -1;
-      else
-	{
-	  fd = open_verify (realname, -1, &fb,
-			    loader ?: GL(dl_ns)[nsid]._ns_loaded, 0, mode,
-			    &found_other_class, true);
-	  if (__glibc_unlikely (fd == -1))
-	    free (realname);
-	}
-    }
-
-#ifdef SHARED
- no_file:
-#endif
-  /* In case the LOADER information has only been provided to get to
-     the appropriate RUNPATH/RPATH information we do not need it
-     anymore.  */
-  if (mode & __RTLD_CALLMAP)
-    loader = NULL;
-
-  if (__glibc_unlikely (fd == -1))
-    {
-      if (trace_mode
-	  && __glibc_likely ((GLRO(dl_debug_mask) & DL_DEBUG_PRELINK) == 0))
-	{
-	  /* We haven't found an appropriate library.  But since we
-	     are only interested in the list of libraries this isn't
-	     so severe.  Fake an entry with all the information we
-	     have.  */
-	  static const Elf_Symndx dummy_bucket = STN_UNDEF;
-
-	  /* Allocate a new object map.  */
-	  if ((name_copy = __strdup (name)) == NULL
-	      || (l = _dl_new_object (name_copy, name, type, loader,
-				      mode, nsid)) == NULL)
-	    {
-	      free (name_copy);
-	      _dl_signal_error (ENOMEM, name, NULL,
-				N_("cannot create shared object descriptor"));
-	    }
-	  /* Signal that this is a faked entry.  */
-	  l->l_faked = 1;
-	  /* Since the descriptor is initialized with zero we do not
-	     have do this here.
-	  l->l_reserved = 0; */
-	  l->l_buckets = &dummy_bucket;
-	  l->l_nbuckets = 1;
-	  l->l_relocated = 1;
-
-	  /* Enter the object in the object list.  */
-	  _dl_add_to_namespace_list (l, nsid);
-
-	  return l;
-	}
-      else if (found_other_class)
-	_dl_signal_error (0, name, NULL,
-			  ELFW(CLASS) == ELFCLASS32
-			  ? N_("wrong ELF class: ELFCLASS64")
-			  : N_("wrong ELF class: ELFCLASS32"));
-      else
-	_dl_signal_error (errno, name, NULL,
-			  N_("cannot open shared object file"));
-    }
-
-  void *stack_end = __libc_stack_end;
-  return _dl_map_object_from_fd (name, origname, fd, &fb, realname, loader,
-				 type, mode, &stack_end, nsid);
-}
-
-struct add_path_state
-{
-  bool counting;
-  unsigned int idx;
-  Dl_serinfo *si;
-  char *allocptr;
-};
-
-static void
-add_path (struct add_path_state *p, const struct r_search_path_struct *sps,
-	  unsigned int flags)
-{
-  if (sps->dirs != (void *) -1)
-    {
-      struct r_search_path_elem **dirs = sps->dirs;
-      do
-	{
-	  const struct r_search_path_elem *const r = *dirs++;
-	  if (p->counting)
-	    {
-	      p->si->dls_cnt++;
-	      p->si->dls_size += MAX (2, r->dirnamelen);
-	    }
-	  else
-	    {
-	      Dl_serpath *const sp = &p->si->dls_serpath[p->idx++];
-	      sp->dls_name = p->allocptr;
-	      if (r->dirnamelen < 2)
-		*p->allocptr++ = r->dirnamelen ? '/' : '.';
-	      else
-		p->allocptr = __mempcpy (p->allocptr,
-					  r->dirname, r->dirnamelen - 1);
-	      *p->allocptr++ = '\0';
-	      sp->dls_flags = flags;
-	    }
-	}
-      while (*dirs != NULL);
-    }
-}
-
-void
-internal_function
-_dl_rtld_di_serinfo (struct link_map *loader, Dl_serinfo *si, bool counting)
-{
-  if (counting)
-    {
-      si->dls_cnt = 0;
-      si->dls_size = 0;
-    }
-
-  struct add_path_state p =
-    {
-      .counting = counting,
-      .idx = 0,
-      .si = si,
-      .allocptr = (char *) &si->dls_serpath[si->dls_cnt]
-    };
-
-# define add_path(p, sps, flags) add_path(p, sps, 0) /* XXX */
-
-  /* When the object has the RUNPATH information we don't use any RPATHs.  */
-  if (loader->l_info[DT_RUNPATH] == NULL)
-    {
-      /* First try the DT_RPATH of the dependent object that caused NAME
-	 to be loaded.  Then that object's dependent, and on up.  */
-
-      struct link_map *l = loader;
-      do
-	{
-	  if (cache_rpath (l, &l->l_rpath_dirs, DT_RPATH, "RPATH"))
-	    add_path (&p, &l->l_rpath_dirs, XXX_RPATH);
-	  l = l->l_loader;
-	}
-      while (l != NULL);
-
-      /* If dynamically linked, try the DT_RPATH of the executable itself.  */
-      if (loader->l_ns == LM_ID_BASE)
-	{
-	  l = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
-	  if (l != NULL && l->l_type != lt_loaded && l != loader)
-	    if (cache_rpath (l, &l->l_rpath_dirs, DT_RPATH, "RPATH"))
-	      add_path (&p, &l->l_rpath_dirs, XXX_RPATH);
-	}
-    }
-
-  /* Try the LD_LIBRARY_PATH environment variable.  */
-  add_path (&p, &env_path_list, XXX_ENV);
-
-  /* Look at the RUNPATH information for this binary.  */
-  if (cache_rpath (loader, &loader->l_runpath_dirs, DT_RUNPATH, "RUNPATH"))
-    add_path (&p, &loader->l_runpath_dirs, XXX_RUNPATH);
-
-  /* XXX
-     Here is where ld.so.cache gets checked, but we don't have
-     a way to indicate that in the results for Dl_serinfo.  */
-
-  /* Finally, try the default path.  */
-  if (!(loader->l_flags_1 & DF_1_NODEFLIB))
-    add_path (&p, &rtld_search_dirs, XXX_default);
-
-  if (counting)
-    /* Count the struct size before the string area, which we didn't
-       know before we completed dls_cnt.  */
-    si->dls_size += (char *) &si->dls_serpath[si->dls_cnt] - (char *) si;
-}
diff --git a/elf/dl-load.h b/elf/dl-load.h
deleted file mode 100644
index 7cd6214d4e..0000000000
--- a/elf/dl-load.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/* Map in a shared object's segments from the file.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _DL_LOAD_H
-#define _DL_LOAD_H	1
-
-#include <link.h>
-#include <sys/mman.h>
-
-
-/* On some systems, no flag bits are given to specify file mapping.  */
-#ifndef MAP_FILE
-# define MAP_FILE       0
-#endif
-
-/* The right way to map in the shared library files is MAP_COPY, which
-   makes a virtual copy of the data at the time of the mmap call; this
-   guarantees the mapped pages will be consistent even if the file is
-   overwritten.  Some losing VM systems like Linux's lack MAP_COPY.  All we
-   get is MAP_PRIVATE, which copies each page when it is modified; this
-   means if the file is overwritten, we may at some point get some pages
-   from the new version after starting with pages from the old version.
-
-   To make up for the lack and avoid the overwriting problem,
-   what Linux does have is MAP_DENYWRITE.  This prevents anyone
-   from modifying the file while we have it mapped.  */
-#ifndef MAP_COPY
-# ifdef MAP_DENYWRITE
-#  define MAP_COPY      (MAP_PRIVATE | MAP_DENYWRITE)
-# else
-#  define MAP_COPY      MAP_PRIVATE
-# endif
-#endif
-
-/* Some systems link their relocatable objects for another base address
-   than 0.  We want to know the base address for these such that we can
-   subtract this address from the segment addresses during mapping.
-   This results in a more efficient address space usage.  Defaults to
-   zero for almost all systems.  */
-#ifndef MAP_BASE_ADDR
-# define MAP_BASE_ADDR(l)       0
-#endif
-
-
-/* Handle situations where we have a preferred location in memory for
-   the shared objects.  */
-#ifdef ELF_PREFERRED_ADDRESS_DATA
-ELF_PREFERRED_ADDRESS_DATA;
-#endif
-#ifndef ELF_PREFERRED_ADDRESS
-# define ELF_PREFERRED_ADDRESS(loader, maplength, mapstartpref) (mapstartpref)
-#endif
-#ifndef ELF_FIXED_ADDRESS
-# define ELF_FIXED_ADDRESS(loader, mapstart) ((void) 0)
-#endif
-
-
-/* This structure describes one PT_LOAD command.
-   Its details have been expanded out and converted.  */
-struct loadcmd
-{
-  ElfW(Addr) mapstart, mapend, dataend, allocend;
-  ElfW(Off) mapoff;
-  int prot;                             /* PROT_* bits.  */
-};
-
-
-/* This is a subroutine of _dl_map_segments.  It should be called for each
-   load command, some time after L->l_addr has been set correctly.  It is
-   responsible for setting up the l_text_end and l_phdr fields.  */
-static void __always_inline
-_dl_postprocess_loadcmd (struct link_map *l, const ElfW(Ehdr) *header,
-                         const struct loadcmd *c)
-{
-  if (c->prot & PROT_EXEC)
-    l->l_text_end = l->l_addr + c->mapend;
-
-  if (l->l_phdr == 0
-      && c->mapoff <= header->e_phoff
-      && ((size_t) (c->mapend - c->mapstart + c->mapoff)
-          >= header->e_phoff + header->e_phnum * sizeof (ElfW(Phdr))))
-    /* Found the program header in this segment.  */
-    l->l_phdr = (void *) (uintptr_t) (c->mapstart + header->e_phoff
-                                      - c->mapoff);
-}
-
-
-/* This is a subroutine of _dl_map_object_from_fd.  It is responsible
-   for filling in several fields in *L: l_map_start, l_map_end, l_addr,
-   l_contiguous, l_text_end, l_phdr.  On successful return, all the
-   segments are mapped (or copied, or whatever) from the file into their
-   final places in the address space, with the correct page permissions,
-   and any bss-like regions already zeroed.  It returns a null pointer
-   on success, or an error message string (to be translated) on error
-   (having also set errno).
-
-   The file <dl-map-segments.h> defines this function.  The canonical
-   implementation in elf/dl-map-segments.h might be replaced by a sysdeps
-   version.  */
-static const char *_dl_map_segments (struct link_map *l, int fd,
-                                     const ElfW(Ehdr) *header, int type,
-                                     const struct loadcmd loadcmds[],
-                                     size_t nloadcmds,
-                                     const size_t maplength,
-                                     bool has_holes,
-                                     struct link_map *loader);
-
-/* All the error message strings _dl_map_segments might return are
-   listed here so that different implementations in different sysdeps
-   dl-map-segments.h files all use consistent strings that are
-   guaranteed to have translations.  */
-#define DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT \
-  N_("failed to map segment from shared object")
-#define DL_MAP_SEGMENTS_ERROR_MPROTECT \
-  N_("cannot change memory protections")
-#define DL_MAP_SEGMENTS_ERROR_MAP_ZERO_FILL \
-  N_("cannot map zero-fill pages")
-
-
-#endif	/* dl-load.h */
diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
deleted file mode 100644
index 3d2369dbf2..0000000000
--- a/elf/dl-lookup.c
+++ /dev/null
@@ -1,1129 +0,0 @@
-/* Look up a symbol in the loaded objects.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <alloca.h>
-#include <libintl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-#include <dl-hash.h>
-#include <dl-machine.h>
-#include <sysdep-cancel.h>
-#include <libc-lock.h>
-#include <tls.h>
-#include <atomic.h>
-
-#include <assert.h>
-
-/* Return nonzero if check_match should consider SYM to fail to match a
-   symbol reference for some machine-specific reason.  */
-#ifndef ELF_MACHINE_SYM_NO_MATCH
-# define ELF_MACHINE_SYM_NO_MATCH(sym) 0
-#endif
-
-#define VERSTAG(tag)	(DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (tag))
-
-
-struct sym_val
-  {
-    const ElfW(Sym) *s;
-    struct link_map *m;
-  };
-
-
-#define make_string(string, rest...) \
-  ({									      \
-    const char *all[] = { string, ## rest };				      \
-    size_t len, cnt;							      \
-    char *result, *cp;							      \
-									      \
-    len = 1;								      \
-    for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt)		      \
-      len += strlen (all[cnt]);						      \
-									      \
-    cp = result = alloca (len);						      \
-    for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt)		      \
-      cp = __stpcpy (cp, all[cnt]);					      \
-									      \
-    result;								      \
-  })
-
-/* Statistics function.  */
-#ifdef SHARED
-# define bump_num_relocations() ++GL(dl_num_relocations)
-#else
-# define bump_num_relocations() ((void) 0)
-#endif
-
-/* Utility function for do_lookup_x. The caller is called with undef_name,
-   ref, version, flags and type_class, and those are passed as the first
-   five arguments. The caller then computes sym, symidx, strtab, and map
-   and passes them as the next four arguments. Lastly the caller passes in
-   versioned_sym and num_versions which are modified by check_match during
-   the checking process.  */
-static const ElfW(Sym) *
-check_match (const char *const undef_name,
-	     const ElfW(Sym) *const ref,
-	     const struct r_found_version *const version,
-	     const int flags,
-	     const int type_class,
-	     const ElfW(Sym) *const sym,
-	     const Elf_Symndx symidx,
-	     const char *const strtab,
-	     const struct link_map *const map,
-	     const ElfW(Sym) **const versioned_sym,
-	     int *const num_versions)
-{
-  unsigned int stt = ELFW(ST_TYPE) (sym->st_info);
-  assert (ELF_RTYPE_CLASS_PLT == 1);
-  if (__glibc_unlikely ((sym->st_value == 0 /* No value.  */
-			 && stt != STT_TLS)
-			|| ELF_MACHINE_SYM_NO_MATCH (sym)
-			|| (type_class & (sym->st_shndx == SHN_UNDEF))))
-    return NULL;
-
-  /* Ignore all but STT_NOTYPE, STT_OBJECT, STT_FUNC,
-     STT_COMMON, STT_TLS, and STT_GNU_IFUNC since these are no
-     code/data definitions.  */
-#define ALLOWED_STT \
-  ((1 << STT_NOTYPE) | (1 << STT_OBJECT) | (1 << STT_FUNC) \
-   | (1 << STT_COMMON) | (1 << STT_TLS) | (1 << STT_GNU_IFUNC))
-  if (__glibc_unlikely (((1 << stt) & ALLOWED_STT) == 0))
-    return NULL;
-
-  if (sym != ref && strcmp (strtab + sym->st_name, undef_name))
-    /* Not the symbol we are looking for.  */
-    return NULL;
-
-  const ElfW(Half) *verstab = map->l_versyms;
-  if (version != NULL)
-    {
-      if (__glibc_unlikely (verstab == NULL))
-	{
-	  /* We need a versioned symbol but haven't found any.  If
-	     this is the object which is referenced in the verneed
-	     entry it is a bug in the library since a symbol must
-	     not simply disappear.
-
-	     It would also be a bug in the object since it means that
-	     the list of required versions is incomplete and so the
-	     tests in dl-version.c haven't found a problem.*/
-	  assert (version->filename == NULL
-		  || ! _dl_name_match_p (version->filename, map));
-
-	  /* Otherwise we accept the symbol.  */
-	}
-      else
-	{
-	  /* We can match the version information or use the
-	     default one if it is not hidden.  */
-	  ElfW(Half) ndx = verstab[symidx] & 0x7fff;
-	  if ((map->l_versions[ndx].hash != version->hash
-	       || strcmp (map->l_versions[ndx].name, version->name))
-	      && (version->hidden || map->l_versions[ndx].hash
-		  || (verstab[symidx] & 0x8000)))
-	    /* It's not the version we want.  */
-	    return NULL;
-	}
-    }
-  else
-    {
-      /* No specific version is selected.  There are two ways we
-	 can got here:
-
-	 - a binary which does not include versioning information
-	 is loaded
-
-	 - dlsym() instead of dlvsym() is used to get a symbol which
-	 might exist in more than one form
-
-	 If the library does not provide symbol version information
-	 there is no problem at all: we simply use the symbol if it
-	 is defined.
-
-	 These two lookups need to be handled differently if the
-	 library defines versions.  In the case of the old
-	 unversioned application the oldest (default) version
-	 should be used.  In case of a dlsym() call the latest and
-	 public interface should be returned.  */
-      if (verstab != NULL)
-	{
-	  if ((verstab[symidx] & 0x7fff)
-	      >= ((flags & DL_LOOKUP_RETURN_NEWEST) ? 2 : 3))
-	    {
-	      /* Don't accept hidden symbols.  */
-	      if ((verstab[symidx] & 0x8000) == 0
-		  && (*num_versions)++ == 0)
-		/* No version so far.  */
-		*versioned_sym = sym;
-
-	      return NULL;
-	    }
-	}
-    }
-
-  /* There cannot be another entry for this symbol so stop here.  */
-  return sym;
-}
-
-/* Utility function for do_lookup_unique.  Add a symbol to TABLE.  */
-static void
-enter_unique_sym (struct unique_sym *table, size_t size,
-                  unsigned int hash, const char *name,
-                  const ElfW(Sym) *sym, const struct link_map *map)
-{
-  size_t idx = hash % size;
-  size_t hash2 = 1 + hash % (size - 2);
-  while (table[idx].name != NULL)
-    {
-      idx += hash2;
-      if (idx >= size)
-        idx -= size;
-    }
-
-  table[idx].hashval = hash;
-  table[idx].name = name;
-  table[idx].sym = sym;
-  table[idx].map = map;
-}
-
-/* Utility function for do_lookup_x. Lookup an STB_GNU_UNIQUE symbol
-   in the unique symbol table, creating a new entry if necessary.
-   Return the matching symbol in RESULT.  */
-static void
-do_lookup_unique (const char *undef_name, uint_fast32_t new_hash,
-		  const struct link_map *map, struct sym_val *result,
-		  int type_class, const ElfW(Sym) *sym, const char *strtab,
-		  const ElfW(Sym) *ref, const struct link_map *undef_map)
-{
-  /* We have to determine whether we already found a symbol with this
-     name before.  If not then we have to add it to the search table.
-     If we already found a definition we have to use it.  */
-
-  struct unique_sym_table *tab
-    = &GL(dl_ns)[map->l_ns]._ns_unique_sym_table;
-
-  __rtld_lock_lock_recursive (tab->lock);
-
-  struct unique_sym *entries = tab->entries;
-  size_t size = tab->size;
-  if (entries != NULL)
-    {
-      size_t idx = new_hash % size;
-      size_t hash2 = 1 + new_hash % (size - 2);
-      while (1)
-	{
-	  if (entries[idx].hashval == new_hash
-	      && strcmp (entries[idx].name, undef_name) == 0)
-	    {
-	      if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
-		{
-		  /* We possibly have to initialize the central
-		     copy from the copy addressed through the
-		     relocation.  */
-		  result->s = sym;
-		  result->m = (struct link_map *) map;
-		}
-	      else
-		{
-		  result->s = entries[idx].sym;
-		  result->m = (struct link_map *) entries[idx].map;
-		}
-	      __rtld_lock_unlock_recursive (tab->lock);
-	      return;
-	    }
-
-	  if (entries[idx].name == NULL)
-	    break;
-
-	  idx += hash2;
-	  if (idx >= size)
-	    idx -= size;
-	}
-
-      if (size * 3 <= tab->n_elements * 4)
-	{
-	  /* Expand the table.  */
-#ifdef RTLD_CHECK_FOREIGN_CALL
-	  /* This must not happen during runtime relocations.  */
-	  assert (!RTLD_CHECK_FOREIGN_CALL);
-#endif
-	  size_t newsize = _dl_higher_prime_number (size + 1);
-	  struct unique_sym *newentries
-	    = calloc (sizeof (struct unique_sym), newsize);
-	  if (newentries == NULL)
-	    {
-	    nomem:
-	      __rtld_lock_unlock_recursive (tab->lock);
-	      _dl_fatal_printf ("out of memory\n");
-	    }
-
-	  for (idx = 0; idx < size; ++idx)
-	    if (entries[idx].name != NULL)
-	      enter_unique_sym (newentries, newsize, entries[idx].hashval,
-                                entries[idx].name, entries[idx].sym,
-                                entries[idx].map);
-
-	  tab->free (entries);
-	  tab->size = newsize;
-	  size = newsize;
-	  entries = tab->entries = newentries;
-	  tab->free = free;
-	}
-    }
-  else
-    {
-#ifdef RTLD_CHECK_FOREIGN_CALL
-      /* This must not happen during runtime relocations.  */
-      assert (!RTLD_CHECK_FOREIGN_CALL);
-#endif
-
-#ifdef SHARED
-      /* If tab->entries is NULL, but tab->size is not, it means
-	 this is the second, conflict finding, lookup for
-	 LD_TRACE_PRELINKING in _dl_debug_bindings.  Don't
-	 allocate anything and don't enter anything into the
-	 hash table.  */
-      if (__glibc_unlikely (tab->size))
-	{
-	  assert (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK);
-	  goto success;
-	}
-#endif
-
-#define INITIAL_NUNIQUE_SYM_TABLE 31
-      size = INITIAL_NUNIQUE_SYM_TABLE;
-      entries = calloc (sizeof (struct unique_sym), size);
-      if (entries == NULL)
-	goto nomem;
-
-      tab->entries = entries;
-      tab->size = size;
-      tab->free = free;
-    }
-
-  if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
-    enter_unique_sym (entries, size, new_hash, strtab + sym->st_name, ref,
-	   undef_map);
-  else
-    {
-      enter_unique_sym (entries, size,
-                        new_hash, strtab + sym->st_name, sym, map);
-
-      if (map->l_type == lt_loaded)
-	/* Make sure we don't unload this object by
-	   setting the appropriate flag.  */
-	((struct link_map *) map)->l_flags_1 |= DF_1_NODELETE;
-    }
-  ++tab->n_elements;
-
-#ifdef SHARED
- success:
-#endif
-  __rtld_lock_unlock_recursive (tab->lock);
-
-  result->s = sym;
-  result->m = (struct link_map *) map;
-}
-
-/* Inner part of the lookup functions.  We return a value > 0 if we
-   found the symbol, the value 0 if nothing is found and < 0 if
-   something bad happened.  */
-static int
-__attribute_noinline__
-do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
-	     unsigned long int *old_hash, const ElfW(Sym) *ref,
-	     struct sym_val *result, struct r_scope_elem *scope, size_t i,
-	     const struct r_found_version *const version, int flags,
-	     struct link_map *skip, int type_class, struct link_map *undef_map)
-{
-  size_t n = scope->r_nlist;
-  /* Make sure we read the value before proceeding.  Otherwise we
-     might use r_list pointing to the initial scope and r_nlist being
-     the value after a resize.  That is the only path in dl-open.c not
-     protected by GSCOPE.  A read barrier here might be to expensive.  */
-  __asm volatile ("" : "+r" (n), "+m" (scope->r_list));
-  struct link_map **list = scope->r_list;
-
-  do
-    {
-      const struct link_map *map = list[i]->l_real;
-
-      /* Here come the extra test needed for `_dl_lookup_symbol_skip'.  */
-      if (map == skip)
-	continue;
-
-      /* Don't search the executable when resolving a copy reloc.  */
-      if ((type_class & ELF_RTYPE_CLASS_COPY) && map->l_type == lt_executable)
-	continue;
-
-      /* Do not look into objects which are going to be removed.  */
-      if (map->l_removed)
-	continue;
-
-      /* Print some debugging info if wanted.  */
-      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SYMBOLS))
-	_dl_debug_printf ("symbol=%s;  lookup in file=%s [%lu]\n",
-			  undef_name, DSO_FILENAME (map->l_name),
-			  map->l_ns);
-
-      /* If the hash table is empty there is nothing to do here.  */
-      if (map->l_nbuckets == 0)
-	continue;
-
-      Elf_Symndx symidx;
-      int num_versions = 0;
-      const ElfW(Sym) *versioned_sym = NULL;
-
-      /* The tables for this map.  */
-      const ElfW(Sym) *symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]);
-      const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
-
-      const ElfW(Sym) *sym;
-      const ElfW(Addr) *bitmask = map->l_gnu_bitmask;
-      if (__glibc_likely (bitmask != NULL))
-	{
-	  ElfW(Addr) bitmask_word
-	    = bitmask[(new_hash / __ELF_NATIVE_CLASS)
-		      & map->l_gnu_bitmask_idxbits];
-
-	  unsigned int hashbit1 = new_hash & (__ELF_NATIVE_CLASS - 1);
-	  unsigned int hashbit2 = ((new_hash >> map->l_gnu_shift)
-				   & (__ELF_NATIVE_CLASS - 1));
-
-	  if (__glibc_unlikely ((bitmask_word >> hashbit1)
-				& (bitmask_word >> hashbit2) & 1))
-	    {
-	      Elf32_Word bucket = map->l_gnu_buckets[new_hash
-						     % map->l_nbuckets];
-	      if (bucket != 0)
-		{
-		  const Elf32_Word *hasharr = &map->l_gnu_chain_zero[bucket];
-
-		  do
-		    if (((*hasharr ^ new_hash) >> 1) == 0)
-		      {
-			symidx = hasharr - map->l_gnu_chain_zero;
-			sym = check_match (undef_name, ref, version, flags,
-					   type_class, &symtab[symidx], symidx,
-					   strtab, map, &versioned_sym,
-					   &num_versions);
-			if (sym != NULL)
-			  goto found_it;
-		      }
-		  while ((*hasharr++ & 1u) == 0);
-		}
-	    }
-	  /* No symbol found.  */
-	  symidx = SHN_UNDEF;
-	}
-      else
-	{
-	  if (*old_hash == 0xffffffff)
-	    *old_hash = _dl_elf_hash (undef_name);
-
-	  /* Use the old SysV-style hash table.  Search the appropriate
-	     hash bucket in this object's symbol table for a definition
-	     for the same symbol name.  */
-	  for (symidx = map->l_buckets[*old_hash % map->l_nbuckets];
-	       symidx != STN_UNDEF;
-	       symidx = map->l_chain[symidx])
-	    {
-	      sym = check_match (undef_name, ref, version, flags,
-				 type_class, &symtab[symidx], symidx,
-				 strtab, map, &versioned_sym,
-				 &num_versions);
-	      if (sym != NULL)
-		goto found_it;
-	    }
-	}
-
-      /* If we have seen exactly one versioned symbol while we are
-	 looking for an unversioned symbol and the version is not the
-	 default version we still accept this symbol since there are
-	 no possible ambiguities.  */
-      sym = num_versions == 1 ? versioned_sym : NULL;
-
-      if (sym != NULL)
-	{
-	found_it:
-	  /* When UNDEF_MAP is NULL, which indicates we are called from
-	     do_lookup_x on relocation against protected data, we skip
-	     the data definion in the executable from copy reloc.  */
-	  if (ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA
-	      && undef_map == NULL
-	      && map->l_type == lt_executable
-	      && type_class == ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA)
-	    {
-	      const ElfW(Sym) *s;
-	      unsigned int i;
-
-#if ! ELF_MACHINE_NO_RELA
-	      if (map->l_info[DT_RELA] != NULL
-		  && map->l_info[DT_RELASZ] != NULL
-		  && map->l_info[DT_RELASZ]->d_un.d_val != 0)
-		{
-		  const ElfW(Rela) *rela
-		    = (const ElfW(Rela) *) D_PTR (map, l_info[DT_RELA]);
-		  unsigned int rela_count
-		    = map->l_info[DT_RELASZ]->d_un.d_val / sizeof (*rela);
-
-		  for (i = 0; i < rela_count; i++, rela++)
-		    if (elf_machine_type_class (ELFW(R_TYPE) (rela->r_info))
-			== ELF_RTYPE_CLASS_COPY)
-		      {
-			s = &symtab[ELFW(R_SYM) (rela->r_info)];
-			if (!strcmp (strtab + s->st_name, undef_name))
-			  goto skip;
-		      }
-		}
-#endif
-#if ! ELF_MACHINE_NO_REL
-	      if (map->l_info[DT_REL] != NULL
-		  && map->l_info[DT_RELSZ] != NULL
-		  && map->l_info[DT_RELSZ]->d_un.d_val != 0)
-		{
-		  const ElfW(Rel) *rel
-		    = (const ElfW(Rel) *) D_PTR (map, l_info[DT_REL]);
-		  unsigned int rel_count
-		    = map->l_info[DT_RELSZ]->d_un.d_val / sizeof (*rel);
-
-		  for (i = 0; i < rel_count; i++, rel++)
-		    if (elf_machine_type_class (ELFW(R_TYPE) (rel->r_info))
-			== ELF_RTYPE_CLASS_COPY)
-		      {
-			s = &symtab[ELFW(R_SYM) (rel->r_info)];
-			if (!strcmp (strtab + s->st_name, undef_name))
-			  goto skip;
-		      }
-		}
-#endif
-	    }
-
-	  /* Hidden and internal symbols are local, ignore them.  */
-	  if (__glibc_unlikely (dl_symbol_visibility_binds_local_p (sym)))
-	    goto skip;
-
-	  switch (ELFW(ST_BIND) (sym->st_info))
-	    {
-	    case STB_WEAK:
-	      /* Weak definition.  Use this value if we don't find another.  */
-	      if (__glibc_unlikely (GLRO(dl_dynamic_weak)))
-		{
-		  if (! result->s)
-		    {
-		      result->s = sym;
-		      result->m = (struct link_map *) map;
-		    }
-		  break;
-		}
-	      /* FALLTHROUGH */
-	    case STB_GLOBAL:
-	      /* Global definition.  Just what we need.  */
-	      result->s = sym;
-	      result->m = (struct link_map *) map;
-	      return 1;
-
-	    case STB_GNU_UNIQUE:;
-	      do_lookup_unique (undef_name, new_hash, map, result, type_class,
-				sym, strtab, ref, undef_map);
-	      return 1;
-
-	    default:
-	      /* Local symbols are ignored.  */
-	      break;
-	    }
-	}
-
-skip:
-      /* If this current map is the one mentioned in the verneed entry
-	 and we have not found a weak entry, it is a bug.  */
-      if (symidx == STN_UNDEF && version != NULL && version->filename != NULL
-	  && __glibc_unlikely (_dl_name_match_p (version->filename, map)))
-	return -1;
-    }
-  while (++i < n);
-
-  /* We have not found anything until now.  */
-  return 0;
-}
-
-
-static uint_fast32_t
-dl_new_hash (const char *s)
-{
-  uint_fast32_t h = 5381;
-  for (unsigned char c = *s; c != '\0'; c = *++s)
-    h = h * 33 + c;
-  return h & 0xffffffff;
-}
-
-
-/* Add extra dependency on MAP to UNDEF_MAP.  */
-static int
-internal_function
-add_dependency (struct link_map *undef_map, struct link_map *map, int flags)
-{
-  struct link_map *runp;
-  unsigned int i;
-  int result = 0;
-
-  /* Avoid self-references and references to objects which cannot be
-     unloaded anyway.  */
-  if (undef_map == map)
-    return 0;
-
-  /* Avoid references to objects which cannot be unloaded anyway.  */
-  assert (map->l_type == lt_loaded);
-  if ((map->l_flags_1 & DF_1_NODELETE) != 0)
-    return 0;
-
-  struct link_map_reldeps *l_reldeps
-    = atomic_forced_read (undef_map->l_reldeps);
-
-  /* Make sure l_reldeps is read before l_initfini.  */
-  atomic_read_barrier ();
-
-  /* Determine whether UNDEF_MAP already has a reference to MAP.  First
-     look in the normal dependencies.  */
-  struct link_map **l_initfini = atomic_forced_read (undef_map->l_initfini);
-  if (l_initfini != NULL)
-    {
-      for (i = 0; l_initfini[i] != NULL; ++i)
-	if (l_initfini[i] == map)
-	  return 0;
-    }
-
-  /* No normal dependency.  See whether we already had to add it
-     to the special list of dynamic dependencies.  */
-  unsigned int l_reldepsact = 0;
-  if (l_reldeps != NULL)
-    {
-      struct link_map **list = &l_reldeps->list[0];
-      l_reldepsact = l_reldeps->act;
-      for (i = 0; i < l_reldepsact; ++i)
-	if (list[i] == map)
-	  return 0;
-    }
-
-  /* Save serial number of the target MAP.  */
-  unsigned long long serial = map->l_serial;
-
-  /* Make sure nobody can unload the object while we are at it.  */
-  if (__glibc_unlikely (flags & DL_LOOKUP_GSCOPE_LOCK))
-    {
-      /* We can't just call __rtld_lock_lock_recursive (GL(dl_load_lock))
-	 here, that can result in ABBA deadlock.  */
-      THREAD_GSCOPE_RESET_FLAG ();
-      __rtld_lock_lock_recursive (GL(dl_load_lock));
-      /* While MAP value won't change, after THREAD_GSCOPE_RESET_FLAG ()
-	 it can e.g. point to unallocated memory.  So avoid the optimizer
-	 treating the above read from MAP->l_serial as ensurance it
-	 can safely dereference it.  */
-      map = atomic_forced_read (map);
-
-      /* From this point on it is unsafe to dereference MAP, until it
-	 has been found in one of the lists.  */
-
-      /* Redo the l_initfini check in case undef_map's l_initfini
-	 changed in the mean time.  */
-      if (undef_map->l_initfini != l_initfini
-	  && undef_map->l_initfini != NULL)
-	{
-	  l_initfini = undef_map->l_initfini;
-	  for (i = 0; l_initfini[i] != NULL; ++i)
-	    if (l_initfini[i] == map)
-	      goto out_check;
-	}
-
-      /* Redo the l_reldeps check if undef_map's l_reldeps changed in
-	 the mean time.  */
-      if (undef_map->l_reldeps != NULL)
-	{
-	  if (undef_map->l_reldeps != l_reldeps)
-	    {
-	      struct link_map **list = &undef_map->l_reldeps->list[0];
-	      l_reldepsact = undef_map->l_reldeps->act;
-	      for (i = 0; i < l_reldepsact; ++i)
-		if (list[i] == map)
-		  goto out_check;
-	    }
-	  else if (undef_map->l_reldeps->act > l_reldepsact)
-	    {
-	      struct link_map **list
-		= &undef_map->l_reldeps->list[0];
-	      i = l_reldepsact;
-	      l_reldepsact = undef_map->l_reldeps->act;
-	      for (; i < l_reldepsact; ++i)
-		if (list[i] == map)
-		  goto out_check;
-	    }
-	}
-    }
-  else
-    __rtld_lock_lock_recursive (GL(dl_load_lock));
-
-  /* The object is not yet in the dependency list.  Before we add
-     it make sure just one more time the object we are about to
-     reference is still available.  There is a brief period in
-     which the object could have been removed since we found the
-     definition.  */
-  runp = GL(dl_ns)[undef_map->l_ns]._ns_loaded;
-  while (runp != NULL && runp != map)
-    runp = runp->l_next;
-
-  if (runp != NULL)
-    {
-      /* The object is still available.  */
-
-      /* MAP could have been dlclosed, freed and then some other dlopened
-	 library could have the same link_map pointer.  */
-      if (map->l_serial != serial)
-	goto out_check;
-
-      /* Redo the NODELETE check, as when dl_load_lock wasn't held
-	 yet this could have changed.  */
-      if ((map->l_flags_1 & DF_1_NODELETE) != 0)
-	goto out;
-
-      /* If the object with the undefined reference cannot be removed ever
-	 just make sure the same is true for the object which contains the
-	 definition.  */
-      if (undef_map->l_type != lt_loaded
-	  || (undef_map->l_flags_1 & DF_1_NODELETE) != 0)
-	{
-	  map->l_flags_1 |= DF_1_NODELETE;
-	  goto out;
-	}
-
-      /* Add the reference now.  */
-      if (__glibc_unlikely (l_reldepsact >= undef_map->l_reldepsmax))
-	{
-	  /* Allocate more memory for the dependency list.  Since this
-	     can never happen during the startup phase we can use
-	     `realloc'.  */
-	  struct link_map_reldeps *newp;
-	  unsigned int max
-	    = undef_map->l_reldepsmax ? undef_map->l_reldepsmax * 2 : 10;
-
-#ifdef RTLD_PREPARE_FOREIGN_CALL
-	  RTLD_PREPARE_FOREIGN_CALL;
-#endif
-
-	  newp = malloc (sizeof (*newp) + max * sizeof (struct link_map *));
-	  if (newp == NULL)
-	    {
-	      /* If we didn't manage to allocate memory for the list this is
-		 no fatal problem.  We simply make sure the referenced object
-		 cannot be unloaded.  This is semantically the correct
-		 behavior.  */
-	      map->l_flags_1 |= DF_1_NODELETE;
-	      goto out;
-	    }
-	  else
-	    {
-	      if (l_reldepsact)
-		memcpy (&newp->list[0], &undef_map->l_reldeps->list[0],
-			l_reldepsact * sizeof (struct link_map *));
-	      newp->list[l_reldepsact] = map;
-	      newp->act = l_reldepsact + 1;
-	      atomic_write_barrier ();
-	      void *old = undef_map->l_reldeps;
-	      undef_map->l_reldeps = newp;
-	      undef_map->l_reldepsmax = max;
-	      if (old)
-		_dl_scope_free (old);
-	    }
-	}
-      else
-	{
-	  undef_map->l_reldeps->list[l_reldepsact] = map;
-	  atomic_write_barrier ();
-	  undef_map->l_reldeps->act = l_reldepsact + 1;
-	}
-
-      /* Display information if we are debugging.  */
-      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
-	_dl_debug_printf ("\
-\nfile=%s [%lu];  needed by %s [%lu] (relocation dependency)\n\n",
-			  DSO_FILENAME (map->l_name),
-			  map->l_ns,
-			  DSO_FILENAME (undef_map->l_name),
-			  undef_map->l_ns);
-    }
-  else
-    /* Whoa, that was bad luck.  We have to search again.  */
-    result = -1;
-
- out:
-  /* Release the lock.  */
-  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-
-  if (__glibc_unlikely (flags & DL_LOOKUP_GSCOPE_LOCK))
-    THREAD_GSCOPE_SET_FLAG ();
-
-  return result;
-
- out_check:
-  if (map->l_serial != serial)
-    result = -1;
-  goto out;
-}
-
-static void
-internal_function
-_dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
-		    const ElfW(Sym) **ref, struct sym_val *value,
-		    const struct r_found_version *version, int type_class,
-		    int protected);
-
-
-/* Search loaded objects' symbol tables for a definition of the symbol
-   UNDEF_NAME, perhaps with a requested version for the symbol.
-
-   We must never have calls to the audit functions inside this function
-   or in any function which gets called.  If this would happen the audit
-   code might create a thread which can throw off all the scope locking.  */
-lookup_t
-internal_function
-_dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map,
-		     const ElfW(Sym) **ref,
-		     struct r_scope_elem *symbol_scope[],
-		     const struct r_found_version *version,
-		     int type_class, int flags, struct link_map *skip_map)
-{
-  const uint_fast32_t new_hash = dl_new_hash (undef_name);
-  unsigned long int old_hash = 0xffffffff;
-  struct sym_val current_value = { NULL, NULL };
-  struct r_scope_elem **scope = symbol_scope;
-
-  bump_num_relocations ();
-
-  /* No other flag than DL_LOOKUP_ADD_DEPENDENCY or DL_LOOKUP_GSCOPE_LOCK
-     is allowed if we look up a versioned symbol.  */
-  assert (version == NULL
-	  || (flags & ~(DL_LOOKUP_ADD_DEPENDENCY | DL_LOOKUP_GSCOPE_LOCK))
-	     == 0);
-
-  size_t i = 0;
-  if (__glibc_unlikely (skip_map != NULL))
-    /* Search the relevant loaded objects for a definition.  */
-    while ((*scope)->r_list[i] != skip_map)
-      ++i;
-
-  /* Search the relevant loaded objects for a definition.  */
-  for (size_t start = i; *scope != NULL; start = 0, ++scope)
-    {
-      int res = do_lookup_x (undef_name, new_hash, &old_hash, *ref,
-			     &current_value, *scope, start, version, flags,
-			     skip_map, type_class, undef_map);
-      if (res > 0)
-	break;
-
-      if (__glibc_unlikely (res < 0) && skip_map == NULL)
-	{
-	  /* Oh, oh.  The file named in the relocation entry does not
-	     contain the needed symbol.  This code is never reached
-	     for unversioned lookups.  */
-	  assert (version != NULL);
-	  const char *reference_name = undef_map ? undef_map->l_name : "";
-
-	  /* XXX We cannot translate the message.  */
-	  _dl_signal_cerror (0, DSO_FILENAME (reference_name),
-			     N_("relocation error"),
-			     make_string ("symbol ", undef_name, ", version ",
-					  version->name,
-					  " not defined in file ",
-					  version->filename,
-					  " with link time reference",
-					  res == -2
-					  ? " (no version symbols)" : ""));
-	  *ref = NULL;
-	  return 0;
-	}
-    }
-
-  if (__glibc_unlikely (current_value.s == NULL))
-    {
-      if ((*ref == NULL || ELFW(ST_BIND) ((*ref)->st_info) != STB_WEAK)
-	  && !(GLRO(dl_debug_mask) & DL_DEBUG_UNUSED))
-	{
-	  /* We could find no value for a strong reference.  */
-	  const char *reference_name = undef_map ? undef_map->l_name : "";
-	  const char *versionstr = version ? ", version " : "";
-	  const char *versionname = (version && version->name
-				     ? version->name : "");
-
-	  /* XXX We cannot translate the message.  */
-	  _dl_signal_cerror (0, DSO_FILENAME (reference_name),
-			     N_("symbol lookup error"),
-			     make_string ("undefined symbol: ", undef_name,
-					  versionstr, versionname));
-	}
-      *ref = NULL;
-      return 0;
-    }
-
-  int protected = (*ref
-		   && ELFW(ST_VISIBILITY) ((*ref)->st_other) == STV_PROTECTED);
-  if (__glibc_unlikely (protected != 0))
-    {
-      /* It is very tricky.  We need to figure out what value to
-	 return for the protected symbol.  */
-      if (type_class == ELF_RTYPE_CLASS_PLT)
-	{
-	  if (current_value.s != NULL && current_value.m != undef_map)
-	    {
-	      current_value.s = *ref;
-	      current_value.m = undef_map;
-	    }
-	}
-      else
-	{
-	  struct sym_val protected_value = { NULL, NULL };
-
-	  for (scope = symbol_scope; *scope != NULL; i = 0, ++scope)
-	    if (do_lookup_x (undef_name, new_hash, &old_hash, *ref,
-			     &protected_value, *scope, i, version, flags,
-			     skip_map,
-			     (ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA
-			      && ELFW(ST_TYPE) ((*ref)->st_info) == STT_OBJECT
-			      && type_class == ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA)
-			     ? ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA
-			     : ELF_RTYPE_CLASS_PLT, NULL) != 0)
-	      break;
-
-	  if (protected_value.s != NULL && protected_value.m != undef_map)
-	    {
-	      current_value.s = *ref;
-	      current_value.m = undef_map;
-	    }
-	}
-    }
-
-  /* We have to check whether this would bind UNDEF_MAP to an object
-     in the global scope which was dynamically loaded.  In this case
-     we have to prevent the latter from being unloaded unless the
-     UNDEF_MAP object is also unloaded.  */
-  if (__glibc_unlikely (current_value.m->l_type == lt_loaded)
-      /* Don't do this for explicit lookups as opposed to implicit
-	 runtime lookups.  */
-      && (flags & DL_LOOKUP_ADD_DEPENDENCY) != 0
-      /* Add UNDEF_MAP to the dependencies.  */
-      && add_dependency (undef_map, current_value.m, flags) < 0)
-      /* Something went wrong.  Perhaps the object we tried to reference
-	 was just removed.  Try finding another definition.  */
-      return _dl_lookup_symbol_x (undef_name, undef_map, ref,
-				  (flags & DL_LOOKUP_GSCOPE_LOCK)
-				  ? undef_map->l_scope : symbol_scope,
-				  version, type_class, flags, skip_map);
-
-  /* The object is used.  */
-  if (__glibc_unlikely (current_value.m->l_used == 0))
-    current_value.m->l_used = 1;
-
-  if (__glibc_unlikely (GLRO(dl_debug_mask)
-			& (DL_DEBUG_BINDINGS|DL_DEBUG_PRELINK)))
-    _dl_debug_bindings (undef_name, undef_map, ref,
-			&current_value, version, type_class, protected);
-
-  *ref = current_value.s;
-  return LOOKUP_VALUE (current_value.m);
-}
-
-
-/* Cache the location of MAP's hash table.  */
-
-void
-internal_function
-_dl_setup_hash (struct link_map *map)
-{
-  Elf_Symndx *hash;
-
-  if (__glibc_likely (map->l_info[DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM
-				    + DT_THISPROCNUM + DT_VERSIONTAGNUM
-				    + DT_EXTRANUM + DT_VALNUM] != NULL))
-    {
-      Elf32_Word *hash32
-	= (void *) D_PTR (map, l_info[DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM
-				      + DT_THISPROCNUM + DT_VERSIONTAGNUM
-				      + DT_EXTRANUM + DT_VALNUM]);
-      map->l_nbuckets = *hash32++;
-      Elf32_Word symbias = *hash32++;
-      Elf32_Word bitmask_nwords = *hash32++;
-      /* Must be a power of two.  */
-      assert ((bitmask_nwords & (bitmask_nwords - 1)) == 0);
-      map->l_gnu_bitmask_idxbits = bitmask_nwords - 1;
-      map->l_gnu_shift = *hash32++;
-
-      map->l_gnu_bitmask = (ElfW(Addr) *) hash32;
-      hash32 += __ELF_NATIVE_CLASS / 32 * bitmask_nwords;
-
-      map->l_gnu_buckets = hash32;
-      hash32 += map->l_nbuckets;
-      map->l_gnu_chain_zero = hash32 - symbias;
-      return;
-    }
-
-  if (!map->l_info[DT_HASH])
-    return;
-  hash = (void *) D_PTR (map, l_info[DT_HASH]);
-
-  map->l_nbuckets = *hash++;
-  /* Skip nchain.  */
-  hash++;
-  map->l_buckets = hash;
-  hash += map->l_nbuckets;
-  map->l_chain = hash;
-}
-
-
-static void
-internal_function
-_dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
-		    const ElfW(Sym) **ref, struct sym_val *value,
-		    const struct r_found_version *version, int type_class,
-		    int protected)
-{
-  const char *reference_name = undef_map->l_name;
-
-  if (GLRO(dl_debug_mask) & DL_DEBUG_BINDINGS)
-    {
-      _dl_debug_printf ("binding file %s [%lu] to %s [%lu]: %s symbol `%s'",
-			DSO_FILENAME (reference_name),
-			undef_map->l_ns,
-			DSO_FILENAME (value->m->l_name),
-			value->m->l_ns,
-			protected ? "protected" : "normal", undef_name);
-      if (version)
-	_dl_debug_printf_c (" [%s]\n", version->name);
-      else
-	_dl_debug_printf_c ("\n");
-    }
-#ifdef SHARED
-  if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)
-    {
-/* ELF_RTYPE_CLASS_XXX must match RTYPE_CLASS_XXX used by prelink with
-   LD_TRACE_PRELINKING.  */
-#define RTYPE_CLASS_VALID	8
-#define RTYPE_CLASS_PLT		(8|1)
-#define RTYPE_CLASS_COPY	(8|2)
-#define RTYPE_CLASS_TLS		(8|4)
-#if ELF_RTYPE_CLASS_PLT != 0 && ELF_RTYPE_CLASS_PLT != 1
-# error ELF_RTYPE_CLASS_PLT must be 0 or 1!
-#endif
-#if ELF_RTYPE_CLASS_COPY != 0 && ELF_RTYPE_CLASS_COPY != 2
-# error ELF_RTYPE_CLASS_COPY must be 0 or 2!
-#endif
-      int conflict = 0;
-      struct sym_val val = { NULL, NULL };
-
-      if ((GLRO(dl_trace_prelink_map) == NULL
-	   || GLRO(dl_trace_prelink_map) == GL(dl_ns)[LM_ID_BASE]._ns_loaded)
-	  && undef_map != GL(dl_ns)[LM_ID_BASE]._ns_loaded)
-	{
-	  const uint_fast32_t new_hash = dl_new_hash (undef_name);
-	  unsigned long int old_hash = 0xffffffff;
-	  struct unique_sym *saved_entries
-	    = GL(dl_ns)[LM_ID_BASE]._ns_unique_sym_table.entries;
-
-	  GL(dl_ns)[LM_ID_BASE]._ns_unique_sym_table.entries = NULL;
-	  do_lookup_x (undef_name, new_hash, &old_hash, *ref, &val,
-		       undef_map->l_local_scope[0], 0, version, 0, NULL,
-		       type_class, undef_map);
-	  if (val.s != value->s || val.m != value->m)
-	    conflict = 1;
-	  else if (__glibc_unlikely (undef_map->l_symbolic_in_local_scope)
-		   && val.s
-		   && __glibc_unlikely (ELFW(ST_BIND) (val.s->st_info)
-					== STB_GNU_UNIQUE))
-	    {
-	      /* If it is STB_GNU_UNIQUE and undef_map's l_local_scope
-		 contains any DT_SYMBOLIC libraries, unfortunately there
-		 can be conflicts even if the above is equal.  As symbol
-		 resolution goes from the last library to the first and
-		 if a STB_GNU_UNIQUE symbol is found in some late DT_SYMBOLIC
-		 library, it would be the one that is looked up.  */
-	      struct sym_val val2 = { NULL, NULL };
-	      size_t n;
-	      struct r_scope_elem *scope = undef_map->l_local_scope[0];
-
-	      for (n = 0; n < scope->r_nlist; n++)
-		if (scope->r_list[n] == val.m)
-		  break;
-
-	      for (n++; n < scope->r_nlist; n++)
-		if (scope->r_list[n]->l_info[DT_SYMBOLIC] != NULL
-		    && do_lookup_x (undef_name, new_hash, &old_hash, *ref,
-				    &val2,
-				    &scope->r_list[n]->l_symbolic_searchlist,
-				    0, version, 0, NULL, type_class,
-				    undef_map) > 0)
-		  {
-		    conflict = 1;
-		    val = val2;
-		    break;
-		  }
-	    }
-	  GL(dl_ns)[LM_ID_BASE]._ns_unique_sym_table.entries = saved_entries;
-	}
-
-      if (value->s)
-	{
-	  /* Keep only ELF_RTYPE_CLASS_PLT and ELF_RTYPE_CLASS_COPY
-	     bits since since prelink only uses them.  */
-	  type_class &= ELF_RTYPE_CLASS_PLT | ELF_RTYPE_CLASS_COPY;
-	  if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info)
-				== STT_TLS))
-	    /* Clear the RTYPE_CLASS_VALID bit in RTYPE_CLASS_TLS.  */
-	    type_class = RTYPE_CLASS_TLS & ~RTYPE_CLASS_VALID;
-	  else if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info)
-				     == STT_GNU_IFUNC))
-	    /* Set the RTYPE_CLASS_VALID bit.  */
-	    type_class |= RTYPE_CLASS_VALID;
-	}
-
-      if (conflict
-	  || GLRO(dl_trace_prelink_map) == undef_map
-	  || GLRO(dl_trace_prelink_map) == NULL
-	  || type_class >= 4)
-	{
-	  _dl_printf ("%s 0x%0*Zx 0x%0*Zx -> 0x%0*Zx 0x%0*Zx ",
-		      conflict ? "conflict" : "lookup",
-		      (int) sizeof (ElfW(Addr)) * 2,
-		      (size_t) undef_map->l_map_start,
-		      (int) sizeof (ElfW(Addr)) * 2,
-		      (size_t) (((ElfW(Addr)) *ref) - undef_map->l_map_start),
-		      (int) sizeof (ElfW(Addr)) * 2,
-		      (size_t) (value->s ? value->m->l_map_start : 0),
-		      (int) sizeof (ElfW(Addr)) * 2,
-		      (size_t) (value->s ? value->s->st_value : 0));
-
-	  if (conflict)
-	    _dl_printf ("x 0x%0*Zx 0x%0*Zx ",
-			(int) sizeof (ElfW(Addr)) * 2,
-			(size_t) (val.s ? val.m->l_map_start : 0),
-			(int) sizeof (ElfW(Addr)) * 2,
-			(size_t) (val.s ? val.s->st_value : 0));
-
-	  _dl_printf ("/%x %s\n", type_class, undef_name);
-	}
-    }
-#endif
-}
diff --git a/elf/dl-machine-reject-phdr.h b/elf/dl-machine-reject-phdr.h
deleted file mode 100644
index 57253deb52..0000000000
--- a/elf/dl-machine-reject-phdr.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Machine-dependent program header inspection for the ELF loader.
-   Copyright (C) 2014-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _DL_MACHINE_REJECT_PHDR_H
-#define _DL_MACHINE_REJECT_PHDR_H 1
-
-#include <stdbool.h>
-
-/* Return true iff ELF program headers are incompatible with the running
-   host.  */
-static inline bool
-elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, uint_fast16_t phnum,
-			   const char *buf, size_t len, struct link_map *map,
-			   int fd)
-{
-  return false;
-}
-
-#endif /* dl-machine-reject-phdr.h */
diff --git a/elf/dl-map-segments.h b/elf/dl-map-segments.h
deleted file mode 100644
index d36f9bd2f6..0000000000
--- a/elf/dl-map-segments.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/* Map in a shared object's segments.  Generic version.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dl-load.h>
-
-/* This implementation assumes (as does the corresponding implementation
-   of _dl_unmap_segments, in dl-unmap-segments.h) that shared objects
-   are always laid out with all segments contiguous (or with gaps
-   between them small enough that it's preferable to reserve all whole
-   pages inside the gaps with PROT_NONE mappings rather than permitting
-   other use of those parts of the address space).  */
-
-static __always_inline const char *
-_dl_map_segments (struct link_map *l, int fd,
-                  const ElfW(Ehdr) *header, int type,
-                  const struct loadcmd loadcmds[], size_t nloadcmds,
-                  const size_t maplength, bool has_holes,
-                  struct link_map *loader)
-{
-  const struct loadcmd *c = loadcmds;
-
-  if (__glibc_likely (type == ET_DYN))
-    {
-      /* This is a position-independent shared object.  We can let the
-         kernel map it anywhere it likes, but we must have space for all
-         the segments in their specified positions relative to the first.
-         So we map the first segment without MAP_FIXED, but with its
-         extent increased to cover all the segments.  Then we remove
-         access from excess portion, and there is known sufficient space
-         there to remap from the later segments.
-
-         As a refinement, sometimes we have an address that we would
-         prefer to map such objects at; but this is only a preference,
-         the OS can do whatever it likes. */
-      ElfW(Addr) mappref
-        = (ELF_PREFERRED_ADDRESS (loader, maplength,
-                                  c->mapstart & GLRO(dl_use_load_bias))
-           - MAP_BASE_ADDR (l));
-
-      /* Remember which part of the address space this object uses.  */
-      l->l_map_start = (ElfW(Addr)) __mmap ((void *) mappref, maplength,
-                                            c->prot,
-                                            MAP_COPY|MAP_FILE,
-                                            fd, c->mapoff);
-      if (__glibc_unlikely ((void *) l->l_map_start == MAP_FAILED))
-        return DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT;
-
-      l->l_map_end = l->l_map_start + maplength;
-      l->l_addr = l->l_map_start - c->mapstart;
-
-      if (has_holes)
-        {
-          /* Change protection on the excess portion to disallow all access;
-             the portions we do not remap later will be inaccessible as if
-             unallocated.  Then jump into the normal segment-mapping loop to
-             handle the portion of the segment past the end of the file
-             mapping.  */
-          if (__glibc_unlikely
-              (__mprotect ((caddr_t) (l->l_addr + c->mapend),
-                           loadcmds[nloadcmds - 1].mapstart - c->mapend,
-                           PROT_NONE) < 0))
-            return DL_MAP_SEGMENTS_ERROR_MPROTECT;
-        }
-
-      l->l_contiguous = 1;
-
-      goto postmap;
-    }
-
-  /* Remember which part of the address space this object uses.  */
-  l->l_map_start = c->mapstart + l->l_addr;
-  l->l_map_end = l->l_map_start + maplength;
-  l->l_contiguous = !has_holes;
-
-  while (c < &loadcmds[nloadcmds])
-    {
-      if (c->mapend > c->mapstart
-          /* Map the segment contents from the file.  */
-          && (__mmap ((void *) (l->l_addr + c->mapstart),
-                      c->mapend - c->mapstart, c->prot,
-                      MAP_FIXED|MAP_COPY|MAP_FILE,
-                      fd, c->mapoff)
-              == MAP_FAILED))
-        return DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT;
-
-    postmap:
-      _dl_postprocess_loadcmd (l, header, c);
-
-      if (c->allocend > c->dataend)
-        {
-          /* Extra zero pages should appear at the end of this segment,
-             after the data mapped from the file.   */
-          ElfW(Addr) zero, zeroend, zeropage;
-
-          zero = l->l_addr + c->dataend;
-          zeroend = l->l_addr + c->allocend;
-          zeropage = ((zero + GLRO(dl_pagesize) - 1)
-                      & ~(GLRO(dl_pagesize) - 1));
-
-          if (zeroend < zeropage)
-            /* All the extra data is in the last page of the segment.
-               We can just zero it.  */
-            zeropage = zeroend;
-
-          if (zeropage > zero)
-            {
-              /* Zero the final part of the last page of the segment.  */
-              if (__glibc_unlikely ((c->prot & PROT_WRITE) == 0))
-                {
-                  /* Dag nab it.  */
-                  if (__mprotect ((caddr_t) (zero
-                                             & ~(GLRO(dl_pagesize) - 1)),
-                                  GLRO(dl_pagesize), c->prot|PROT_WRITE) < 0)
-                    return DL_MAP_SEGMENTS_ERROR_MPROTECT;
-                }
-              memset ((void *) zero, '\0', zeropage - zero);
-              if (__glibc_unlikely ((c->prot & PROT_WRITE) == 0))
-                __mprotect ((caddr_t) (zero & ~(GLRO(dl_pagesize) - 1)),
-                            GLRO(dl_pagesize), c->prot);
-            }
-
-          if (zeroend > zeropage)
-            {
-              /* Map the remaining zero pages in from the zero fill FD.  */
-              caddr_t mapat;
-              mapat = __mmap ((caddr_t) zeropage, zeroend - zeropage,
-                              c->prot, MAP_ANON|MAP_PRIVATE|MAP_FIXED,
-                              -1, 0);
-              if (__glibc_unlikely (mapat == MAP_FAILED))
-                return DL_MAP_SEGMENTS_ERROR_MAP_ZERO_FILL;
-            }
-        }
-
-      ++c;
-    }
-
-  /* Notify ELF_PREFERRED_ADDRESS that we have to load this one
-     fixed.  */
-  ELF_FIXED_ADDRESS (loader, c->mapstart);
-
-  return NULL;
-}
diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c
deleted file mode 100644
index 1a35baff2e..0000000000
--- a/elf/dl-minimal.c
+++ /dev/null
@@ -1,380 +0,0 @@
-/* Minimal replacements for basic facilities used in the dynamic linker.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include <string.h>
-#include <tls.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <ldsodefs.h>
-#include <_itoa.h>
-#include <malloc/malloc-internal.h>
-
-#include <assert.h>
-
-/* Minimal malloc allocator for used during initial link.  After the
-   initial link, a full malloc implementation is interposed, either
-   the one in libc, or a different one supplied by the user through
-   interposition.  */
-
-static void *alloc_ptr, *alloc_end, *alloc_last_block;
-
-/* Declarations of global functions.  */
-extern void weak_function free (void *ptr);
-extern void * weak_function realloc (void *ptr, size_t n);
-extern unsigned long int weak_function __strtoul_internal (const char *nptr,
-							   char **endptr,
-							   int base,
-							   int group);
-extern unsigned long int weak_function strtoul (const char *nptr,
-						char **endptr, int base);
-
-
-/* Allocate an aligned memory block.  */
-void * weak_function
-malloc (size_t n)
-{
-  if (alloc_end == 0)
-    {
-      /* Consume any unused space in the last page of our data segment.  */
-      extern int _end attribute_hidden;
-      alloc_ptr = &_end;
-      alloc_end = (void *) 0 + (((alloc_ptr - (void *) 0)
-				 + GLRO(dl_pagesize) - 1)
-				& ~(GLRO(dl_pagesize) - 1));
-    }
-
-  /* Make sure the allocation pointer is ideally aligned.  */
-  alloc_ptr = (void *) 0 + (((alloc_ptr - (void *) 0) + MALLOC_ALIGNMENT - 1)
-			    & ~(MALLOC_ALIGNMENT - 1));
-
-  if (alloc_ptr + n >= alloc_end || n >= -(uintptr_t) alloc_ptr)
-    {
-      /* Insufficient space left; allocate another page plus one extra
-	 page to reduce number of mmap calls.  */
-      caddr_t page;
-      size_t nup = (n + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1);
-      if (__glibc_unlikely (nup == 0 && n != 0))
-	return NULL;
-      nup += GLRO(dl_pagesize);
-      page = __mmap (0, nup, PROT_READ|PROT_WRITE,
-		     MAP_ANON|MAP_PRIVATE, -1, 0);
-      if (page == MAP_FAILED)
-	return NULL;
-      if (page != alloc_end)
-	alloc_ptr = page;
-      alloc_end = page + nup;
-    }
-
-  alloc_last_block = (void *) alloc_ptr;
-  alloc_ptr += n;
-  return alloc_last_block;
-}
-
-/* We use this function occasionally since the real implementation may
-   be optimized when it can assume the memory it returns already is
-   set to NUL.  */
-void * weak_function
-calloc (size_t nmemb, size_t size)
-{
-  /* New memory from the trivial malloc above is always already cleared.
-     (We make sure that's true in the rare occasion it might not be,
-     by clearing memory in free, below.)  */
-  size_t bytes = nmemb * size;
-
-#define HALF_SIZE_T (((size_t) 1) << (8 * sizeof (size_t) / 2))
-  if (__builtin_expect ((nmemb | size) >= HALF_SIZE_T, 0)
-      && size != 0 && bytes / size != nmemb)
-    return NULL;
-
-  return malloc (bytes);
-}
-
-/* This will rarely be called.  */
-void weak_function
-free (void *ptr)
-{
-  /* We can free only the last block allocated.  */
-  if (ptr == alloc_last_block)
-    {
-      /* Since this is rare, we clear the freed block here
-	 so that calloc can presume malloc returns cleared memory.  */
-      memset (alloc_last_block, '\0', alloc_ptr - alloc_last_block);
-      alloc_ptr = alloc_last_block;
-    }
-}
-
-/* This is only called with the most recent block returned by malloc.  */
-void * weak_function
-realloc (void *ptr, size_t n)
-{
-  if (ptr == NULL)
-    return malloc (n);
-  assert (ptr == alloc_last_block);
-  size_t old_size = alloc_ptr - alloc_last_block;
-  alloc_ptr = alloc_last_block;
-  void *new = malloc (n);
-  return new != ptr ? memcpy (new, ptr, old_size) : new;
-}
-
-/* Avoid signal frobnication in setjmp/longjmp.  Keeps things smaller.  */
-
-#include <setjmp.h>
-
-int weak_function
-__sigjmp_save (sigjmp_buf env, int savemask __attribute__ ((unused)))
-{
-  env[0].__mask_was_saved = 0;
-  return 0;
-}
-
-/* Define our own version of the internal function used by strerror.  We
-   only provide the messages for some common errors.  This avoids pulling
-   in the whole error list.  */
-
-char * weak_function
-__strerror_r (int errnum, char *buf, size_t buflen)
-{
-  char *msg;
-
-  switch (errnum)
-    {
-    case ENOMEM:
-      msg = (char *) "Cannot allocate memory";
-      break;
-    case EINVAL:
-      msg = (char *) "Invalid argument";
-      break;
-    case ENOENT:
-      msg = (char *) "No such file or directory";
-      break;
-    case EPERM:
-      msg = (char *) "Operation not permitted";
-      break;
-    case EIO:
-      msg = (char *) "Input/output error";
-      break;
-    case EACCES:
-      msg = (char *) "Permission denied";
-      break;
-    default:
-      /* No need to check buffer size, all calls in the dynamic linker
-	 provide enough space.  */
-      buf[buflen - 1] = '\0';
-      msg = _itoa (errnum, buf + buflen - 1, 10, 0);
-      msg = memcpy (msg - (sizeof ("Error ") - 1), "Error ",
-		    sizeof ("Error ") - 1);
-      break;
-    }
-
-  return msg;
-}
-
-void
-__libc_fatal (const char *message)
-{
-  _dl_fatal_printf ("%s", message);
-}
-rtld_hidden_def (__libc_fatal)
-
-void
-__attribute__ ((noreturn))
-__chk_fail (void)
-{
-  _exit (127);
-}
-rtld_hidden_def (__chk_fail)
-
-#ifndef NDEBUG
-/* Define (weakly) our own assert failure function which doesn't use stdio.
-   If we are linked into the user program (-ldl), the normal __assert_fail
-   defn can override this one.  */
-
-void weak_function
-__assert_fail (const char *assertion,
-	       const char *file, unsigned int line, const char *function)
-{
-  _dl_fatal_printf ("\
-Inconsistency detected by ld.so: %s: %u: %s%sAssertion `%s' failed!\n",
-		    file, line, function ?: "", function ? ": " : "",
-		    assertion);
-
-}
-rtld_hidden_weak (__assert_fail)
-
-void weak_function
-__assert_perror_fail (int errnum,
-		      const char *file, unsigned int line,
-		      const char *function)
-{
-  char errbuf[400];
-  _dl_fatal_printf ("\
-Inconsistency detected by ld.so: %s: %u: %s%sUnexpected error: %s.\n",
-		    file, line, function ?: "", function ? ": " : "",
-		    __strerror_r (errnum, errbuf, sizeof errbuf));
-
-}
-rtld_hidden_weak (__assert_perror_fail)
-#endif
-
-unsigned long int weak_function
-__strtoul_internal (const char *nptr, char **endptr, int base, int group)
-{
-  unsigned long int result = 0;
-  long int sign = 1;
-  unsigned max_digit;
-
-  while (*nptr == ' ' || *nptr == '\t')
-    ++nptr;
-
-  if (*nptr == '-')
-    {
-      sign = -1;
-      ++nptr;
-    }
-  else if (*nptr == '+')
-    ++nptr;
-
-  if (*nptr < '0' || *nptr > '9')
-    {
-      if (endptr != NULL)
-	*endptr = (char *) nptr;
-      return 0UL;
-    }
-
-  assert (base == 0);
-  base = 10;
-  max_digit = 9;
-  if (*nptr == '0')
-    {
-      if (nptr[1] == 'x' || nptr[1] == 'X')
-	{
-	  base = 16;
-	  nptr += 2;
-	}
-      else
-	{
-	  base = 8;
-	  max_digit = 7;
-	}
-    }
-
-  while (1)
-    {
-      unsigned long int digval;
-      if (*nptr >= '0' && *nptr <= '0' + max_digit)
-        digval = *nptr - '0';
-      else if (base == 16)
-        {
-	  if (*nptr >= 'a' && *nptr <= 'f')
-	    digval = *nptr - 'a' + 10;
-	  else if (*nptr >= 'A' && *nptr <= 'F')
-	    digval = *nptr - 'A' + 10;
-	  else
-	    break;
-	}
-      else
-        break;
-
-      if (result > ULONG_MAX / base
-	  || (result == ULONG_MAX / base && digval > ULONG_MAX % base))
-	{
-	  errno = ERANGE;
-	  if (endptr != NULL)
-	    *endptr = (char *) nptr;
-	  return ULONG_MAX;
-	}
-      result *= base;
-      result += digval;
-      ++nptr;
-    }
-
-  if (endptr != NULL)
-    *endptr = (char *) nptr;
-  return result * sign;
-}
-
-
-#undef _itoa
-/* We always use _itoa instead of _itoa_word in ld.so since the former
-   also has to be present and it is never about speed when these
-   functions are used.  */
-char *
-_itoa (unsigned long long int value, char *buflim, unsigned int base,
-       int upper_case)
-{
-  assert (! upper_case);
-
-  do
-    *--buflim = _itoa_lower_digits[value % base];
-  while ((value /= base) != 0);
-
-  return buflim;
-}
-
-/* The '_itoa_lower_digits' variable in libc.so is able to handle bases
-   up to 36.  We don't need this here.  */
-const char _itoa_lower_digits[16] = "0123456789abcdef";
-rtld_hidden_data_def (_itoa_lower_digits)
-
-/* The following is not a complete strsep implementation.  It cannot
-   handle empty delimiter strings.  But this isn't necessary for the
-   execution of ld.so.  */
-#undef strsep
-#undef __strsep
-char *
-__strsep (char **stringp, const char *delim)
-{
-  char *begin;
-
-  assert (delim[0] != '\0');
-
-  begin = *stringp;
-  if (begin != NULL)
-    {
-      char *end = begin;
-
-      while (*end != '\0' || (end = NULL))
-	{
-	  const char *dp = delim;
-
-	  do
-	    if (*dp == *end)
-	      break;
-	  while (*++dp != '\0');
-
-	  if (*dp != '\0')
-	    {
-	      *end++ = '\0';
-	      break;
-	    }
-
-	  ++end;
-	}
-
-      *stringp = end;
-    }
-
-  return begin;
-}
-weak_alias (__strsep, strsep)
-strong_alias (__strsep, __strsep_g)
diff --git a/elf/dl-misc.c b/elf/dl-misc.c
deleted file mode 100644
index c5d3e0e7c5..0000000000
--- a/elf/dl-misc.c
+++ /dev/null
@@ -1,362 +0,0 @@
-/* Miscellaneous support functions for dynamic linker
-   Copyright (C) 1997-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <fcntl.h>
-#include <ldsodefs.h>
-#include <limits.h>
-#include <link.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <sys/uio.h>
-#include <sysdep.h>
-#include <_itoa.h>
-#include <dl-writev.h>
-
-
-/* Read the whole contents of FILE into new mmap'd space with given
-   protections.  *SIZEP gets the size of the file.  On error MAP_FAILED
-   is returned.  */
-
-void *
-internal_function
-_dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
-{
-  void *result = MAP_FAILED;
-  struct stat64 st;
-  int fd = __open (file, O_RDONLY | O_CLOEXEC);
-  if (fd >= 0)
-    {
-      if (__fxstat64 (_STAT_VER, fd, &st) >= 0)
-	{
-	  *sizep = st.st_size;
-
-	  /* No need to map the file if it is empty.  */
-	  if (*sizep != 0)
-	    /* Map a copy of the file contents.  */
-	    result = __mmap (NULL, *sizep, prot,
-#ifdef MAP_COPY
-			     MAP_COPY
-#else
-			     MAP_PRIVATE
-#endif
-#ifdef MAP_FILE
-			     | MAP_FILE
-#endif
-			     , fd, 0);
-	}
-      __close (fd);
-    }
-  return result;
-}
-
-
-/* Bare-bones printf implementation.  This function only knows about
-   the formats and flags needed and can handle only up to 64 stripes in
-   the output.  */
-static void
-_dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg)
-{
-# define NIOVMAX 64
-  struct iovec iov[NIOVMAX];
-  int niov = 0;
-  pid_t pid = 0;
-  char pidbuf[12];
-
-  while (*fmt != '\0')
-    {
-      const char *startp = fmt;
-
-      if (tag_p > 0)
-	{
-	  /* Generate the tag line once.  It consists of the PID and a
-	     colon followed by a tab.  */
-	  if (pid == 0)
-	    {
-	      char *p;
-	      pid = __getpid ();
-	      assert (pid >= 0 && sizeof (pid_t) <= 4);
-	      p = _itoa (pid, &pidbuf[10], 10, 0);
-	      while (p > pidbuf)
-		*--p = ' ';
-	      pidbuf[10] = ':';
-	      pidbuf[11] = '\t';
-	    }
-
-	  /* Append to the output.  */
-	  assert (niov < NIOVMAX);
-	  iov[niov].iov_len = 12;
-	  iov[niov++].iov_base = pidbuf;
-
-	  /* No more tags until we see the next newline.  */
-	  tag_p = -1;
-	}
-
-      /* Skip everything except % and \n (if tags are needed).  */
-      while (*fmt != '\0' && *fmt != '%' && (! tag_p || *fmt != '\n'))
-	++fmt;
-
-      /* Append constant string.  */
-      assert (niov < NIOVMAX);
-      if ((iov[niov].iov_len = fmt - startp) != 0)
-	iov[niov++].iov_base = (char *) startp;
-
-      if (*fmt == '%')
-	{
-	  /* It is a format specifier.  */
-	  char fill = ' ';
-	  int width = -1;
-	  int prec = -1;
-#if LONG_MAX != INT_MAX
-	  int long_mod = 0;
-#endif
-
-	  /* Recognize zero-digit fill flag.  */
-	  if (*++fmt == '0')
-	    {
-	      fill = '0';
-	      ++fmt;
-	    }
-
-	  /* See whether with comes from a parameter.  Note that no other
-	     way to specify the width is implemented.  */
-	  if (*fmt == '*')
-	    {
-	      width = va_arg (arg, int);
-	      ++fmt;
-	    }
-
-	  /* Handle precision.  */
-	  if (*fmt == '.' && fmt[1] == '*')
-	    {
-	      prec = va_arg (arg, int);
-	      fmt += 2;
-	    }
-
-	  /* Recognize the l modifier.  It is only important on some
-	     platforms where long and int have a different size.  We
-	     can use the same code for size_t.  */
-	  if (*fmt == 'l' || *fmt == 'Z')
-	    {
-#if LONG_MAX != INT_MAX
-	      long_mod = 1;
-#endif
-	      ++fmt;
-	    }
-
-	  switch (*fmt)
-	    {
-	      /* Integer formatting.  */
-	    case 'u':
-	    case 'x':
-	      {
-		/* We have to make a difference if long and int have a
-		   different size.  */
-#if LONG_MAX != INT_MAX
-		unsigned long int num = (long_mod
-					 ? va_arg (arg, unsigned long int)
-					 : va_arg (arg, unsigned int));
-#else
-		unsigned long int num = va_arg (arg, unsigned int);
-#endif
-		/* We use alloca() to allocate the buffer with the most
-		   pessimistic guess for the size.  Using alloca() allows
-		   having more than one integer formatting in a call.  */
-		char *buf = (char *) alloca (3 * sizeof (unsigned long int));
-		char *endp = &buf[3 * sizeof (unsigned long int)];
-		char *cp = _itoa (num, endp, *fmt == 'x' ? 16 : 10, 0);
-
-		/* Pad to the width the user specified.  */
-		if (width != -1)
-		  while (endp - cp < width)
-		    *--cp = fill;
-
-		iov[niov].iov_base = cp;
-		iov[niov].iov_len = endp - cp;
-		++niov;
-	      }
-	      break;
-
-	    case 's':
-	      /* Get the string argument.  */
-	      iov[niov].iov_base = va_arg (arg, char *);
-	      iov[niov].iov_len = strlen (iov[niov].iov_base);
-	      if (prec != -1)
-		iov[niov].iov_len = MIN ((size_t) prec, iov[niov].iov_len);
-	      ++niov;
-	      break;
-
-	    case '%':
-	      iov[niov].iov_base = (void *) fmt;
-	      iov[niov].iov_len = 1;
-	      ++niov;
-	      break;
-
-	    default:
-	      assert (! "invalid format specifier");
-	    }
-	  ++fmt;
-	}
-      else if (*fmt == '\n')
-	{
-	  /* See whether we have to print a single newline character.  */
-	  if (fmt == startp)
-	    {
-	      iov[niov].iov_base = (char *) startp;
-	      iov[niov++].iov_len = 1;
-	    }
-	  else
-	    /* No, just add it to the rest of the string.  */
-	    ++iov[niov - 1].iov_len;
-
-	  /* Next line, print a tag again.  */
-	  tag_p = 1;
-	  ++fmt;
-	}
-    }
-
-  /* Finally write the result.  */
-  _dl_writev (fd, iov, niov);
-}
-
-
-/* Write to debug file.  */
-void
-_dl_debug_printf (const char *fmt, ...)
-{
-  va_list arg;
-
-  va_start (arg, fmt);
-  _dl_debug_vdprintf (GLRO(dl_debug_fd), 1, fmt, arg);
-  va_end (arg);
-}
-
-
-/* Write to debug file but don't start with a tag.  */
-void
-_dl_debug_printf_c (const char *fmt, ...)
-{
-  va_list arg;
-
-  va_start (arg, fmt);
-  _dl_debug_vdprintf (GLRO(dl_debug_fd), -1, fmt, arg);
-  va_end (arg);
-}
-
-
-/* Write the given file descriptor.  */
-void
-_dl_dprintf (int fd, const char *fmt, ...)
-{
-  va_list arg;
-
-  va_start (arg, fmt);
-  _dl_debug_vdprintf (fd, 0, fmt, arg);
-  va_end (arg);
-}
-
-
-/* Test whether given NAME matches any of the names of the given object.  */
-int
-internal_function
-_dl_name_match_p (const char *name, const struct link_map *map)
-{
-  if (strcmp (name, map->l_name) == 0)
-    return 1;
-
-  struct libname_list *runp = map->l_libname;
-
-  while (runp != NULL)
-    if (strcmp (name, runp->name) == 0)
-      return 1;
-    else
-      runp = runp->next;
-
-  return 0;
-}
-
-
-unsigned long int
-internal_function
-_dl_higher_prime_number (unsigned long int n)
-{
-  /* These are primes that are near, but slightly smaller than, a
-     power of two.  */
-  static const uint32_t primes[] = {
-    UINT32_C (7),
-    UINT32_C (13),
-    UINT32_C (31),
-    UINT32_C (61),
-    UINT32_C (127),
-    UINT32_C (251),
-    UINT32_C (509),
-    UINT32_C (1021),
-    UINT32_C (2039),
-    UINT32_C (4093),
-    UINT32_C (8191),
-    UINT32_C (16381),
-    UINT32_C (32749),
-    UINT32_C (65521),
-    UINT32_C (131071),
-    UINT32_C (262139),
-    UINT32_C (524287),
-    UINT32_C (1048573),
-    UINT32_C (2097143),
-    UINT32_C (4194301),
-    UINT32_C (8388593),
-    UINT32_C (16777213),
-    UINT32_C (33554393),
-    UINT32_C (67108859),
-    UINT32_C (134217689),
-    UINT32_C (268435399),
-    UINT32_C (536870909),
-    UINT32_C (1073741789),
-    UINT32_C (2147483647),
-				       /* 4294967291L */
-    UINT32_C (2147483647) + UINT32_C (2147483644)
-  };
-
-  const uint32_t *low = &primes[0];
-  const uint32_t *high = &primes[sizeof (primes) / sizeof (primes[0])];
-
-  while (low != high)
-    {
-      const uint32_t *mid = low + (high - low) / 2;
-      if (n > *mid)
-       low = mid + 1;
-      else
-       high = mid;
-    }
-
-#if 0
-  /* If we've run out of primes, abort.  */
-  if (n > *low)
-    {
-      fprintf (stderr, "Cannot find prime bigger than %lu\n", n);
-      abort ();
-    }
-#endif
-
-  return *low;
-}
diff --git a/elf/dl-object.c b/elf/dl-object.c
deleted file mode 100644
index 4c43235148..0000000000
--- a/elf/dl-object.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/* Storage management for the chain of loaded shared objects.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-
-#include <assert.h>
-
-
-/* Add the new link_map NEW to the end of the namespace list.  */
-void
-internal_function
-_dl_add_to_namespace_list (struct link_map *new, Lmid_t nsid)
-{
-  /* We modify the list of loaded objects.  */
-  __rtld_lock_lock_recursive (GL(dl_load_write_lock));
-
-  if (GL(dl_ns)[nsid]._ns_loaded != NULL)
-    {
-      struct link_map *l = GL(dl_ns)[nsid]._ns_loaded;
-      while (l->l_next != NULL)
-	l = l->l_next;
-      new->l_prev = l;
-      /* new->l_next = NULL;   Would be necessary but we use calloc.  */
-      l->l_next = new;
-    }
-  else
-    GL(dl_ns)[nsid]._ns_loaded = new;
-  ++GL(dl_ns)[nsid]._ns_nloaded;
-  new->l_serial = GL(dl_load_adds);
-  ++GL(dl_load_adds);
-
-  __rtld_lock_unlock_recursive (GL(dl_load_write_lock));
-}
-
-
-/* Allocate a `struct link_map' for a new object being loaded,
-   and enter it into the _dl_loaded list.  */
-struct link_map *
-internal_function
-_dl_new_object (char *realname, const char *libname, int type,
-		struct link_map *loader, int mode, Lmid_t nsid)
-{
-  size_t libname_len = strlen (libname) + 1;
-  struct link_map *new;
-  struct libname_list *newname;
-#ifdef SHARED
-  /* We create the map for the executable before we know whether we have
-     auditing libraries and if yes, how many.  Assume the worst.  */
-  unsigned int naudit = GLRO(dl_naudit) ?: ((mode & __RTLD_OPENEXEC)
-					    ? DL_NNS : 0);
-  size_t audit_space = naudit * sizeof (new->l_audit[0]);
-#else
-# define audit_space 0
-#endif
-
-  new = (struct link_map *) calloc (sizeof (*new) + audit_space
-				    + sizeof (struct link_map *)
-				    + sizeof (*newname) + libname_len, 1);
-  if (new == NULL)
-    return NULL;
-
-  new->l_real = new;
-  new->l_symbolic_searchlist.r_list = (struct link_map **) ((char *) (new + 1)
-							    + audit_space);
-
-  new->l_libname = newname
-    = (struct libname_list *) (new->l_symbolic_searchlist.r_list + 1);
-  newname->name = (char *) memcpy (newname + 1, libname, libname_len);
-  /* newname->next = NULL;	We use calloc therefore not necessary.  */
-  newname->dont_free = 1;
-
-  /* When we create the executable link map, or a VDSO link map, we start
-     with "" for the l_name. In these cases "" points to ld.so rodata
-     and won't get dumped during core file generation. Therefore to assist
-     gdb and to create more self-contained core files we adjust l_name to
-     point at the newly allocated copy (which will get dumped) instead of
-     the ld.so rodata copy.  */
-  new->l_name = *realname ? realname : (char *) newname->name + libname_len - 1;
-  new->l_type = type;
-  /* If we set the bit now since we know it is never used we avoid
-     dirtying the cache line later.  */
-  if ((GLRO(dl_debug_mask) & DL_DEBUG_UNUSED) == 0)
-    new->l_used = 1;
-  new->l_loader = loader;
-#if NO_TLS_OFFSET != 0
-  new->l_tls_offset = NO_TLS_OFFSET;
-#endif
-  new->l_ns = nsid;
-
-#ifdef SHARED
-  for (unsigned int cnt = 0; cnt < naudit; ++cnt)
-    {
-      new->l_audit[cnt].cookie = (uintptr_t) new;
-      /* new->l_audit[cnt].bindflags = 0; */
-    }
-#endif
-
-  /* new->l_global = 0;	We use calloc therefore not necessary.  */
-
-  /* Use the 'l_scope_mem' array by default for the 'l_scope'
-     information.  If we need more entries we will allocate a large
-     array dynamically.  */
-  new->l_scope = new->l_scope_mem;
-  new->l_scope_max = sizeof (new->l_scope_mem) / sizeof (new->l_scope_mem[0]);
-
-  /* Counter for the scopes we have to handle.  */
-  int idx = 0;
-
-  if (GL(dl_ns)[nsid]._ns_loaded != NULL)
-    /* Add the global scope.  */
-    new->l_scope[idx++] = &GL(dl_ns)[nsid]._ns_loaded->l_searchlist;
-
-  /* If we have no loader the new object acts as it.  */
-  if (loader == NULL)
-    loader = new;
-  else
-    /* Determine the local scope.  */
-    while (loader->l_loader != NULL)
-      loader = loader->l_loader;
-
-  /* Insert the scope if it isn't the global scope we already added.  */
-  if (idx == 0 || &loader->l_searchlist != new->l_scope[0])
-    {
-      if ((mode & RTLD_DEEPBIND) != 0 && idx != 0)
-	{
-	  new->l_scope[1] = new->l_scope[0];
-	  idx = 0;
-	}
-
-      new->l_scope[idx] = &loader->l_searchlist;
-    }
-
-  new->l_local_scope[0] = &new->l_searchlist;
-
-  /* Don't try to find the origin for the main map which has the name "".  */
-  if (realname[0] != '\0')
-    {
-      size_t realname_len = strlen (realname) + 1;
-      char *origin;
-      char *cp;
-
-      if (realname[0] == '/')
-	{
-	  /* It is an absolute path.  Use it.  But we have to make a
-	     copy since we strip out the trailing slash.  */
-	  cp = origin = (char *) malloc (realname_len);
-	  if (origin == NULL)
-	    {
-	      origin = (char *) -1;
-	      goto out;
-	    }
-	}
-      else
-	{
-	  size_t len = realname_len;
-	  char *result = NULL;
-
-	  /* Get the current directory name.  */
-	  origin = NULL;
-	  do
-	    {
-	      char *new_origin;
-
-	      len += 128;
-	      new_origin = (char *) realloc (origin, len);
-	      if (new_origin == NULL)
-		/* We exit the loop.  Note that result == NULL.  */
-		break;
-	      origin = new_origin;
-	    }
-	  while ((result = __getcwd (origin, len - realname_len)) == NULL
-		 && errno == ERANGE);
-
-	  if (result == NULL)
-	    {
-	      /* We were not able to determine the current directory.
-		 Note that free(origin) is OK if origin == NULL.  */
-	      free (origin);
-	      origin = (char *) -1;
-	      goto out;
-	    }
-
-	  /* Find the end of the path and see whether we have to add a
-	     slash.  We could use rawmemchr but this need not be
-	     fast.  */
-	  cp = (strchr) (origin, '\0');
-	  if (cp[-1] != '/')
-	    *cp++ = '/';
-	}
-
-      /* Add the real file name.  */
-      cp = __mempcpy (cp, realname, realname_len);
-
-      /* Now remove the filename and the slash.  Leave the slash if
-	 the name is something like "/foo".  */
-      do
-	--cp;
-      while (*cp != '/');
-
-      if (cp == origin)
-	/* Keep the only slash which is the first character.  */
-	++cp;
-      *cp = '\0';
-
-    out:
-      new->l_origin = origin;
-    }
-
-  return new;
-}
diff --git a/elf/dl-open.c b/elf/dl-open.c
deleted file mode 100644
index cec54db413..0000000000
--- a/elf/dl-open.c
+++ /dev/null
@@ -1,737 +0,0 @@
-/* Load a shared object at runtime, relocate it, and run its initializer.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <dlfcn.h>
-#include <errno.h>
-#include <libintl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/mman.h>		/* Check whether MAP_COPY is defined.  */
-#include <sys/param.h>
-#include <libc-lock.h>
-#include <ldsodefs.h>
-#include <caller.h>
-#include <sysdep-cancel.h>
-#include <tls.h>
-#include <stap-probe.h>
-#include <atomic.h>
-
-#include <dl-dst.h>
-
-
-extern int __libc_multiple_libcs;	/* Defined in init-first.c.  */
-
-/* We must be careful not to leave us in an inconsistent state.  Thus we
-   catch any error and re-raise it after cleaning up.  */
-
-struct dl_open_args
-{
-  const char *file;
-  int mode;
-  /* This is the caller of the dlopen() function.  */
-  const void *caller_dlopen;
-  /* This is the caller of _dl_open().  */
-  const void *caller_dl_open;
-  struct link_map *map;
-  /* Namespace ID.  */
-  Lmid_t nsid;
-  /* Original parameters to the program and the current environment.  */
-  int argc;
-  char **argv;
-  char **env;
-};
-
-
-static int
-add_to_global (struct link_map *new)
-{
-  struct link_map **new_global;
-  unsigned int to_add = 0;
-  unsigned int cnt;
-
-  /* Count the objects we have to put in the global scope.  */
-  for (cnt = 0; cnt < new->l_searchlist.r_nlist; ++cnt)
-    if (new->l_searchlist.r_list[cnt]->l_global == 0)
-      ++to_add;
-
-  /* The symbols of the new objects and its dependencies are to be
-     introduced into the global scope that will be used to resolve
-     references from other dynamically-loaded objects.
-
-     The global scope is the searchlist in the main link map.  We
-     extend this list if necessary.  There is one problem though:
-     since this structure was allocated very early (before the libc
-     is loaded) the memory it uses is allocated by the malloc()-stub
-     in the ld.so.  When we come here these functions are not used
-     anymore.  Instead the malloc() implementation of the libc is
-     used.  But this means the block from the main map cannot be used
-     in an realloc() call.  Therefore we allocate a completely new
-     array the first time we have to add something to the locale scope.  */
-
-  struct link_namespaces *ns = &GL(dl_ns)[new->l_ns];
-  if (ns->_ns_global_scope_alloc == 0)
-    {
-      /* This is the first dynamic object given global scope.  */
-      ns->_ns_global_scope_alloc
-	= ns->_ns_main_searchlist->r_nlist + to_add + 8;
-      new_global = (struct link_map **)
-	malloc (ns->_ns_global_scope_alloc * sizeof (struct link_map *));
-      if (new_global == NULL)
-	{
-	  ns->_ns_global_scope_alloc = 0;
-	nomem:
-	  _dl_signal_error (ENOMEM, new->l_libname->name, NULL,
-			    N_("cannot extend global scope"));
-	  return 1;
-	}
-
-      /* Copy over the old entries.  */
-      ns->_ns_main_searchlist->r_list
-	= memcpy (new_global, ns->_ns_main_searchlist->r_list,
-		  (ns->_ns_main_searchlist->r_nlist
-		   * sizeof (struct link_map *)));
-    }
-  else if (ns->_ns_main_searchlist->r_nlist + to_add
-	   > ns->_ns_global_scope_alloc)
-    {
-      /* We have to extend the existing array of link maps in the
-	 main map.  */
-      struct link_map **old_global
-	= GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list;
-      size_t new_nalloc = ((ns->_ns_global_scope_alloc + to_add) * 2);
-
-      new_global = (struct link_map **)
-	malloc (new_nalloc * sizeof (struct link_map *));
-      if (new_global == NULL)
-	goto nomem;
-
-      memcpy (new_global, old_global,
-	      ns->_ns_global_scope_alloc * sizeof (struct link_map *));
-
-      ns->_ns_global_scope_alloc = new_nalloc;
-      ns->_ns_main_searchlist->r_list = new_global;
-
-      if (!RTLD_SINGLE_THREAD_P)
-	THREAD_GSCOPE_WAIT ();
-
-      free (old_global);
-    }
-
-  /* Now add the new entries.  */
-  unsigned int new_nlist = ns->_ns_main_searchlist->r_nlist;
-  for (cnt = 0; cnt < new->l_searchlist.r_nlist; ++cnt)
-    {
-      struct link_map *map = new->l_searchlist.r_list[cnt];
-
-      if (map->l_global == 0)
-	{
-	  map->l_global = 1;
-	  ns->_ns_main_searchlist->r_list[new_nlist++] = map;
-
-	  /* We modify the global scope.  Report this.  */
-	  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES))
-	    _dl_debug_printf ("\nadd %s [%lu] to global scope\n",
-			      map->l_name, map->l_ns);
-	}
-    }
-  atomic_write_barrier ();
-  ns->_ns_main_searchlist->r_nlist = new_nlist;
-
-  return 0;
-}
-
-/* Search link maps in all namespaces for the DSO that contains the object at
-   address ADDR.  Returns the pointer to the link map of the matching DSO, or
-   NULL if a match is not found.  */
-struct link_map *
-internal_function
-_dl_find_dso_for_object (const ElfW(Addr) addr)
-{
-  struct link_map *l;
-
-  /* Find the highest-addressed object that ADDR is not below.  */
-  for (Lmid_t ns = 0; ns < GL(dl_nns); ++ns)
-    for (l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next)
-      if (addr >= l->l_map_start && addr < l->l_map_end
-	  && (l->l_contiguous
-	      || _dl_addr_inside_object (l, (ElfW(Addr)) addr)))
-	{
-	  assert (ns == l->l_ns);
-	  return l;
-	}
-  return NULL;
-}
-rtld_hidden_def (_dl_find_dso_for_object);
-
-static void
-dl_open_worker (void *a)
-{
-  struct dl_open_args *args = a;
-  const char *file = args->file;
-  int mode = args->mode;
-  struct link_map *call_map = NULL;
-
-  /* Check whether _dl_open() has been called from a valid DSO.  */
-  if (__check_caller (args->caller_dl_open,
-		      allow_libc|allow_libdl|allow_ldso) != 0)
-    _dl_signal_error (0, "dlopen", NULL, N_("invalid caller"));
-
-  /* Determine the caller's map if necessary.  This is needed in case
-     we have a DST, when we don't know the namespace ID we have to put
-     the new object in, or when the file name has no path in which
-     case we need to look along the RUNPATH/RPATH of the caller.  */
-  const char *dst = strchr (file, '$');
-  if (dst != NULL || args->nsid == __LM_ID_CALLER
-      || strchr (file, '/') == NULL)
-    {
-      const void *caller_dlopen = args->caller_dlopen;
-
-      /* We have to find out from which object the caller is calling.
-	 By default we assume this is the main application.  */
-      call_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
-
-      struct link_map *l = _dl_find_dso_for_object ((ElfW(Addr)) caller_dlopen);
-
-      if (l)
-	call_map = l;
-
-      if (args->nsid == __LM_ID_CALLER)
-	args->nsid = call_map->l_ns;
-    }
-
-  /* One might be tempted to assert that we are RT_CONSISTENT at this point, but that
-     may not be true if this is a recursive call to dlopen.  */
-  _dl_debug_initialize (0, args->nsid);
-
-  /* Load the named object.  */
-  struct link_map *new;
-  args->map = new = _dl_map_object (call_map, file, lt_loaded, 0,
-				    mode | __RTLD_CALLMAP, args->nsid);
-
-  /* If the pointer returned is NULL this means the RTLD_NOLOAD flag is
-     set and the object is not already loaded.  */
-  if (new == NULL)
-    {
-      assert (mode & RTLD_NOLOAD);
-      return;
-    }
-
-  /* Mark the object as not deletable if the RTLD_NODELETE flags was passed.
-     Do this early so that we don't skip marking the object if it was
-     already loaded.  */
-  if (__glibc_unlikely (mode & RTLD_NODELETE))
-    new->l_flags_1 |= DF_1_NODELETE;
-
-  if (__glibc_unlikely (mode & __RTLD_SPROF))
-    /* This happens only if we load a DSO for 'sprof'.  */
-    return;
-
-  /* This object is directly loaded.  */
-  ++new->l_direct_opencount;
-
-  /* It was already open.  */
-  if (__glibc_unlikely (new->l_searchlist.r_list != NULL))
-    {
-      /* Let the user know about the opencount.  */
-      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
-	_dl_debug_printf ("opening file=%s [%lu]; direct_opencount=%u\n\n",
-			  new->l_name, new->l_ns, new->l_direct_opencount);
-
-      /* If the user requested the object to be in the global namespace
-	 but it is not so far, add it now.  */
-      if ((mode & RTLD_GLOBAL) && new->l_global == 0)
-	(void) add_to_global (new);
-
-      assert (_dl_debug_initialize (0, args->nsid)->r_state == RT_CONSISTENT);
-
-      return;
-    }
-
-  /* Load that object's dependencies.  */
-  _dl_map_object_deps (new, NULL, 0, 0,
-		       mode & (__RTLD_DLOPEN | RTLD_DEEPBIND | __RTLD_AUDIT));
-
-  /* So far, so good.  Now check the versions.  */
-  for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i)
-    if (new->l_searchlist.r_list[i]->l_real->l_versions == NULL)
-      (void) _dl_check_map_versions (new->l_searchlist.r_list[i]->l_real,
-				     0, 0);
-
-#ifdef SHARED
-  /* Auditing checkpoint: we have added all objects.  */
-  if (__glibc_unlikely (GLRO(dl_naudit) > 0))
-    {
-      struct link_map *head = GL(dl_ns)[new->l_ns]._ns_loaded;
-      /* Do not call the functions for any auditing object.  */
-      if (head->l_auditing == 0)
-	{
-	  struct audit_ifaces *afct = GLRO(dl_audit);
-	  for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-	    {
-	      if (afct->activity != NULL)
-		afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT);
-
-	      afct = afct->next;
-	    }
-	}
-    }
-#endif
-
-  /* Notify the debugger all new objects are now ready to go.  */
-  struct r_debug *r = _dl_debug_initialize (0, args->nsid);
-  r->r_state = RT_CONSISTENT;
-  _dl_debug_state ();
-  LIBC_PROBE (map_complete, 3, args->nsid, r, new);
-
-  /* Print scope information.  */
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES))
-    _dl_show_scope (new, 0);
-
-  /* Only do lazy relocation if `LD_BIND_NOW' is not set.  */
-  int reloc_mode = mode & __RTLD_AUDIT;
-  if (GLRO(dl_lazy))
-    reloc_mode |= mode & RTLD_LAZY;
-
-  /* Sort the objects by dependency for the relocation process.  This
-     allows IFUNC relocations to work and it also means copy
-     relocation of dependencies are if necessary overwritten.  */
-  size_t nmaps = 0;
-  struct link_map *l = new;
-  do
-    {
-      if (! l->l_real->l_relocated)
-	++nmaps;
-      l = l->l_next;
-    }
-  while (l != NULL);
-  struct link_map *maps[nmaps];
-  nmaps = 0;
-  l = new;
-  do
-    {
-      if (! l->l_real->l_relocated)
-	maps[nmaps++] = l;
-      l = l->l_next;
-    }
-  while (l != NULL);
-  if (nmaps > 1)
-    {
-      uint16_t seen[nmaps];
-      memset (seen, '\0', sizeof (seen));
-      size_t i = 0;
-      while (1)
-	{
-	  ++seen[i];
-	  struct link_map *thisp = maps[i];
-
-	  /* Find the last object in the list for which the current one is
-	     a dependency and move the current object behind the object
-	     with the dependency.  */
-	  size_t k = nmaps - 1;
-	  while (k > i)
-	    {
-	      struct link_map **runp = maps[k]->l_initfini;
-	      if (runp != NULL)
-		/* Look through the dependencies of the object.  */
-		while (*runp != NULL)
-		  if (__glibc_unlikely (*runp++ == thisp))
-		    {
-		      /* Move the current object to the back past the last
-			 object with it as the dependency.  */
-		      memmove (&maps[i], &maps[i + 1],
-			       (k - i) * sizeof (maps[0]));
-		      maps[k] = thisp;
-
-		      if (seen[i + 1] > nmaps - i)
-			{
-			  ++i;
-			  goto next_clear;
-			}
-
-		      uint16_t this_seen = seen[i];
-		      memmove (&seen[i], &seen[i + 1],
-			       (k - i) * sizeof (seen[0]));
-		      seen[k] = this_seen;
-
-		      goto next;
-		    }
-
-	      --k;
-	    }
-
-	  if (++i == nmaps)
-	    break;
-	next_clear:
-	  memset (&seen[i], 0, (nmaps - i) * sizeof (seen[0]));
-	next:;
-	}
-    }
-
-  int relocation_in_progress = 0;
-
-  for (size_t i = nmaps; i-- > 0; )
-    {
-      l = maps[i];
-
-      if (! relocation_in_progress)
-	{
-	  /* Notify the debugger that relocations are about to happen.  */
-	  LIBC_PROBE (reloc_start, 2, args->nsid, r);
-	  relocation_in_progress = 1;
-	}
-
-#ifdef SHARED
-      if (__glibc_unlikely (GLRO(dl_profile) != NULL))
-	{
-	  /* If this here is the shared object which we want to profile
-	     make sure the profile is started.  We can find out whether
-	     this is necessary or not by observing the `_dl_profile_map'
-	     variable.  If it was NULL but is not NULL afterwards we must
-	     start the profiling.  */
-	  struct link_map *old_profile_map = GL(dl_profile_map);
-
-	  _dl_relocate_object (l, l->l_scope, reloc_mode | RTLD_LAZY, 1);
-
-	  if (old_profile_map == NULL && GL(dl_profile_map) != NULL)
-	    {
-	      /* We must prepare the profiling.  */
-	      _dl_start_profile ();
-
-	      /* Prevent unloading the object.  */
-	      GL(dl_profile_map)->l_flags_1 |= DF_1_NODELETE;
-	    }
-	}
-      else
-#endif
-	_dl_relocate_object (l, l->l_scope, reloc_mode, 0);
-    }
-
-  /* If the file is not loaded now as a dependency, add the search
-     list of the newly loaded object to the scope.  */
-  bool any_tls = false;
-  unsigned int first_static_tls = new->l_searchlist.r_nlist;
-  for (unsigned int i = 0; i < new->l_searchlist.r_nlist; ++i)
-    {
-      struct link_map *imap = new->l_searchlist.r_list[i];
-      int from_scope = 0;
-
-      /* If the initializer has been called already, the object has
-	 not been loaded here and now.  */
-      if (imap->l_init_called && imap->l_type == lt_loaded)
-	{
-	  struct r_scope_elem **runp = imap->l_scope;
-	  size_t cnt = 0;
-
-	  while (*runp != NULL)
-	    {
-	      if (*runp == &new->l_searchlist)
-		break;
-	      ++cnt;
-	      ++runp;
-	    }
-
-	  if (*runp != NULL)
-	    /* Avoid duplicates.  */
-	    continue;
-
-	  if (__glibc_unlikely (cnt + 1 >= imap->l_scope_max))
-	    {
-	      /* The 'r_scope' array is too small.  Allocate a new one
-		 dynamically.  */
-	      size_t new_size;
-	      struct r_scope_elem **newp;
-
-#define SCOPE_ELEMS(imap) \
-  (sizeof (imap->l_scope_mem) / sizeof (imap->l_scope_mem[0]))
-
-	      if (imap->l_scope != imap->l_scope_mem
-		  && imap->l_scope_max < SCOPE_ELEMS (imap))
-		{
-		  new_size = SCOPE_ELEMS (imap);
-		  newp = imap->l_scope_mem;
-		}
-	      else
-		{
-		  new_size = imap->l_scope_max * 2;
-		  newp = (struct r_scope_elem **)
-		    malloc (new_size * sizeof (struct r_scope_elem *));
-		  if (newp == NULL)
-		    _dl_signal_error (ENOMEM, "dlopen", NULL,
-				      N_("cannot create scope list"));
-		}
-
-	      memcpy (newp, imap->l_scope, cnt * sizeof (imap->l_scope[0]));
-	      struct r_scope_elem **old = imap->l_scope;
-
-	      imap->l_scope = newp;
-
-	      if (old != imap->l_scope_mem)
-		_dl_scope_free (old);
-
-	      imap->l_scope_max = new_size;
-	    }
-
-	  /* First terminate the extended list.  Otherwise a thread
-	     might use the new last element and then use the garbage
-	     at offset IDX+1.  */
-	  imap->l_scope[cnt + 1] = NULL;
-	  atomic_write_barrier ();
-	  imap->l_scope[cnt] = &new->l_searchlist;
-
-	  /* Print only new scope information.  */
-	  from_scope = cnt;
-	}
-      /* Only add TLS memory if this object is loaded now and
-	 therefore is not yet initialized.  */
-      else if (! imap->l_init_called
-	       /* Only if the module defines thread local data.  */
-	       && __builtin_expect (imap->l_tls_blocksize > 0, 0))
-	{
-	  /* Now that we know the object is loaded successfully add
-	     modules containing TLS data to the slot info table.  We
-	     might have to increase its size.  */
-	  _dl_add_to_slotinfo (imap);
-
-	  if (imap->l_need_tls_init
-	      && first_static_tls == new->l_searchlist.r_nlist)
-	    first_static_tls = i;
-
-	  /* We have to bump the generation counter.  */
-	  any_tls = true;
-	}
-
-      /* Print scope information.  */
-      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES))
-	_dl_show_scope (imap, from_scope);
-    }
-
-  /* Bump the generation number if necessary.  */
-  if (any_tls && __builtin_expect (++GL(dl_tls_generation) == 0, 0))
-    _dl_fatal_printf (N_("\
-TLS generation counter wrapped!  Please report this."));
-
-  /* We need a second pass for static tls data, because _dl_update_slotinfo
-     must not be run while calls to _dl_add_to_slotinfo are still pending.  */
-  for (unsigned int i = first_static_tls; i < new->l_searchlist.r_nlist; ++i)
-    {
-      struct link_map *imap = new->l_searchlist.r_list[i];
-
-      if (imap->l_need_tls_init
-	  && ! imap->l_init_called
-	  && imap->l_tls_blocksize > 0)
-	{
-	  /* For static TLS we have to allocate the memory here and
-	     now, but we can delay updating the DTV.  */
-	  imap->l_need_tls_init = 0;
-#ifdef SHARED
-	  /* Update the slot information data for at least the
-	     generation of the DSO we are allocating data for.  */
-	  _dl_update_slotinfo (imap->l_tls_modid);
-#endif
-
-	  GL(dl_init_static_tls) (imap);
-	  assert (imap->l_need_tls_init == 0);
-	}
-    }
-
-  /* Notify the debugger all new objects have been relocated.  */
-  if (relocation_in_progress)
-    LIBC_PROBE (reloc_complete, 3, args->nsid, r, new);
-
-#ifndef SHARED
-  DL_STATIC_INIT (new);
-#endif
-
-  /* Run the initializer functions of new objects.  */
-  _dl_init (new, args->argc, args->argv, args->env);
-
-  /* Now we can make the new map available in the global scope.  */
-  if (mode & RTLD_GLOBAL)
-    /* Move the object in the global namespace.  */
-    if (add_to_global (new) != 0)
-      /* It failed.  */
-      return;
-
-#ifndef SHARED
-  /* We must be the static _dl_open in libc.a.  A static program that
-     has loaded a dynamic object now has competition.  */
-  __libc_multiple_libcs = 1;
-#endif
-
-  /* Let the user know about the opencount.  */
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
-    _dl_debug_printf ("opening file=%s [%lu]; direct_opencount=%u\n\n",
-		      new->l_name, new->l_ns, new->l_direct_opencount);
-}
-
-
-void *
-_dl_open (const char *file, int mode, const void *caller_dlopen, Lmid_t nsid,
-	  int argc, char *argv[], char *env[])
-{
-  if ((mode & RTLD_BINDING_MASK) == 0)
-    /* One of the flags must be set.  */
-    _dl_signal_error (EINVAL, file, NULL, N_("invalid mode for dlopen()"));
-
-  /* Make sure we are alone.  */
-  __rtld_lock_lock_recursive (GL(dl_load_lock));
-
-  if (__glibc_unlikely (nsid == LM_ID_NEWLM))
-    {
-      /* Find a new namespace.  */
-      for (nsid = 1; DL_NNS > 1 && nsid < GL(dl_nns); ++nsid)
-	if (GL(dl_ns)[nsid]._ns_loaded == NULL)
-	  break;
-
-      if (__glibc_unlikely (nsid == DL_NNS))
-	{
-	  /* No more namespace available.  */
-	  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-
-	  _dl_signal_error (EINVAL, file, NULL, N_("\
-no more namespaces available for dlmopen()"));
-	}
-      else if (nsid == GL(dl_nns))
-	{
-	  __rtld_lock_initialize (GL(dl_ns)[nsid]._ns_unique_sym_table.lock);
-	  ++GL(dl_nns);
-	}
-
-      _dl_debug_initialize (0, nsid)->r_state = RT_CONSISTENT;
-    }
-  /* Never allow loading a DSO in a namespace which is empty.  Such
-     direct placements is only causing problems.  Also don't allow
-     loading into a namespace used for auditing.  */
-  else if (__glibc_unlikely (nsid != LM_ID_BASE && nsid != __LM_ID_CALLER)
-	   && (__glibc_unlikely (nsid < 0 || nsid >= GL(dl_nns))
-	       /* This prevents the [NSID] index expressions from being
-		  evaluated, so the compiler won't think that we are
-		  accessing an invalid index here in the !SHARED case where
-		  DL_NNS is 1 and so any NSID != 0 is invalid.  */
-	       || DL_NNS == 1
-	       || GL(dl_ns)[nsid]._ns_nloaded == 0
-	       || GL(dl_ns)[nsid]._ns_loaded->l_auditing))
-    _dl_signal_error (EINVAL, file, NULL,
-		      N_("invalid target namespace in dlmopen()"));
-
-  struct dl_open_args args;
-  args.file = file;
-  args.mode = mode;
-  args.caller_dlopen = caller_dlopen;
-  args.caller_dl_open = RETURN_ADDRESS (0);
-  args.map = NULL;
-  args.nsid = nsid;
-  args.argc = argc;
-  args.argv = argv;
-  args.env = env;
-
-  const char *objname;
-  const char *errstring;
-  bool malloced;
-  int errcode = _dl_catch_error (&objname, &errstring, &malloced,
-				 dl_open_worker, &args);
-
-#if defined USE_LDCONFIG && !defined MAP_COPY
-  /* We must unmap the cache file.  */
-  _dl_unload_cache ();
-#endif
-
-  /* See if an error occurred during loading.  */
-  if (__glibc_unlikely (errstring != NULL))
-    {
-      /* Remove the object from memory.  It may be in an inconsistent
-	 state if relocation failed, for example.  */
-      if (args.map)
-	{
-	  /* Maybe some of the modules which were loaded use TLS.
-	     Since it will be removed in the following _dl_close call
-	     we have to mark the dtv array as having gaps to fill the
-	     holes.  This is a pessimistic assumption which won't hurt
-	     if not true.  There is no need to do this when we are
-	     loading the auditing DSOs since TLS has not yet been set
-	     up.  */
-	  if ((mode & __RTLD_AUDIT) == 0)
-	    GL(dl_tls_dtv_gaps) = true;
-
-	  _dl_close_worker (args.map, true);
-	}
-
-      assert (_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT);
-
-      /* Release the lock.  */
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
-
-      /* Make a local copy of the error string so that we can release the
-	 memory allocated for it.  */
-      size_t len_errstring = strlen (errstring) + 1;
-      char *local_errstring;
-      if (objname == errstring + len_errstring)
-	{
-	  size_t total_len = len_errstring + strlen (objname) + 1;
-	  local_errstring = alloca (total_len);
-	  memcpy (local_errstring, errstring, total_len);
-	  objname = local_errstring + len_errstring;
-	}
-      else
-	{
-	  local_errstring = alloca (len_errstring);
-	  memcpy (local_errstring, errstring, len_errstring);
-	}
-
-      if (malloced)
-	free ((char *) errstring);
-
-      /* Reraise the error.  */
-      _dl_signal_error (errcode, objname, NULL, local_errstring);
-    }
-
-  assert (_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT);
-
-  /* Release the lock.  */
-  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-
-  return args.map;
-}
-
-
-void
-_dl_show_scope (struct link_map *l, int from)
-{
-  _dl_debug_printf ("object=%s [%lu]\n",
-		    DSO_FILENAME (l->l_name), l->l_ns);
-  if (l->l_scope != NULL)
-    for (int scope_cnt = from; l->l_scope[scope_cnt] != NULL; ++scope_cnt)
-      {
-	_dl_debug_printf (" scope %u:", scope_cnt);
-
-	for (unsigned int cnt = 0; cnt < l->l_scope[scope_cnt]->r_nlist; ++cnt)
-	  if (*l->l_scope[scope_cnt]->r_list[cnt]->l_name)
-	    _dl_debug_printf_c (" %s",
-				l->l_scope[scope_cnt]->r_list[cnt]->l_name);
-	  else
-	    _dl_debug_printf_c (" %s", RTLD_PROGNAME);
-
-	_dl_debug_printf_c ("\n");
-      }
-  else
-    _dl_debug_printf (" no scope\n");
-  _dl_debug_printf ("\n");
-}
diff --git a/elf/dl-origin.c b/elf/dl-origin.c
deleted file mode 100644
index 1e44272a8e..0000000000
--- a/elf/dl-origin.c
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Find path of executable.
-   Copyright (C) 1998-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdlib.h>
-#include <string.h>
-#include <sys/param.h>
-#include <ldsodefs.h>
-
-#include <dl-dst.h>
-
-
-const char *
-_dl_get_origin (void)
-{
-  char *result = (char *) -1;
-  /* We use the environment variable LD_ORIGIN_PATH.  If it is set make
-     a copy and strip out trailing slashes.  */
-  if (GLRO(dl_origin_path) != NULL)
-    {
-      size_t len = strlen (GLRO(dl_origin_path));
-      result = (char *) malloc (len + 1);
-      if (result == NULL)
-	result = (char *) -1;
-      else
-	{
-	  char *cp = __mempcpy (result, GLRO(dl_origin_path), len);
-	  while (cp > result + 1 && cp[-1] == '/')
-	    --cp;
-	  *cp = '\0';
-	}
-    }
-
-  return result;
-}
diff --git a/elf/dl-profile.c b/elf/dl-profile.c
deleted file mode 100644
index a4f11089a1..0000000000
--- a/elf/dl-profile.c
+++ /dev/null
@@ -1,596 +0,0 @@
-/* Profiling of shared libraries.
-   Copyright (C) 1997-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-   Based on the BSD mcount implementation.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <ldsodefs.h>
-#include <sys/gmon.h>
-#include <sys/gmon_out.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <atomic.h>
-
-/* The LD_PROFILE feature has to be implemented different to the
-   normal profiling using the gmon/ functions.  The problem is that an
-   arbitrary amount of processes simulataneously can be run using
-   profiling and all write the results in the same file.  To provide
-   this mechanism one could implement a complicated mechanism to merge
-   the content of two profiling runs or one could extend the file
-   format to allow more than one data set.  For the second solution we
-   would have the problem that the file can grow in size beyond any
-   limit and both solutions have the problem that the concurrency of
-   writing the results is a big problem.
-
-   Another much simpler method is to use mmap to map the same file in
-   all using programs and modify the data in the mmap'ed area and so
-   also automatically on the disk.  Using the MAP_SHARED option of
-   mmap(2) this can be done without big problems in more than one
-   file.
-
-   This approach is very different from the normal profiling.  We have
-   to use the profiling data in exactly the way they are expected to
-   be written to disk.  But the normal format used by gprof is not usable
-   to do this.  It is optimized for size.  It writes the tags as single
-   bytes but this means that the following 32/64 bit values are
-   unaligned.
-
-   Therefore we use a new format.  This will look like this
-
-					0  1  2  3	<- byte is 32 bit word
-	0000				g  m  o  n
-	0004				*version*	<- GMON_SHOBJ_VERSION
-	0008				00 00 00 00
-	000c				00 00 00 00
-	0010				00 00 00 00
-
-	0014				*tag*		<- GMON_TAG_TIME_HIST
-	0018				?? ?? ?? ??
-					?? ?? ?? ??	<- 32/64 bit LowPC
-	0018+A				?? ?? ?? ??
-					?? ?? ?? ??	<- 32/64 bit HighPC
-	0018+2*A			*histsize*
-	001c+2*A			*profrate*
-	0020+2*A			s  e  c  o
-	0024+2*A			n  d  s  \0
-	0028+2*A			\0 \0 \0 \0
-	002c+2*A			\0 \0 \0
-	002f+2*A			s
-
-	0030+2*A			?? ?? ?? ??	<- Count data
-	...				...
-	0030+2*A+K			?? ?? ?? ??
-
-	0030+2*A+K			*tag*		<- GMON_TAG_CG_ARC
-	0034+2*A+K			*lastused*
-	0038+2*A+K			?? ?? ?? ??
-					?? ?? ?? ??	<- FromPC#1
-	0038+3*A+K			?? ?? ?? ??
-					?? ?? ?? ??	<- ToPC#1
-	0038+4*A+K			?? ?? ?? ??	<- Count#1
-	...				...		   ...
-	0038+(2*(CN-1)+2)*A+(CN-1)*4+K	?? ?? ?? ??
-					?? ?? ?? ??	<- FromPC#CGN
-	0038+(2*(CN-1)+3)*A+(CN-1)*4+K	?? ?? ?? ??
-					?? ?? ?? ??	<- ToPC#CGN
-	0038+(2*CN+2)*A+(CN-1)*4+K	?? ?? ?? ??	<- Count#CGN
-
-   We put (for now?) no basic block information in the file since this would
-   introduce rase conditions among all the processes who want to write them.
-
-   `K' is the number of count entries which is computed as
-
- 		textsize / HISTFRACTION
-
-   `CG' in the above table is the number of call graph arcs.  Normally,
-   the table is sparse and the profiling code writes out only the those
-   entries which are really used in the program run.  But since we must
-   not extend this table (the profiling file) we'll keep them all here.
-   So CN can be executed in advance as
-
-		MINARCS <= textsize*(ARCDENSITY/100) <= MAXARCS
-
-   Now the remaining question is: how to build the data structures we can
-   work with from this data.  We need the from set and must associate the
-   froms with all the associated tos.  We will do this by constructing this
-   data structures at the program start.  To do this we'll simply visit all
-   entries in the call graph table and add it to the appropriate list.  */
-
-extern int __profile_frequency (void);
-libc_hidden_proto (__profile_frequency)
-
-/* We define a special type to address the elements of the arc table.
-   This is basically the `gmon_cg_arc_record' format but it includes
-   the room for the tag and it uses real types.  */
-struct here_cg_arc_record
-  {
-    uintptr_t from_pc;
-    uintptr_t self_pc;
-    /* The count field is atomically incremented in _dl_mcount, which
-       requires it to be properly aligned for its type, and for this
-       alignment to be visible to the compiler.  The amount of data
-       before an array of this structure is calculated as
-       expected_size in _dl_start_profile.  Everything in that
-       calculation is a multiple of 4 bytes (in the case of
-       kcountsize, because it is derived from a subtraction of
-       page-aligned values, and the corresponding calculation in
-       __monstartup also ensures it is at least a multiple of the size
-       of u_long), so all copies of this field do in fact have the
-       appropriate alignment.  */
-    uint32_t count __attribute__ ((aligned (__alignof__ (uint32_t))));
-  } __attribute__ ((packed));
-
-static struct here_cg_arc_record *data;
-
-/* Nonzero if profiling is under way.  */
-static int running;
-
-/* This is the number of entry which have been incorporated in the toset.  */
-static uint32_t narcs;
-/* This is a pointer to the object representing the number of entries
-   currently in the mmaped file.  At no point of time this has to be the
-   same as NARCS.  If it is equal all entries from the file are in our
-   lists.  */
-static volatile uint32_t *narcsp;
-
-
-struct here_fromstruct
-  {
-    struct here_cg_arc_record volatile *here;
-    uint16_t link;
-  };
-
-static volatile uint16_t *tos;
-
-static struct here_fromstruct *froms;
-static uint32_t fromlimit;
-static volatile uint32_t fromidx;
-
-static uintptr_t lowpc;
-static size_t textsize;
-static unsigned int log_hashfraction;
-
-
-
-/* Set up profiling data to profile object desribed by MAP.  The output
-   file is found (or created) in OUTPUT_DIR.  */
-void
-internal_function
-_dl_start_profile (void)
-{
-  char *filename;
-  int fd;
-  struct stat64 st;
-  const ElfW(Phdr) *ph;
-  ElfW(Addr) mapstart = ~((ElfW(Addr)) 0);
-  ElfW(Addr) mapend = 0;
-  char *hist, *cp;
-  size_t idx;
-  size_t tossize;
-  size_t fromssize;
-  uintptr_t highpc;
-  uint16_t *kcount;
-  size_t kcountsize;
-  struct gmon_hdr *addr = NULL;
-  off_t expected_size;
-  /* See profil(2) where this is described.  */
-  int s_scale;
-#define SCALE_1_TO_1	0x10000L
-  const char *errstr = NULL;
-
-  /* Compute the size of the sections which contain program code.  */
-  for (ph = GL(dl_profile_map)->l_phdr;
-       ph < &GL(dl_profile_map)->l_phdr[GL(dl_profile_map)->l_phnum]; ++ph)
-    if (ph->p_type == PT_LOAD && (ph->p_flags & PF_X))
-      {
-	ElfW(Addr) start = (ph->p_vaddr & ~(GLRO(dl_pagesize) - 1));
-	ElfW(Addr) end = ((ph->p_vaddr + ph->p_memsz + GLRO(dl_pagesize) - 1)
-			  & ~(GLRO(dl_pagesize) - 1));
-
-	if (start < mapstart)
-	  mapstart = start;
-	if (end > mapend)
-	  mapend = end;
-      }
-
-  /* Now we can compute the size of the profiling data.  This is done
-     with the same formulars as in `monstartup' (see gmon.c).  */
-  running = 0;
-  lowpc = ROUNDDOWN (mapstart + GL(dl_profile_map)->l_addr,
-		     HISTFRACTION * sizeof (HISTCOUNTER));
-  highpc = ROUNDUP (mapend + GL(dl_profile_map)->l_addr,
-		    HISTFRACTION * sizeof (HISTCOUNTER));
-  textsize = highpc - lowpc;
-  kcountsize = textsize / HISTFRACTION;
-  if ((HASHFRACTION & (HASHFRACTION - 1)) == 0)
-    {
-      /* If HASHFRACTION is a power of two, mcount can use shifting
-	 instead of integer division.  Precompute shift amount.
-
-	 This is a constant but the compiler cannot compile the
-	 expression away since the __ffs implementation is not known
-	 to the compiler.  Help the compiler by precomputing the
-	 usual cases.  */
-      assert (HASHFRACTION == 2);
-
-      if (sizeof (*froms) == 8)
-	log_hashfraction = 4;
-      else if (sizeof (*froms) == 16)
-	log_hashfraction = 5;
-      else
-	log_hashfraction = __ffs (HASHFRACTION * sizeof (*froms)) - 1;
-    }
-  else
-    log_hashfraction = -1;
-  tossize = textsize / HASHFRACTION;
-  fromlimit = textsize * ARCDENSITY / 100;
-  if (fromlimit < MINARCS)
-    fromlimit = MINARCS;
-  if (fromlimit > MAXARCS)
-    fromlimit = MAXARCS;
-  fromssize = fromlimit * sizeof (struct here_fromstruct);
-
-  expected_size = (sizeof (struct gmon_hdr)
-		   + 4 + sizeof (struct gmon_hist_hdr) + kcountsize
-		   + 4 + 4 + fromssize * sizeof (struct here_cg_arc_record));
-
-  /* Create the gmon_hdr we expect or write.  */
-  struct real_gmon_hdr
-  {
-    char cookie[4];
-    int32_t version;
-    char spare[3 * 4];
-  } gmon_hdr;
-  if (sizeof (gmon_hdr) != sizeof (struct gmon_hdr)
-      || (offsetof (struct real_gmon_hdr, cookie)
-	  != offsetof (struct gmon_hdr, cookie))
-      || (offsetof (struct real_gmon_hdr, version)
-	  != offsetof (struct gmon_hdr, version)))
-    abort ();
-
-  memcpy (&gmon_hdr.cookie[0], GMON_MAGIC, sizeof (gmon_hdr.cookie));
-  gmon_hdr.version = GMON_SHOBJ_VERSION;
-  memset (gmon_hdr.spare, '\0', sizeof (gmon_hdr.spare));
-
-  /* Create the hist_hdr we expect or write.  */
-  struct real_gmon_hist_hdr
-  {
-    char *low_pc;
-    char *high_pc;
-    int32_t hist_size;
-    int32_t prof_rate;
-    char dimen[15];
-    char dimen_abbrev;
-  } hist_hdr;
-  if (sizeof (hist_hdr) != sizeof (struct gmon_hist_hdr)
-      || (offsetof (struct real_gmon_hist_hdr, low_pc)
-	  != offsetof (struct gmon_hist_hdr, low_pc))
-      || (offsetof (struct real_gmon_hist_hdr, high_pc)
-	  != offsetof (struct gmon_hist_hdr, high_pc))
-      || (offsetof (struct real_gmon_hist_hdr, hist_size)
-	  != offsetof (struct gmon_hist_hdr, hist_size))
-      || (offsetof (struct real_gmon_hist_hdr, prof_rate)
-	  != offsetof (struct gmon_hist_hdr, prof_rate))
-      || (offsetof (struct real_gmon_hist_hdr, dimen)
-	  != offsetof (struct gmon_hist_hdr, dimen))
-      || (offsetof (struct real_gmon_hist_hdr, dimen_abbrev)
-	  != offsetof (struct gmon_hist_hdr, dimen_abbrev)))
-    abort ();
-
-  hist_hdr.low_pc = (char *) mapstart;
-  hist_hdr.high_pc = (char *) mapend;
-  hist_hdr.hist_size = kcountsize / sizeof (HISTCOUNTER);
-  hist_hdr.prof_rate = __profile_frequency ();
-  if (sizeof (hist_hdr.dimen) >= sizeof ("seconds"))
-    {
-      memcpy (hist_hdr.dimen, "seconds", sizeof ("seconds"));
-      memset (hist_hdr.dimen + sizeof ("seconds"), '\0',
-	      sizeof (hist_hdr.dimen) - sizeof ("seconds"));
-    }
-  else
-    strncpy (hist_hdr.dimen, "seconds", sizeof (hist_hdr.dimen));
-  hist_hdr.dimen_abbrev = 's';
-
-  /* First determine the output name.  We write in the directory
-     OUTPUT_DIR and the name is composed from the shared objects
-     soname (or the file name) and the ending ".profile".  */
-  filename = (char *) alloca (strlen (GLRO(dl_profile_output)) + 1
-			      + strlen (GLRO(dl_profile)) + sizeof ".profile");
-  cp = __stpcpy (filename, GLRO(dl_profile_output));
-  *cp++ = '/';
-  __stpcpy (__stpcpy (cp, GLRO(dl_profile)), ".profile");
-
-  fd = __open (filename, O_RDWR | O_CREAT | O_NOFOLLOW, DEFFILEMODE);
-  if (fd == -1)
-    {
-      char buf[400];
-      int errnum;
-
-      /* We cannot write the profiling data so don't do anything.  */
-      errstr = "%s: cannot open file: %s\n";
-    print_error:
-      errnum = errno;
-      if (fd != -1)
-	__close (fd);
-      _dl_error_printf (errstr, filename,
-			__strerror_r (errnum, buf, sizeof buf));
-      return;
-    }
-
-  if (__fxstat64 (_STAT_VER, fd, &st) < 0 || !S_ISREG (st.st_mode))
-    {
-      /* Not stat'able or not a regular file => don't use it.  */
-      errstr = "%s: cannot stat file: %s\n";
-      goto print_error;
-    }
-
-  /* Test the size.  If it does not match what we expect from the size
-     values in the map MAP we don't use it and warn the user.  */
-  if (st.st_size == 0)
-    {
-      /* We have to create the file.  */
-      char buf[GLRO(dl_pagesize)];
-
-      memset (buf, '\0', GLRO(dl_pagesize));
-
-      if (__lseek (fd, expected_size & ~(GLRO(dl_pagesize) - 1), SEEK_SET) == -1)
-	{
-	cannot_create:
-	  errstr = "%s: cannot create file: %s\n";
-	  goto print_error;
-	}
-
-      if (TEMP_FAILURE_RETRY (__libc_write (fd, buf, (expected_size
-						      & (GLRO(dl_pagesize)
-							 - 1))))
-	  < 0)
-	goto cannot_create;
-    }
-  else if (st.st_size != expected_size)
-    {
-      __close (fd);
-    wrong_format:
-
-      if (addr != NULL)
-	__munmap ((void *) addr, expected_size);
-
-      _dl_error_printf ("%s: file is no correct profile data file for `%s'\n",
-			filename, GLRO(dl_profile));
-      return;
-    }
-
-  addr = (struct gmon_hdr *) __mmap (NULL, expected_size, PROT_READ|PROT_WRITE,
-				     MAP_SHARED|MAP_FILE, fd, 0);
-  if (addr == (struct gmon_hdr *) MAP_FAILED)
-    {
-      errstr = "%s: cannot map file: %s\n";
-      goto print_error;
-    }
-
-  /* We don't need the file descriptor anymore.  */
-  __close (fd);
-
-  /* Pointer to data after the header.  */
-  hist = (char *) (addr + 1);
-  kcount = (uint16_t *) ((char *) hist + sizeof (uint32_t)
-			 + sizeof (struct gmon_hist_hdr));
-
-  /* Compute pointer to array of the arc information.  */
-  narcsp = (uint32_t *) ((char *) kcount + kcountsize + sizeof (uint32_t));
-  data = (struct here_cg_arc_record *) ((char *) narcsp + sizeof (uint32_t));
-
-  if (st.st_size == 0)
-    {
-      /* Create the signature.  */
-      memcpy (addr, &gmon_hdr, sizeof (struct gmon_hdr));
-
-      *(uint32_t *) hist = GMON_TAG_TIME_HIST;
-      memcpy (hist + sizeof (uint32_t), &hist_hdr,
-	      sizeof (struct gmon_hist_hdr));
-
-      narcsp[-1] = GMON_TAG_CG_ARC;
-    }
-  else
-    {
-      /* Test the signature in the file.  */
-      if (memcmp (addr, &gmon_hdr, sizeof (struct gmon_hdr)) != 0
-	  || *(uint32_t *) hist != GMON_TAG_TIME_HIST
-	  || memcmp (hist + sizeof (uint32_t), &hist_hdr,
-		     sizeof (struct gmon_hist_hdr)) != 0
-	  || narcsp[-1] != GMON_TAG_CG_ARC)
-	goto wrong_format;
-    }
-
-  /* Allocate memory for the froms data and the pointer to the tos records.  */
-  tos = (uint16_t *) calloc (tossize + fromssize, 1);
-  if (tos == NULL)
-    {
-      __munmap ((void *) addr, expected_size);
-      _dl_fatal_printf ("Out of memory while initializing profiler\n");
-      /* NOTREACHED */
-    }
-
-  froms = (struct here_fromstruct *) ((char *) tos + tossize);
-  fromidx = 0;
-
-  /* Now we have to process all the arc count entries.  BTW: it is
-     not critical whether the *NARCSP value changes meanwhile.  Before
-     we enter a new entry in to toset we will check that everything is
-     available in TOS.  This happens in _dl_mcount.
-
-     Loading the entries in reverse order should help to get the most
-     frequently used entries at the front of the list.  */
-  for (idx = narcs = MIN (*narcsp, fromlimit); idx > 0; )
-    {
-      size_t to_index;
-      size_t newfromidx;
-      --idx;
-      to_index = (data[idx].self_pc / (HASHFRACTION * sizeof (*tos)));
-      newfromidx = fromidx++;
-      froms[newfromidx].here = &data[idx];
-      froms[newfromidx].link = tos[to_index];
-      tos[to_index] = newfromidx;
-    }
-
-  /* Setup counting data.  */
-  if (kcountsize < highpc - lowpc)
-    {
-#if 0
-      s_scale = ((double) kcountsize / (highpc - lowpc)) * SCALE_1_TO_1;
-#else
-      size_t range = highpc - lowpc;
-      size_t quot = range / kcountsize;
-
-      if (quot >= SCALE_1_TO_1)
-	s_scale = 1;
-      else if (quot >= SCALE_1_TO_1 / 256)
-	s_scale = SCALE_1_TO_1 / quot;
-      else if (range > ULONG_MAX / 256)
-	s_scale = (SCALE_1_TO_1 * 256) / (range / (kcountsize / 256));
-      else
-	s_scale = (SCALE_1_TO_1 * 256) / ((range * 256) / kcountsize);
-#endif
-    }
-  else
-    s_scale = SCALE_1_TO_1;
-
-  /* Start the profiler.  */
-  __profil ((void *) kcount, kcountsize, lowpc, s_scale);
-
-  /* Turn on profiling.  */
-  running = 1;
-}
-
-
-void
-_dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc)
-{
-  volatile uint16_t *topcindex;
-  size_t i, fromindex;
-  struct here_fromstruct *fromp;
-
-  if (! running)
-    return;
-
-  /* Compute relative addresses.  The shared object can be loaded at
-     any address.  The value of frompc could be anything.  We cannot
-     restrict it in any way, just set to a fixed value (0) in case it
-     is outside the allowed range.  These calls show up as calls from
-     <external> in the gprof output.  */
-  frompc -= lowpc;
-  if (frompc >= textsize)
-    frompc = 0;
-  selfpc -= lowpc;
-  if (selfpc >= textsize)
-    goto done;
-
-  /* Getting here we now have to find out whether the location was
-     already used.  If yes we are lucky and only have to increment a
-     counter (this also has to be atomic).  If the entry is new things
-     are getting complicated...  */
-
-  /* Avoid integer divide if possible.  */
-  if ((HASHFRACTION & (HASHFRACTION - 1)) == 0)
-    i = selfpc >> log_hashfraction;
-  else
-    i = selfpc / (HASHFRACTION * sizeof (*tos));
-
-  topcindex = &tos[i];
-  fromindex = *topcindex;
-
-  if (fromindex == 0)
-    goto check_new_or_add;
-
-  fromp = &froms[fromindex];
-
-  /* We have to look through the chain of arcs whether there is already
-     an entry for our arc.  */
-  while (fromp->here->from_pc != frompc)
-    {
-      if (fromp->link != 0)
-	do
-	  fromp = &froms[fromp->link];
-	while (fromp->link != 0 && fromp->here->from_pc != frompc);
-
-      if (fromp->here->from_pc != frompc)
-	{
-	  topcindex = &fromp->link;
-
-	check_new_or_add:
-	  /* Our entry is not among the entries we read so far from the
-	     data file.  Now see whether we have to update the list.  */
-	  while (narcs != *narcsp && narcs < fromlimit)
-	    {
-	      size_t to_index;
-	      size_t newfromidx;
-	      to_index = (data[narcs].self_pc
-			  / (HASHFRACTION * sizeof (*tos)));
-	      newfromidx = catomic_exchange_and_add (&fromidx, 1) + 1;
-	      froms[newfromidx].here = &data[narcs];
-	      froms[newfromidx].link = tos[to_index];
-	      tos[to_index] = newfromidx;
-	      catomic_increment (&narcs);
-	    }
-
-	  /* If we still have no entry stop searching and insert.  */
-	  if (*topcindex == 0)
-	    {
-	      uint_fast32_t newarc = catomic_exchange_and_add (narcsp, 1);
-
-	      /* In rare cases it could happen that all entries in FROMS are
-		 occupied.  So we cannot count this anymore.  */
-	      if (newarc >= fromlimit)
-		goto done;
-
-	      *topcindex = catomic_exchange_and_add (&fromidx, 1) + 1;
-	      fromp = &froms[*topcindex];
-
-	      fromp->here = &data[newarc];
-	      data[newarc].from_pc = frompc;
-	      data[newarc].self_pc = selfpc;
-	      data[newarc].count = 0;
-	      fromp->link = 0;
-	      catomic_increment (&narcs);
-
-	      break;
-	    }
-
-	  fromp = &froms[*topcindex];
-	}
-      else
-	/* Found in.  */
-	break;
-    }
-
-  /* Increment the counter.  */
-  catomic_increment (&fromp->here->count);
-
- done:
-  ;
-}
-rtld_hidden_def (_dl_mcount)
diff --git a/elf/dl-profstub.c b/elf/dl-profstub.c
deleted file mode 100644
index 0915e29093..0000000000
--- a/elf/dl-profstub.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Helper definitions for profiling of shared libraries.
-   Copyright (C) 1998-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <elf.h>
-#include <ldsodefs.h>
-
-/* This is the map for the shared object we profile.  It is defined here
-   only because we test for this value being NULL or not.  */
-
-
-void
-_dl_mcount_wrapper (void *selfpc)
-{
-  GLRO(dl_mcount) ((ElfW(Addr)) RETURN_ADDRESS (0), (ElfW(Addr)) selfpc);
-}
-
-
-void
-_dl_mcount_wrapper_check (void *selfpc)
-{
-  if (GL(dl_profile_map) != NULL)
-    GLRO(dl_mcount) ((ElfW(Addr)) RETURN_ADDRESS (0), (ElfW(Addr)) selfpc);
-}
-libc_hidden_def (_dl_mcount_wrapper_check)
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
deleted file mode 100644
index b3c3a9bbf9..0000000000
--- a/elf/dl-reloc.c
+++ /dev/null
@@ -1,363 +0,0 @@
-/* Relocate a shared object and resolve its references to other loaded objects.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <libintl.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <ldsodefs.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/types.h>
-#include <_itoa.h>
-#include <libc-pointer-arith.h>
-#include "dynamic-link.h"
-
-/* Statistics function.  */
-#ifdef SHARED
-# define bump_num_cache_relocations() ++GL(dl_num_cache_relocations)
-#else
-# define bump_num_cache_relocations() ((void) 0)
-#endif
-
-
-/* We are trying to perform a static TLS relocation in MAP, but it was
-   dynamically loaded.  This can only work if there is enough surplus in
-   the static TLS area already allocated for each running thread.  If this
-   object's TLS segment is too big to fit, we fail.  If it fits,
-   we set MAP->l_tls_offset and return.
-   This function intentionally does not return any value but signals error
-   directly, as static TLS should be rare and code handling it should
-   not be inlined as much as possible.  */
-int
-internal_function
-_dl_try_allocate_static_tls (struct link_map *map)
-{
-  /* If we've already used the variable with dynamic access, or if the
-     alignment requirements are too high, fail.  */
-  if (map->l_tls_offset == FORCED_DYNAMIC_TLS_OFFSET
-      || map->l_tls_align > GL(dl_tls_static_align))
-    {
-    fail:
-      return -1;
-    }
-
-#if TLS_TCB_AT_TP
-  size_t freebytes = GL(dl_tls_static_size) - GL(dl_tls_static_used);
-  if (freebytes < TLS_TCB_SIZE)
-    goto fail;
-  freebytes -= TLS_TCB_SIZE;
-
-  size_t blsize = map->l_tls_blocksize + map->l_tls_firstbyte_offset;
-  if (freebytes < blsize)
-    goto fail;
-
-  size_t n = (freebytes - blsize) / map->l_tls_align;
-
-  size_t offset = GL(dl_tls_static_used) + (freebytes - n * map->l_tls_align
-					    - map->l_tls_firstbyte_offset);
-
-  map->l_tls_offset = GL(dl_tls_static_used) = offset;
-#elif TLS_DTV_AT_TP
-  /* dl_tls_static_used includes the TCB at the beginning.  */
-  size_t offset = (ALIGN_UP(GL(dl_tls_static_used)
-			    - map->l_tls_firstbyte_offset,
-			    map->l_tls_align)
-		   + map->l_tls_firstbyte_offset);
-  size_t used = offset + map->l_tls_blocksize;
-
-  if (used > GL(dl_tls_static_size))
-    goto fail;
-
-  map->l_tls_offset = offset;
-  map->l_tls_firstbyte_offset = GL(dl_tls_static_used);
-  GL(dl_tls_static_used) = used;
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
-
-  /* If the object is not yet relocated we cannot initialize the
-     static TLS region.  Delay it.  */
-  if (map->l_real->l_relocated)
-    {
-#ifdef SHARED
-      if (__builtin_expect (THREAD_DTV()[0].counter != GL(dl_tls_generation),
-			    0))
-	/* Update the slot information data for at least the generation of
-	   the DSO we are allocating data for.  */
-	(void) _dl_update_slotinfo (map->l_tls_modid);
-#endif
-
-      GL(dl_init_static_tls) (map);
-    }
-  else
-    map->l_need_tls_init = 1;
-
-  return 0;
-}
-
-void
-internal_function __attribute_noinline__
-_dl_allocate_static_tls (struct link_map *map)
-{
-  if (map->l_tls_offset == FORCED_DYNAMIC_TLS_OFFSET
-      || _dl_try_allocate_static_tls (map))
-    {
-      _dl_signal_error (0, map->l_name, NULL, N_("\
-cannot allocate memory in static TLS block"));
-    }
-}
-
-/* Initialize static TLS area and DTV for current (only) thread.
-   libpthread implementations should provide their own hook
-   to handle all threads.  */
-void
-_dl_nothread_init_static_tls (struct link_map *map)
-{
-#if TLS_TCB_AT_TP
-  void *dest = (char *) THREAD_SELF - map->l_tls_offset;
-#elif TLS_DTV_AT_TP
-  void *dest = (char *) THREAD_SELF + map->l_tls_offset + TLS_PRE_TCB_SIZE;
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
-
-  /* Initialize the memory.  */
-  memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
-	  '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
-}
-
-
-void
-_dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
-		     int reloc_mode, int consider_profiling)
-{
-  struct textrels
-  {
-    caddr_t start;
-    size_t len;
-    int prot;
-    struct textrels *next;
-  } *textrels = NULL;
-  /* Initialize it to make the compiler happy.  */
-  const char *errstring = NULL;
-  int lazy = reloc_mode & RTLD_LAZY;
-  int skip_ifunc = reloc_mode & __RTLD_NOIFUNC;
-
-#ifdef SHARED
-  /* If we are auditing, install the same handlers we need for profiling.  */
-  if ((reloc_mode & __RTLD_AUDIT) == 0)
-    consider_profiling |= GLRO(dl_audit) != NULL;
-#elif defined PROF
-  /* Never use dynamic linker profiling for gprof profiling code.  */
-# define consider_profiling 0
-#endif
-
-  if (l->l_relocated)
-    return;
-
-  /* If DT_BIND_NOW is set relocate all references in this object.  We
-     do not do this if we are profiling, of course.  */
-  // XXX Correct for auditing?
-  if (!consider_profiling
-      && __builtin_expect (l->l_info[DT_BIND_NOW] != NULL, 0))
-    lazy = 0;
-
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_RELOC))
-    _dl_debug_printf ("\nrelocation processing: %s%s\n",
-		      DSO_FILENAME (l->l_name), lazy ? " (lazy)" : "");
-
-  /* DT_TEXTREL is now in level 2 and might phase out at some time.
-     But we rewrite the DT_FLAGS entry to a DT_TEXTREL entry to make
-     testing easier and therefore it will be available at all time.  */
-  if (__glibc_unlikely (l->l_info[DT_TEXTREL] != NULL))
-    {
-      /* Bletch.  We must make read-only segments writable
-	 long enough to relocate them.  */
-      const ElfW(Phdr) *ph;
-      for (ph = l->l_phdr; ph < &l->l_phdr[l->l_phnum]; ++ph)
-	if (ph->p_type == PT_LOAD && (ph->p_flags & PF_W) == 0)
-	  {
-	    struct textrels *newp;
-
-	    newp = (struct textrels *) alloca (sizeof (*newp));
-	    newp->len = ALIGN_UP (ph->p_vaddr + ph->p_memsz, GLRO(dl_pagesize))
-			- ALIGN_DOWN (ph->p_vaddr, GLRO(dl_pagesize));
-	    newp->start = PTR_ALIGN_DOWN (ph->p_vaddr, GLRO(dl_pagesize))
-			  + (caddr_t) l->l_addr;
-
-	    if (__mprotect (newp->start, newp->len, PROT_READ|PROT_WRITE) < 0)
-	      {
-		errstring = N_("cannot make segment writable for relocation");
-	      call_error:
-		_dl_signal_error (errno, l->l_name, NULL, errstring);
-	      }
-
-#if (PF_R | PF_W | PF_X) == 7 && (PROT_READ | PROT_WRITE | PROT_EXEC) == 7
-	    newp->prot = (PF_TO_PROT
-			  >> ((ph->p_flags & (PF_R | PF_W | PF_X)) * 4)) & 0xf;
-#else
-	    newp->prot = 0;
-	    if (ph->p_flags & PF_R)
-	      newp->prot |= PROT_READ;
-	    if (ph->p_flags & PF_W)
-	      newp->prot |= PROT_WRITE;
-	    if (ph->p_flags & PF_X)
-	      newp->prot |= PROT_EXEC;
-#endif
-	    newp->next = textrels;
-	    textrels = newp;
-	  }
-    }
-
-  {
-    /* Do the actual relocation of the object's GOT and other data.  */
-
-    /* String table object symbols.  */
-    const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
-
-    /* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code.  */
-#define RESOLVE_MAP(ref, version, r_type) \
-    ((ELFW(ST_BIND) ((*ref)->st_info) != STB_LOCAL			      \
-      && __glibc_likely (!dl_symbol_visibility_binds_local_p (*ref)))	      \
-     ? ((__builtin_expect ((*ref) == l->l_lookup_cache.sym, 0)		      \
-	 && elf_machine_type_class (r_type) == l->l_lookup_cache.type_class)  \
-	? (bump_num_cache_relocations (),				      \
-	   (*ref) = l->l_lookup_cache.ret,				      \
-	   l->l_lookup_cache.value)					      \
-	: ({ lookup_t _lr;						      \
-	     int _tc = elf_machine_type_class (r_type);			      \
-	     l->l_lookup_cache.type_class = _tc;			      \
-	     l->l_lookup_cache.sym = (*ref);				      \
-	     const struct r_found_version *v = NULL;			      \
-	     if ((version) != NULL && (version)->hash != 0)		      \
-	       v = (version);						      \
-	     _lr = _dl_lookup_symbol_x (strtab + (*ref)->st_name, l, (ref),   \
-					scope, v, _tc,			      \
-					DL_LOOKUP_ADD_DEPENDENCY, NULL);      \
-	     l->l_lookup_cache.ret = (*ref);				      \
-	     l->l_lookup_cache.value = _lr; }))				      \
-     : l)
-
-#include "dynamic-link.h"
-
-    ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling, skip_ifunc);
-
-#ifndef PROF
-    if (__glibc_unlikely (consider_profiling)
-	&& l->l_info[DT_PLTRELSZ] != NULL)
-      {
-	/* Allocate the array which will contain the already found
-	   relocations.  If the shared object lacks a PLT (for example
-	   if it only contains lead function) the l_info[DT_PLTRELSZ]
-	   will be NULL.  */
-	size_t sizeofrel = l->l_info[DT_PLTREL]->d_un.d_val == DT_RELA
-			   ? sizeof (ElfW(Rela))
-			   : sizeof (ElfW(Rel));
-	size_t relcount = l->l_info[DT_PLTRELSZ]->d_un.d_val / sizeofrel;
-	l->l_reloc_result = calloc (sizeof (l->l_reloc_result[0]), relcount);
-
-	if (l->l_reloc_result == NULL)
-	  {
-	    errstring = N_("\
-%s: out of memory to store relocation results for %s\n");
-	    _dl_fatal_printf (errstring, RTLD_PROGNAME, l->l_name);
-	  }
-      }
-#endif
-  }
-
-  /* Mark the object so we know this work has been done.  */
-  l->l_relocated = 1;
-
-  /* Undo the segment protection changes.  */
-  while (__builtin_expect (textrels != NULL, 0))
-    {
-      if (__mprotect (textrels->start, textrels->len, textrels->prot) < 0)
-	{
-	  errstring = N_("cannot restore segment prot after reloc");
-	  goto call_error;
-	}
-
-#ifdef CLEAR_CACHE
-      CLEAR_CACHE (textrels->start, textrels->start + textrels->len);
-#endif
-
-      textrels = textrels->next;
-    }
-
-  /* In case we can protect the data now that the relocations are
-     done, do it.  */
-  if (l->l_relro_size != 0)
-    _dl_protect_relro (l);
-}
-
-
-void internal_function
-_dl_protect_relro (struct link_map *l)
-{
-  ElfW(Addr) start = ALIGN_DOWN((l->l_addr
-				 + l->l_relro_addr),
-				GLRO(dl_pagesize));
-  ElfW(Addr) end = ALIGN_DOWN((l->l_addr
-			       + l->l_relro_addr
-			       + l->l_relro_size),
-			      GLRO(dl_pagesize));
-  if (start != end
-      && __mprotect ((void *) start, end - start, PROT_READ) < 0)
-    {
-      static const char errstring[] = N_("\
-cannot apply additional memory protection after relocation");
-      _dl_signal_error (errno, l->l_name, NULL, errstring);
-    }
-}
-
-void
-internal_function __attribute_noinline__
-_dl_reloc_bad_type (struct link_map *map, unsigned int type, int plt)
-{
-#define DIGIT(b)	_itoa_lower_digits[(b) & 0xf];
-
-  /* XXX We cannot translate these messages.  */
-  static const char msg[2][32
-#if __ELF_NATIVE_CLASS == 64
-			   + 6
-#endif
-  ] = { "unexpected reloc type 0x",
-	"unexpected PLT reloc type 0x" };
-  char msgbuf[sizeof (msg[0])];
-  char *cp;
-
-  cp = __stpcpy (msgbuf, msg[plt]);
-#if __ELF_NATIVE_CLASS == 64
-  if (__builtin_expect(type > 0xff, 0))
-    {
-      *cp++ = DIGIT (type >> 28);
-      *cp++ = DIGIT (type >> 24);
-      *cp++ = DIGIT (type >> 20);
-      *cp++ = DIGIT (type >> 16);
-      *cp++ = DIGIT (type >> 12);
-      *cp++ = DIGIT (type >> 8);
-    }
-#endif
-  *cp++ = DIGIT (type >> 4);
-  *cp++ = DIGIT (type);
-  *cp = '\0';
-
-  _dl_signal_error (0, map->l_name, NULL, msgbuf);
-}
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
deleted file mode 100644
index 7d1d240403..0000000000
--- a/elf/dl-runtime.c
+++ /dev/null
@@ -1,480 +0,0 @@
-/* On-demand PLT fixup for shared objects.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#define IN_DL_RUNTIME 1		/* This can be tested in dl-machine.h.  */
-
-#include <alloca.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <ldsodefs.h>
-#include <sysdep-cancel.h>
-#include "dynamic-link.h"
-#include <tls.h>
-#include <dl-irel.h>
-
-
-#if (!ELF_MACHINE_NO_RELA && !defined ELF_MACHINE_PLT_REL) \
-    || ELF_MACHINE_NO_REL
-# define PLTREL  ElfW(Rela)
-#else
-# define PLTREL  ElfW(Rel)
-#endif
-
-/* The fixup functions might have need special attributes.  If none
-   are provided define the macro as empty.  */
-#ifndef ARCH_FIXUP_ATTRIBUTE
-# define ARCH_FIXUP_ATTRIBUTE
-#endif
-
-#ifndef reloc_offset
-# define reloc_offset reloc_arg
-# define reloc_index  reloc_arg / sizeof (PLTREL)
-#endif
-
-
-
-/* This function is called through a special trampoline from the PLT the
-   first time each PLT entry is called.  We must perform the relocation
-   specified in the PLT of the given shared object, and return the resolved
-   function address to the trampoline, which will restart the original call
-   to that address.  Future calls will bounce directly from the PLT to the
-   function.  */
-
-DL_FIXUP_VALUE_TYPE
-attribute_hidden __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE
-_dl_fixup (
-# ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
-	   ELF_MACHINE_RUNTIME_FIXUP_ARGS,
-# endif
-	   struct link_map *l, ElfW(Word) reloc_arg)
-{
-  const ElfW(Sym) *const symtab
-    = (const void *) D_PTR (l, l_info[DT_SYMTAB]);
-  const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
-
-  const PLTREL *const reloc
-    = (const void *) (D_PTR (l, l_info[DT_JMPREL]) + reloc_offset);
-  const ElfW(Sym) *sym = &symtab[ELFW(R_SYM) (reloc->r_info)];
-  void *const rel_addr = (void *)(l->l_addr + reloc->r_offset);
-  lookup_t result;
-  DL_FIXUP_VALUE_TYPE value;
-
-  /* Sanity check that we're really looking at a PLT relocation.  */
-  assert (ELFW(R_TYPE)(reloc->r_info) == ELF_MACHINE_JMP_SLOT);
-
-   /* Look up the target symbol.  If the normal lookup rules are not
-      used don't look in the global scope.  */
-  if (__builtin_expect (ELFW(ST_VISIBILITY) (sym->st_other), 0) == 0)
-    {
-      const struct r_found_version *version = NULL;
-
-      if (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
-	{
-	  const ElfW(Half) *vernum =
-	    (const void *) D_PTR (l, l_info[VERSYMIDX (DT_VERSYM)]);
-	  ElfW(Half) ndx = vernum[ELFW(R_SYM) (reloc->r_info)] & 0x7fff;
-	  version = &l->l_versions[ndx];
-	  if (version->hash == 0)
-	    version = NULL;
-	}
-
-      /* We need to keep the scope around so do some locking.  This is
-	 not necessary for objects which cannot be unloaded or when
-	 we are not using any threads (yet).  */
-      int flags = DL_LOOKUP_ADD_DEPENDENCY;
-      if (!RTLD_SINGLE_THREAD_P)
-	{
-	  THREAD_GSCOPE_SET_FLAG ();
-	  flags |= DL_LOOKUP_GSCOPE_LOCK;
-	}
-
-#ifdef RTLD_ENABLE_FOREIGN_CALL
-      RTLD_ENABLE_FOREIGN_CALL;
-#endif
-
-      result = _dl_lookup_symbol_x (strtab + sym->st_name, l, &sym, l->l_scope,
-				    version, ELF_RTYPE_CLASS_PLT, flags, NULL);
-
-      /* We are done with the global scope.  */
-      if (!RTLD_SINGLE_THREAD_P)
-	THREAD_GSCOPE_RESET_FLAG ();
-
-#ifdef RTLD_FINALIZE_FOREIGN_CALL
-      RTLD_FINALIZE_FOREIGN_CALL;
-#endif
-
-      /* Currently result contains the base load address (or link map)
-	 of the object that defines sym.  Now add in the symbol
-	 offset.  */
-      value = DL_FIXUP_MAKE_VALUE (result,
-				   sym ? (LOOKUP_VALUE_ADDRESS (result)
-					  + sym->st_value) : 0);
-    }
-  else
-    {
-      /* We already found the symbol.  The module (and therefore its load
-	 address) is also known.  */
-      value = DL_FIXUP_MAKE_VALUE (l, l->l_addr + sym->st_value);
-      result = l;
-    }
-
-  /* And now perhaps the relocation addend.  */
-  value = elf_machine_plt_value (l, reloc, value);
-
-  if (sym != NULL
-      && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0))
-    value = elf_ifunc_invoke (DL_FIXUP_VALUE_ADDR (value));
-
-  /* Finally, fix up the plt itself.  */
-  if (__glibc_unlikely (GLRO(dl_bind_not)))
-    return value;
-
-  return elf_machine_fixup_plt (l, result, reloc, rel_addr, value);
-}
-
-#ifndef PROF
-DL_FIXUP_VALUE_TYPE
-__attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE
-_dl_profile_fixup (
-#ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
-		   ELF_MACHINE_RUNTIME_FIXUP_ARGS,
-#endif
-		   struct link_map *l, ElfW(Word) reloc_arg,
-		   ElfW(Addr) retaddr, void *regs, long int *framesizep)
-{
-  void (*mcount_fct) (ElfW(Addr), ElfW(Addr)) = _dl_mcount;
-
-  if (l->l_reloc_result == NULL)
-    {
-      /* BZ #14843: ELF_DYNAMIC_RELOCATE is called before l_reloc_result
-	 is allocated.  We will get here if ELF_DYNAMIC_RELOCATE calls a
-	 resolver function to resolve an IRELATIVE relocation and that
-	 resolver calls a function that is not yet resolved (lazy).  For
-	 example, the resolver in x86-64 libm.so calls __get_cpu_features
-	 defined in libc.so.  Skip audit and resolve the external function
-	 in this case.  */
-      *framesizep = -1;
-      return _dl_fixup (
-# ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
-#  ifndef ELF_MACHINE_RUNTIME_FIXUP_PARAMS
-#   error Please define ELF_MACHINE_RUNTIME_FIXUP_PARAMS.
-#  endif
-			ELF_MACHINE_RUNTIME_FIXUP_PARAMS,
-# endif
-			l, reloc_arg);
-    }
-
-  /* This is the address in the array where we store the result of previous
-     relocations.  */
-  struct reloc_result *reloc_result = &l->l_reloc_result[reloc_index];
-  DL_FIXUP_VALUE_TYPE *resultp = &reloc_result->addr;
-
-  DL_FIXUP_VALUE_TYPE value = *resultp;
-  if (DL_FIXUP_VALUE_CODE_ADDR (value) == 0)
-    {
-      /* This is the first time we have to relocate this object.  */
-      const ElfW(Sym) *const symtab
-	= (const void *) D_PTR (l, l_info[DT_SYMTAB]);
-      const char *strtab = (const char *) D_PTR (l, l_info[DT_STRTAB]);
-
-      const PLTREL *const reloc
-	= (const void *) (D_PTR (l, l_info[DT_JMPREL]) + reloc_offset);
-      const ElfW(Sym) *refsym = &symtab[ELFW(R_SYM) (reloc->r_info)];
-      const ElfW(Sym) *defsym = refsym;
-      lookup_t result;
-
-      /* Sanity check that we're really looking at a PLT relocation.  */
-      assert (ELFW(R_TYPE)(reloc->r_info) == ELF_MACHINE_JMP_SLOT);
-
-      /* Look up the target symbol.  If the symbol is marked STV_PROTECTED
-	 don't look in the global scope.  */
-      if (__builtin_expect (ELFW(ST_VISIBILITY) (refsym->st_other), 0) == 0)
-	{
-	  const struct r_found_version *version = NULL;
-
-	  if (l->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
-	    {
-	      const ElfW(Half) *vernum =
-		(const void *) D_PTR (l, l_info[VERSYMIDX (DT_VERSYM)]);
-	      ElfW(Half) ndx = vernum[ELFW(R_SYM) (reloc->r_info)] & 0x7fff;
-	      version = &l->l_versions[ndx];
-	      if (version->hash == 0)
-		version = NULL;
-	    }
-
-	  /* We need to keep the scope around so do some locking.  This is
-	     not necessary for objects which cannot be unloaded or when
-	     we are not using any threads (yet).  */
-	  int flags = DL_LOOKUP_ADD_DEPENDENCY;
-	  if (!RTLD_SINGLE_THREAD_P)
-	    {
-	      THREAD_GSCOPE_SET_FLAG ();
-	      flags |= DL_LOOKUP_GSCOPE_LOCK;
-	    }
-
-	  result = _dl_lookup_symbol_x (strtab + refsym->st_name, l,
-					&defsym, l->l_scope, version,
-					ELF_RTYPE_CLASS_PLT, flags, NULL);
-
-	  /* We are done with the global scope.  */
-	  if (!RTLD_SINGLE_THREAD_P)
-	    THREAD_GSCOPE_RESET_FLAG ();
-
-	  /* Currently result contains the base load address (or link map)
-	     of the object that defines sym.  Now add in the symbol
-	     offset.  */
-	  value = DL_FIXUP_MAKE_VALUE (result,
-				       defsym != NULL
-				       ? LOOKUP_VALUE_ADDRESS (result)
-					 + defsym->st_value : 0);
-
-	  if (defsym != NULL
-	      && __builtin_expect (ELFW(ST_TYPE) (defsym->st_info)
-				   == STT_GNU_IFUNC, 0))
-	    value = elf_ifunc_invoke (DL_FIXUP_VALUE_ADDR (value));
-	}
-      else
-	{
-	  /* We already found the symbol.  The module (and therefore its load
-	     address) is also known.  */
-	  value = DL_FIXUP_MAKE_VALUE (l, l->l_addr + refsym->st_value);
-
-	  if (__builtin_expect (ELFW(ST_TYPE) (refsym->st_info)
-				== STT_GNU_IFUNC, 0))
-	    value = elf_ifunc_invoke (DL_FIXUP_VALUE_ADDR (value));
-
-	  result = l;
-	}
-      /* And now perhaps the relocation addend.  */
-      value = elf_machine_plt_value (l, reloc, value);
-
-#ifdef SHARED
-      /* Auditing checkpoint: we have a new binding.  Provide the
-	 auditing libraries the possibility to change the value and
-	 tell us whether further auditing is wanted.  */
-      if (defsym != NULL && GLRO(dl_naudit) > 0)
-	{
-	  reloc_result->bound = result;
-	  /* Compute index of the symbol entry in the symbol table of
-	     the DSO with the definition.  */
-	  reloc_result->boundndx = (defsym
-				    - (ElfW(Sym) *) D_PTR (result,
-							   l_info[DT_SYMTAB]));
-
-	  /* Determine whether any of the two participating DSOs is
-	     interested in auditing.  */
-	  if ((l->l_audit_any_plt | result->l_audit_any_plt) != 0)
-	    {
-	      unsigned int flags = 0;
-	      struct audit_ifaces *afct = GLRO(dl_audit);
-	      /* Synthesize a symbol record where the st_value field is
-		 the result.  */
-	      ElfW(Sym) sym = *defsym;
-	      sym.st_value = DL_FIXUP_VALUE_ADDR (value);
-
-	      /* Keep track whether there is any interest in tracing
-		 the call in the lower two bits.  */
-	      assert (DL_NNS * 2 <= sizeof (reloc_result->flags) * 8);
-	      assert ((LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT) == 3);
-	      reloc_result->enterexit = LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT;
-
-	      const char *strtab2 = (const void *) D_PTR (result,
-							  l_info[DT_STRTAB]);
-
-	      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-		{
-		  /* XXX Check whether both DSOs must request action or
-		     only one */
-		  if ((l->l_audit[cnt].bindflags & LA_FLG_BINDFROM) != 0
-		      && (result->l_audit[cnt].bindflags & LA_FLG_BINDTO) != 0)
-		    {
-		      if (afct->symbind != NULL)
-			{
-			  uintptr_t new_value
-			    = afct->symbind (&sym, reloc_result->boundndx,
-					     &l->l_audit[cnt].cookie,
-					     &result->l_audit[cnt].cookie,
-					     &flags,
-					     strtab2 + defsym->st_name);
-			  if (new_value != (uintptr_t) sym.st_value)
-			    {
-			      flags |= LA_SYMB_ALTVALUE;
-			      sym.st_value = new_value;
-			    }
-			}
-
-		      /* Remember the results for every audit library and
-			 store a summary in the first two bits.  */
-		      reloc_result->enterexit
-			&= flags & (LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT);
-		      reloc_result->enterexit
-			|= ((flags & (LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT))
-			    << ((cnt + 1) * 2));
-		    }
-		  else
-		    /* If the bind flags say this auditor is not interested,
-		       set the bits manually.  */
-		    reloc_result->enterexit
-		      |= ((LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT)
-			  << ((cnt + 1) * 2));
-
-		  afct = afct->next;
-		}
-
-	      reloc_result->flags = flags;
-	      value = DL_FIXUP_ADDR_VALUE (sym.st_value);
-	    }
-	  else
-	    /* Set all bits since this symbol binding is not interesting.  */
-	    reloc_result->enterexit = (1u << DL_NNS) - 1;
-	}
-#endif
-
-      /* Store the result for later runs.  */
-      if (__glibc_likely (! GLRO(dl_bind_not)))
-	*resultp = value;
-    }
-
-  /* By default we do not call the pltexit function.  */
-  long int framesize = -1;
-
-#ifdef SHARED
-  /* Auditing checkpoint: report the PLT entering and allow the
-     auditors to change the value.  */
-  if (DL_FIXUP_VALUE_CODE_ADDR (value) != 0 && GLRO(dl_naudit) > 0
-      /* Don't do anything if no auditor wants to intercept this call.  */
-      && (reloc_result->enterexit & LA_SYMB_NOPLTENTER) == 0)
-    {
-      ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound,
-						l_info[DT_SYMTAB])
-			   + reloc_result->boundndx);
-
-      /* Set up the sym parameter.  */
-      ElfW(Sym) sym = *defsym;
-      sym.st_value = DL_FIXUP_VALUE_ADDR (value);
-
-      /* Get the symbol name.  */
-      const char *strtab = (const void *) D_PTR (reloc_result->bound,
-						 l_info[DT_STRTAB]);
-      const char *symname = strtab + sym.st_name;
-
-      /* Keep track of overwritten addresses.  */
-      unsigned int flags = reloc_result->flags;
-
-      struct audit_ifaces *afct = GLRO(dl_audit);
-      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-	{
-	  if (afct->ARCH_LA_PLTENTER != NULL
-	      && (reloc_result->enterexit
-		  & (LA_SYMB_NOPLTENTER << (2 * (cnt + 1)))) == 0)
-	    {
-	      long int new_framesize = -1;
-	      uintptr_t new_value
-		= afct->ARCH_LA_PLTENTER (&sym, reloc_result->boundndx,
-					  &l->l_audit[cnt].cookie,
-					  &reloc_result->bound->l_audit[cnt].cookie,
-					  regs, &flags, symname,
-					  &new_framesize);
-	      if (new_value != (uintptr_t) sym.st_value)
-		{
-		  flags |= LA_SYMB_ALTVALUE;
-		  sym.st_value = new_value;
-		}
-
-	      /* Remember the results for every audit library and
-		 store a summary in the first two bits.  */
-	      reloc_result->enterexit
-		|= ((flags & (LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT))
-		    << (2 * (cnt + 1)));
-
-	      if ((reloc_result->enterexit & (LA_SYMB_NOPLTEXIT
-					      << (2 * (cnt + 1))))
-		  == 0 && new_framesize != -1 && framesize != -2)
-		{
-		  /* If this is the first call providing information,
-		     use it.  */
-		  if (framesize == -1)
-		    framesize = new_framesize;
-		  /* If two pltenter calls provide conflicting information,
-		     use the larger value.  */
-		  else if (new_framesize != framesize)
-		    framesize = MAX (new_framesize, framesize);
-		}
-	    }
-
-	  afct = afct->next;
-	}
-
-      value = DL_FIXUP_ADDR_VALUE (sym.st_value);
-    }
-#endif
-
-  /* Store the frame size information.  */
-  *framesizep = framesize;
-
-  (*mcount_fct) (retaddr, DL_FIXUP_VALUE_CODE_ADDR (value));
-
-  return value;
-}
-
-#endif /* PROF */
-
-
-#include <stdio.h>
-void
-ARCH_FIXUP_ATTRIBUTE
-_dl_call_pltexit (struct link_map *l, ElfW(Word) reloc_arg,
-		  const void *inregs, void *outregs)
-{
-#ifdef SHARED
-  /* This is the address in the array where we store the result of previous
-     relocations.  */
-  // XXX Maybe the bound information must be stored on the stack since
-  // XXX with bind_not a new value could have been stored in the meantime.
-  struct reloc_result *reloc_result = &l->l_reloc_result[reloc_index];
-  ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound,
-					    l_info[DT_SYMTAB])
-		       + reloc_result->boundndx);
-
-  /* Set up the sym parameter.  */
-  ElfW(Sym) sym = *defsym;
-  sym.st_value = DL_FIXUP_VALUE_ADDR (reloc_result->addr);
-
-  /* Get the symbol name.  */
-  const char *strtab = (const void *) D_PTR (reloc_result->bound,
-					     l_info[DT_STRTAB]);
-  const char *symname = strtab + sym.st_name;
-
-  struct audit_ifaces *afct = GLRO(dl_audit);
-  for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-    {
-      if (afct->ARCH_LA_PLTEXIT != NULL
-	  && (reloc_result->enterexit
-	      & (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0)
-	{
-	  afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx,
-				 &l->l_audit[cnt].cookie,
-				 &reloc_result->bound->l_audit[cnt].cookie,
-				 inregs, outregs, symname);
-	}
-
-      afct = afct->next;
-    }
-#endif
-}
diff --git a/elf/dl-sbrk.c b/elf/dl-sbrk.c
deleted file mode 100644
index 4713a92694..0000000000
--- a/elf/dl-sbrk.c
+++ /dev/null
@@ -1,5 +0,0 @@
-/* We can use the normal code but we also know the __curbrk is not exported
-   from ld.so.  */
-extern void *__curbrk attribute_hidden;
-
-#include <sbrk.c>
diff --git a/elf/dl-scope.c b/elf/dl-scope.c
deleted file mode 100644
index bb924afa8f..0000000000
--- a/elf/dl-scope.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Memory handling for the scope data structures.
-   Copyright (C) 2009-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdlib.h>
-#include <ldsodefs.h>
-#include <sysdep-cancel.h>
-
-
-int
-_dl_scope_free (void *old)
-{
-  struct dl_scope_free_list *fsl;
-#define DL_SCOPE_FREE_LIST_SIZE (sizeof (fsl->list) / sizeof (fsl->list[0]))
-
-  if (RTLD_SINGLE_THREAD_P)
-    free (old);
-  else if ((fsl = GL(dl_scope_free_list)) == NULL)
-    {
-      GL(dl_scope_free_list) = fsl = malloc (sizeof (*fsl));
-      if (fsl == NULL)
-	{
-	  THREAD_GSCOPE_WAIT ();
-	  free (old);
-	  return 1;
-	}
-      else
-	{
-	  fsl->list[0] = old;
-	  fsl->count = 1;
-	}
-    }
-  else if (fsl->count < DL_SCOPE_FREE_LIST_SIZE)
-    fsl->list[fsl->count++] = old;
-  else
-    {
-      THREAD_GSCOPE_WAIT ();
-      while (fsl->count > 0)
-	free (fsl->list[--fsl->count]);
-      return 1;
-    }
-  return 0;
-}
diff --git a/elf/dl-support.c b/elf/dl-support.c
deleted file mode 100644
index c22be854f4..0000000000
--- a/elf/dl-support.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/* Support for dynamic linking code in static libc.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This file defines some things that for the dynamic linker are defined in
-   rtld.c and dl-sysdep.c in ways appropriate to bootstrap dynamic linking.  */
-
-#include <errno.h>
-#include <libintl.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <stdint.h>
-#include <ldsodefs.h>
-#include <dl-machine.h>
-#include <libc-lock.h>
-#include <dl-cache.h>
-#include <dl-librecon.h>
-#include <dl-procinfo.h>
-#include <unsecvars.h>
-#include <hp-timing.h>
-#include <stackinfo.h>
-
-extern char *__progname;
-char **_dl_argv = &__progname;	/* This is checked for some error messages.  */
-
-/* Name of the architecture.  */
-const char *_dl_platform;
-size_t _dl_platformlen;
-
-int _dl_debug_mask;
-int _dl_lazy;
-ElfW(Addr) _dl_use_load_bias = -2;
-int _dl_dynamic_weak;
-
-/* If nonzero print warnings about problematic situations.  */
-int _dl_verbose;
-
-/* We never do profiling.  */
-const char *_dl_profile;
-const char *_dl_profile_output;
-
-/* Names of shared object for which the RUNPATHs and RPATHs should be
-   ignored.  */
-const char *_dl_inhibit_rpath;
-
-/* The map for the object we will profile.  */
-struct link_map *_dl_profile_map;
-
-/* This is the address of the last stack address ever used.  */
-void *__libc_stack_end;
-
-/* Path where the binary is found.  */
-const char *_dl_origin_path;
-
-/* Nonzero if runtime lookup should not update the .got/.plt.  */
-int _dl_bind_not;
-
-/* A dummy link map for the executable, used by dlopen to access the global
-   scope.  We don't export any symbols ourselves, so this can be minimal.  */
-static struct link_map _dl_main_map =
-  {
-    .l_name = (char *) "",
-    .l_real = &_dl_main_map,
-    .l_ns = LM_ID_BASE,
-    .l_libname = &(struct libname_list) { .name = "", .dont_free = 1 },
-    .l_searchlist =
-      {
-	.r_list = &(struct link_map *) { &_dl_main_map },
-	.r_nlist = 1,
-      },
-    .l_symbolic_searchlist = { .r_list = &(struct link_map *) { NULL } },
-    .l_type = lt_executable,
-    .l_scope_mem = { &_dl_main_map.l_searchlist },
-    .l_scope_max = (sizeof (_dl_main_map.l_scope_mem)
-		    / sizeof (_dl_main_map.l_scope_mem[0])),
-    .l_scope = _dl_main_map.l_scope_mem,
-    .l_local_scope = { &_dl_main_map.l_searchlist },
-    .l_used = 1,
-    .l_tls_offset = NO_TLS_OFFSET,
-    .l_serial = 1,
-  };
-
-/* Namespace information.  */
-struct link_namespaces _dl_ns[DL_NNS] =
-  {
-    [LM_ID_BASE] =
-      {
-	._ns_loaded = &_dl_main_map,
-	._ns_nloaded = 1,
-	._ns_main_searchlist = &_dl_main_map.l_searchlist,
-      }
-  };
-size_t _dl_nns = 1;
-
-/* Incremented whenever something may have been added to dl_loaded. */
-unsigned long long _dl_load_adds = 1;
-
-/* Fake scope of the main application.  */
-struct r_scope_elem _dl_initial_searchlist =
-  {
-    .r_list = &(struct link_map *) { &_dl_main_map },
-    .r_nlist = 1,
-  };
-
-#ifndef HAVE_INLINED_SYSCALLS
-/* Nonzero during startup.  */
-int _dl_starting_up = 1;
-#endif
-
-/* Random data provided by the kernel.  */
-void *_dl_random;
-
-/* Get architecture specific initializer.  */
-#include <dl-procinfo.c>
-
-/* Initial value of the CPU clock.  */
-#ifndef HP_TIMING_NONAVAIL
-hp_timing_t _dl_cpuclock_offset;
-#endif
-
-void (*_dl_init_static_tls) (struct link_map *) = &_dl_nothread_init_static_tls;
-
-size_t _dl_pagesize = EXEC_PAGESIZE;
-
-int _dl_inhibit_cache;
-
-unsigned int _dl_osversion;
-
-/* All known directories in sorted order.  */
-struct r_search_path_elem *_dl_all_dirs;
-
-/* All directories after startup.  */
-struct r_search_path_elem *_dl_init_all_dirs;
-
-/* The object to be initialized first.  */
-struct link_map *_dl_initfirst;
-
-/* Descriptor to write debug messages to.  */
-int _dl_debug_fd = STDERR_FILENO;
-
-int _dl_correct_cache_id = _DL_CACHE_DEFAULT_ID;
-
-ElfW(auxv_t) *_dl_auxv;
-const ElfW(Phdr) *_dl_phdr;
-size_t _dl_phnum;
-uint64_t _dl_hwcap __attribute__ ((nocommon));
-uint64_t _dl_hwcap2 __attribute__ ((nocommon));
-
-/* The value of the FPU control word the kernel will preset in hardware.  */
-fpu_control_t _dl_fpu_control = _FPU_DEFAULT;
-
-#if !HAVE_TUNABLES
-/* This is not initialized to HWCAP_IMPORTANT, matching the definition
-   of _dl_important_hwcaps, below, where no hwcap strings are ever
-   used.  This mask is still used to mediate the lookups in the cache
-   file.  Since there is no way to set this nonzero (we don't grok the
-   LD_HWCAP_MASK environment variable here), there is no real point in
-   setting _dl_hwcap nonzero below, but we do anyway.  */
-uint64_t _dl_hwcap_mask __attribute__ ((nocommon));
-#endif
-
-/* Prevailing state of the stack.  Generally this includes PF_X, indicating it's
- * executable but this isn't true for all platforms.  */
-ElfW(Word) _dl_stack_flags = DEFAULT_STACK_PERMS;
-
-/* If loading a shared object requires that we make the stack executable
-   when it was not, we do it by calling this function.
-   It returns an errno code or zero on success.  */
-int (*_dl_make_stack_executable_hook) (void **) internal_function
-  = _dl_make_stack_executable;
-
-
-/* Function in libpthread to wait for termination of lookups.  */
-void (*_dl_wait_lookup_done) (void);
-
-struct dl_scope_free_list *_dl_scope_free_list;
-
-#ifdef NEED_DL_SYSINFO
-/* Needed for improved syscall handling on at least x86/Linux.  */
-uintptr_t _dl_sysinfo = DL_SYSINFO_DEFAULT;
-#endif
-#ifdef NEED_DL_SYSINFO_DSO
-/* Address of the ELF headers in the vsyscall page.  */
-const ElfW(Ehdr) *_dl_sysinfo_dso;
-
-struct link_map *_dl_sysinfo_map;
-
-# include "get-dynamic-info.h"
-#endif
-#include "setup-vdso.h"
-
-/* During the program run we must not modify the global data of
-   loaded shared object simultanously in two threads.  Therefore we
-   protect `_dl_open' and `_dl_close' in dl-close.c.
-
-   This must be a recursive lock since the initializer function of
-   the loaded object might as well require a call to this function.
-   At this time it is not anymore a problem to modify the tables.  */
-__rtld_lock_define_initialized_recursive (, _dl_load_lock)
-/* This lock is used to keep __dl_iterate_phdr from inspecting the
-   list of loaded objects while an object is added to or removed from
-   that list.  */
-__rtld_lock_define_initialized_recursive (, _dl_load_write_lock)
-
-
-#ifdef HAVE_AUX_VECTOR
-int _dl_clktck;
-
-void
-internal_function
-_dl_aux_init (ElfW(auxv_t) *av)
-{
-  int seen = 0;
-  uid_t uid = 0;
-  gid_t gid = 0;
-
-  _dl_auxv = av;
-  for (; av->a_type != AT_NULL; ++av)
-    switch (av->a_type)
-      {
-      case AT_PAGESZ:
-	if (av->a_un.a_val != 0)
-	  GLRO(dl_pagesize) = av->a_un.a_val;
-	break;
-      case AT_CLKTCK:
-	GLRO(dl_clktck) = av->a_un.a_val;
-	break;
-      case AT_PHDR:
-	GL(dl_phdr) = (const void *) av->a_un.a_val;
-	break;
-      case AT_PHNUM:
-	GL(dl_phnum) = av->a_un.a_val;
-	break;
-      case AT_PLATFORM:
-	GLRO(dl_platform) = (void *) av->a_un.a_val;
-	break;
-      case AT_HWCAP:
-	GLRO(dl_hwcap) = (unsigned long int) av->a_un.a_val;
-	break;
-      case AT_HWCAP2:
-	GLRO(dl_hwcap2) = (unsigned long int) av->a_un.a_val;
-	break;
-      case AT_FPUCW:
-	GLRO(dl_fpu_control) = av->a_un.a_val;
-	break;
-#ifdef NEED_DL_SYSINFO
-      case AT_SYSINFO:
-	GL(dl_sysinfo) = av->a_un.a_val;
-	break;
-#endif
-#ifdef NEED_DL_SYSINFO_DSO
-      case AT_SYSINFO_EHDR:
-	GL(dl_sysinfo_dso) = (void *) av->a_un.a_val;
-	break;
-#endif
-      case AT_UID:
-	uid ^= av->a_un.a_val;
-	seen |= 1;
-	break;
-      case AT_EUID:
-	uid ^= av->a_un.a_val;
-	seen |= 2;
-	break;
-      case AT_GID:
-	gid ^= av->a_un.a_val;
-	seen |= 4;
-	break;
-      case AT_EGID:
-	gid ^= av->a_un.a_val;
-	seen |= 8;
-	break;
-      case AT_SECURE:
-	seen = -1;
-	__libc_enable_secure = av->a_un.a_val;
-	__libc_enable_secure_decided = 1;
-	break;
-      case AT_RANDOM:
-	_dl_random = (void *) av->a_un.a_val;
-	break;
-# ifdef DL_PLATFORM_AUXV
-      DL_PLATFORM_AUXV
-# endif
-      }
-  if (seen == 0xf)
-    {
-      __libc_enable_secure = uid != 0 || gid != 0;
-      __libc_enable_secure_decided = 1;
-    }
-}
-#endif
-
-
-void
-internal_function
-_dl_non_dynamic_init (void)
-{
-  _dl_main_map.l_origin = _dl_get_origin ();
-  _dl_main_map.l_phdr = GL(dl_phdr);
-  _dl_main_map.l_phnum = GL(dl_phnum);
-
-  if (HP_SMALL_TIMING_AVAIL)
-    HP_TIMING_NOW (_dl_cpuclock_offset);
-
-  _dl_verbose = *(getenv ("LD_WARN") ?: "") == '\0' ? 0 : 1;
-
-  /* Set up the data structures for the system-supplied DSO early,
-     so they can influence _dl_init_paths.  */
-  setup_vdso (NULL, NULL);
-
-  /* Initialize the data structures for the search paths for shared
-     objects.  */
-  _dl_init_paths (getenv ("LD_LIBRARY_PATH"));
-
-  /* Remember the last search directory added at startup.  */
-  _dl_init_all_dirs = GL(dl_all_dirs);
-
-  _dl_lazy = *(getenv ("LD_BIND_NOW") ?: "") == '\0';
-
-  _dl_bind_not = *(getenv ("LD_BIND_NOT") ?: "") != '\0';
-
-  _dl_dynamic_weak = *(getenv ("LD_DYNAMIC_WEAK") ?: "") == '\0';
-
-  _dl_profile_output = getenv ("LD_PROFILE_OUTPUT");
-  if (_dl_profile_output == NULL || _dl_profile_output[0] == '\0')
-    _dl_profile_output
-      = &"/var/tmp\0/var/profile"[__libc_enable_secure ? 9 : 0];
-
-  if (__libc_enable_secure)
-    {
-      static const char unsecure_envvars[] =
-	UNSECURE_ENVVARS
-#ifdef EXTRA_UNSECURE_ENVVARS
-	EXTRA_UNSECURE_ENVVARS
-#endif
-	;
-      const char *cp = unsecure_envvars;
-
-      while (cp < unsecure_envvars + sizeof (unsecure_envvars))
-	{
-	  __unsetenv (cp);
-	  cp = (const char *) __rawmemchr (cp, '\0') + 1;
-	}
-
-#if !HAVE_TUNABLES
-      if (__access ("/etc/suid-debug", F_OK) != 0)
-	__unsetenv ("MALLOC_CHECK_");
-#endif
-    }
-
-#ifdef DL_PLATFORM_INIT
-  DL_PLATFORM_INIT;
-#endif
-
-#ifdef DL_OSVERSION_INIT
-  DL_OSVERSION_INIT;
-#endif
-
-  /* Now determine the length of the platform string.  */
-  if (_dl_platform != NULL)
-    _dl_platformlen = strlen (_dl_platform);
-
-  /* Scan for a program header telling us the stack is nonexecutable.  */
-  if (_dl_phdr != NULL)
-    for (uint_fast16_t i = 0; i < _dl_phnum; ++i)
-      if (_dl_phdr[i].p_type == PT_GNU_STACK)
-	{
-	  _dl_stack_flags = _dl_phdr[i].p_flags;
-	  break;
-	}
-}
-
-#ifdef DL_SYSINFO_IMPLEMENTATION
-DL_SYSINFO_IMPLEMENTATION
-#endif
diff --git a/elf/dl-sym.c b/elf/dl-sym.c
deleted file mode 100644
index 7cd6e97643..0000000000
--- a/elf/dl-sym.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/* Look up a symbol in a shared object loaded by `dlopen'.
-   Copyright (C) 1999-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <stddef.h>
-#include <setjmp.h>
-#include <stdlib.h>
-#include <libintl.h>
-
-#include <dlfcn.h>
-#include <ldsodefs.h>
-#include <dl-hash.h>
-#include <sysdep-cancel.h>
-#include <dl-tls.h>
-#include <dl-irel.h>
-
-
-#ifdef SHARED
-/* Systems which do not have tls_index also probably have to define
-   DONT_USE_TLS_INDEX.  */
-
-# ifndef __TLS_GET_ADDR
-#  define __TLS_GET_ADDR __tls_get_addr
-# endif
-
-/* Return the symbol address given the map of the module it is in and
-   the symbol record.  This is used in dl-sym.c.  */
-static void *
-internal_function
-_dl_tls_symaddr (struct link_map *map, const ElfW(Sym) *ref)
-{
-# ifndef DONT_USE_TLS_INDEX
-  tls_index tmp =
-    {
-      .ti_module = map->l_tls_modid,
-      .ti_offset = ref->st_value
-    };
-
-  return __TLS_GET_ADDR (&tmp);
-# else
-  return __TLS_GET_ADDR (map->l_tls_modid, ref->st_value);
-# endif
-}
-#endif
-
-
-struct call_dl_lookup_args
-{
-  /* Arguments to do_dlsym.  */
-  struct link_map *map;
-  const char *name;
-  struct r_found_version *vers;
-  int flags;
-
-  /* Return values of do_dlsym.  */
-  lookup_t loadbase;
-  const ElfW(Sym) **refp;
-};
-
-static void
-call_dl_lookup (void *ptr)
-{
-  struct call_dl_lookup_args *args = (struct call_dl_lookup_args *) ptr;
-  args->map = GLRO(dl_lookup_symbol_x) (args->name, args->map, args->refp,
-					args->map->l_scope, args->vers, 0,
-					args->flags, NULL);
-}
-
-
-static void *
-internal_function
-do_sym (void *handle, const char *name, void *who,
-	struct r_found_version *vers, int flags)
-{
-  const ElfW(Sym) *ref = NULL;
-  lookup_t result;
-  ElfW(Addr) caller = (ElfW(Addr)) who;
-
-  struct link_map *l = _dl_find_dso_for_object (caller);
-  /* If the address is not recognized the call comes from the main
-     program (we hope).  */
-  struct link_map *match = l ? l : GL(dl_ns)[LM_ID_BASE]._ns_loaded;
-
-  if (handle == RTLD_DEFAULT)
-    {
-      /* Search the global scope.  We have the simple case where
-	 we look up in the scope of an object which was part of
-	 the initial binary.  And then the more complex part
-	 where the object is dynamically loaded and the scope
-	 array can change.  */
-      if (RTLD_SINGLE_THREAD_P)
-	result = GLRO(dl_lookup_symbol_x) (name, match, &ref,
-					   match->l_scope, vers, 0,
-					   flags | DL_LOOKUP_ADD_DEPENDENCY,
-					   NULL);
-      else
-	{
-	  struct call_dl_lookup_args args;
-	  args.name = name;
-	  args.map = match;
-	  args.vers = vers;
-	  args.flags
-	    = flags | DL_LOOKUP_ADD_DEPENDENCY | DL_LOOKUP_GSCOPE_LOCK;
-	  args.refp = &ref;
-
-	  THREAD_GSCOPE_SET_FLAG ();
-
-	  const char *objname;
-	  const char *errstring = NULL;
-	  bool malloced;
-	  int err = _dl_catch_error (&objname, &errstring, &malloced,
-				     call_dl_lookup, &args);
-
-	  THREAD_GSCOPE_RESET_FLAG ();
-
-	  if (__glibc_unlikely (errstring != NULL))
-	    {
-	      /* The lookup was unsuccessful.  Rethrow the error.  */
-	      char *errstring_dup = strdupa (errstring);
-	      char *objname_dup = strdupa (objname);
-	      if (malloced)
-		free ((char *) errstring);
-
-	      _dl_signal_error (err, objname_dup, NULL, errstring_dup);
-	      /* NOTREACHED */
-	    }
-
-	  result = args.map;
-	}
-    }
-  else if (handle == RTLD_NEXT)
-    {
-      if (__glibc_unlikely (match == GL(dl_ns)[LM_ID_BASE]._ns_loaded))
-	{
-	  if (match == NULL
-	      || caller < match->l_map_start
-	      || caller >= match->l_map_end)
-	    _dl_signal_error (0, NULL, NULL, N_("\
-RTLD_NEXT used in code not dynamically loaded"));
-	}
-
-      struct link_map *l = match;
-      while (l->l_loader != NULL)
-	l = l->l_loader;
-
-      result = GLRO(dl_lookup_symbol_x) (name, match, &ref, l->l_local_scope,
-					 vers, 0, 0, match);
-    }
-  else
-    {
-      /* Search the scope of the given object.  */
-      struct link_map *map = handle;
-      result = GLRO(dl_lookup_symbol_x) (name, map, &ref, map->l_local_scope,
-					 vers, 0, flags, NULL);
-    }
-
-  if (ref != NULL)
-    {
-      void *value;
-
-#ifdef SHARED
-      if (ELFW(ST_TYPE) (ref->st_info) == STT_TLS)
-	/* The found symbol is a thread-local storage variable.
-	   Return the address for to the current thread.  */
-	value = _dl_tls_symaddr (result, ref);
-      else
-#endif
-	value = DL_SYMBOL_ADDRESS (result, ref);
-
-      /* Resolve indirect function address.  */
-      if (__glibc_unlikely (ELFW(ST_TYPE) (ref->st_info) == STT_GNU_IFUNC))
-	{
-	  DL_FIXUP_VALUE_TYPE fixup
-	    = DL_FIXUP_MAKE_VALUE (result, (ElfW(Addr)) value);
-	  fixup = elf_ifunc_invoke (DL_FIXUP_VALUE_ADDR (fixup));
-	  value = (void *) DL_FIXUP_VALUE_CODE_ADDR (fixup);
-	}
-
-#ifdef SHARED
-      /* Auditing checkpoint: we have a new binding.  Provide the
-	 auditing libraries the possibility to change the value and
-	 tell us whether further auditing is wanted.  */
-      if (__glibc_unlikely (GLRO(dl_naudit) > 0))
-	{
-	  const char *strtab = (const char *) D_PTR (result,
-						     l_info[DT_STRTAB]);
-	  /* Compute index of the symbol entry in the symbol table of
-	     the DSO with the definition.  */
-	  unsigned int ndx = (ref - (ElfW(Sym) *) D_PTR (result,
-							 l_info[DT_SYMTAB]));
-
-	  if ((match->l_audit_any_plt | result->l_audit_any_plt) != 0)
-	    {
-	      unsigned int altvalue = 0;
-	      struct audit_ifaces *afct = GLRO(dl_audit);
-	      /* Synthesize a symbol record where the st_value field is
-		 the result.  */
-	      ElfW(Sym) sym = *ref;
-	      sym.st_value = (ElfW(Addr)) value;
-
-	      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-		{
-		  if (afct->symbind != NULL
-		      && ((match->l_audit[cnt].bindflags & LA_FLG_BINDFROM)
-			  != 0
-			  || ((result->l_audit[cnt].bindflags & LA_FLG_BINDTO)
-			      != 0)))
-		    {
-		      unsigned int flags = altvalue | LA_SYMB_DLSYM;
-		      uintptr_t new_value
-			= afct->symbind (&sym, ndx,
-					 &match->l_audit[cnt].cookie,
-					 &result->l_audit[cnt].cookie,
-					 &flags, strtab + ref->st_name);
-		      if (new_value != (uintptr_t) sym.st_value)
-			{
-			  altvalue = LA_SYMB_ALTVALUE;
-			  sym.st_value = new_value;
-			}
-		    }
-
-		  afct = afct->next;
-		}
-
-	      value = (void *) sym.st_value;
-	    }
-	}
-#endif
-
-      return value;
-    }
-
-  return NULL;
-}
-
-
-void *
-internal_function
-_dl_vsym (void *handle, const char *name, const char *version, void *who)
-{
-  struct r_found_version vers;
-
-  /* Compute hash value to the version string.  */
-  vers.name = version;
-  vers.hidden = 1;
-  vers.hash = _dl_elf_hash (version);
-  /* We don't have a specific file where the symbol can be found.  */
-  vers.filename = NULL;
-
-  return do_sym (handle, name, who, &vers, 0);
-}
-
-
-void *
-internal_function
-_dl_sym (void *handle, const char *name, void *who)
-{
-  return do_sym (handle, name, who, NULL, DL_LOOKUP_RETURN_NEWEST);
-}
diff --git a/elf/dl-symaddr.c b/elf/dl-symaddr.c
deleted file mode 100644
index 5caed4ba21..0000000000
--- a/elf/dl-symaddr.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Get the symbol address.  Generic version.
-   Copyright (C) 1999-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <ldsodefs.h>
-#include <dl-fptr.h>
-
-void *
-_dl_symbol_address (struct link_map *map, const ElfW(Sym) *ref)
-{
-  ElfW(Addr) value = (map ? map->l_addr : 0) + ref->st_value;
-
-  /* Return the pointer to function descriptor. */
-  if (ELFW(ST_TYPE) (ref->st_info) == STT_FUNC)
-    return (void *) _dl_make_fptr (map, ref, value);
-  else
-    return (void *) value;
-}
-rtld_hidden_def (_dl_symbol_address)
diff --git a/elf/dl-sysdep-open.h b/elf/dl-sysdep-open.h
deleted file mode 100644
index 91851848b3..0000000000
--- a/elf/dl-sysdep-open.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* System-specific call to open a shared object by name.  Stub version.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _DL_SYSDEP_OPEN_H
-#define _DL_SYSDEP_OPEN_H	1
-
-#include <assert.h>
-#include <stddef.h>
-
-/* NAME is a name without slashes, as it appears in a DT_NEEDED entry
-   or a dlopen call's argument or suchlike.  NAMELEN is (strlen (NAME) + 1).
-
-   Find NAME in an OS-dependent fashion, and return its "real" name.
-   Optionally fill in *FD with a file descriptor open on that file (or
-   else leave its initial value of -1).  The return value is a new
-   malloc'd string, which will be free'd by the caller.  If NAME is
-   resolved to an actual file that can be opened, then the return
-   value should name that file (and if *FD was not set, then a normal
-   __open call on that string will be made).  If *FD was set by some
-   other means than a normal open and there is no "real" name to use,
-   then __strdup (NAME) is fine (modulo error checking).  */
-
-static inline char *
-_dl_sysdep_open_object (const char *name, size_t namelen, int *fd)
-{
-  assert (*fd == -1);
-  return NULL;
-}
-
-#endif  /* dl-sysdep-open.h */
diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c
deleted file mode 100644
index 4053ff3c07..0000000000
--- a/elf/dl-sysdep.c
+++ /dev/null
@@ -1,360 +0,0 @@
-/* Operating system support for run-time dynamic linker.  Generic Unix version.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* We conditionalize the whole of this file rather than simply eliding it
-   from the static build, because other sysdeps/ versions of this file
-   might define things needed by a static build.  */
-
-#ifdef SHARED
-
-#include <assert.h>
-#include <elf.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libintl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <ldsodefs.h>
-#include <_itoa.h>
-#include <fpu_control.h>
-
-#include <entry.h>
-#include <dl-machine.h>
-#include <dl-procinfo.h>
-#include <dl-osinfo.h>
-#include <hp-timing.h>
-#include <tls.h>
-
-#include <dl-tunables.h>
-
-extern char **_environ attribute_hidden;
-extern char _end[] attribute_hidden;
-
-/* Protect SUID program against misuse of file descriptors.  */
-extern void __libc_check_standard_fds (void);
-
-#ifdef NEED_DL_BASE_ADDR
-ElfW(Addr) _dl_base_addr;
-#endif
-int __libc_enable_secure attribute_relro = 0;
-rtld_hidden_data_def (__libc_enable_secure)
-int __libc_multiple_libcs = 0;	/* Defining this here avoids the inclusion
-				   of init-first.  */
-/* This variable contains the lowest stack address ever used.  */
-void *__libc_stack_end attribute_relro = NULL;
-rtld_hidden_data_def(__libc_stack_end)
-void *_dl_random attribute_relro = NULL;
-
-#ifndef DL_FIND_ARG_COMPONENTS
-# define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp)	\
-  do {									      \
-    void **_tmp;							      \
-    (argc) = *(long int *) cookie;					      \
-    (argv) = (char **) ((long int *) cookie + 1);			      \
-    (envp) = (argv) + (argc) + 1;					      \
-    for (_tmp = (void **) (envp); *_tmp; ++_tmp)			      \
-      continue;								      \
-    (auxp) = (void *) ++_tmp;						      \
-  } while (0)
-#endif
-
-#ifndef DL_STACK_END
-# define DL_STACK_END(cookie) ((void *) (cookie))
-#endif
-
-ElfW(Addr)
-_dl_sysdep_start (void **start_argptr,
-		  void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
-				   ElfW(Addr) *user_entry, ElfW(auxv_t) *auxv))
-{
-  const ElfW(Phdr) *phdr = NULL;
-  ElfW(Word) phnum = 0;
-  ElfW(Addr) user_entry;
-  ElfW(auxv_t) *av;
-#ifdef HAVE_AUX_SECURE
-# define set_seen(tag) (tag)	/* Evaluate for the side effects.  */
-# define set_seen_secure() ((void) 0)
-#else
-  uid_t uid = 0;
-  gid_t gid = 0;
-  unsigned int seen = 0;
-# define set_seen_secure() (seen = -1)
-# ifdef HAVE_AUX_XID
-#  define set_seen(tag) (tag)	/* Evaluate for the side effects.  */
-# else
-#  define M(type) (1 << (type))
-#  define set_seen(tag) seen |= M ((tag)->a_type)
-# endif
-#endif
-#ifdef NEED_DL_SYSINFO
-  uintptr_t new_sysinfo = 0;
-#endif
-
-  __libc_stack_end = DL_STACK_END (start_argptr);
-  DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, _dl_argv, _environ,
-			  GLRO(dl_auxv));
-
-  user_entry = (ElfW(Addr)) ENTRY_POINT;
-  GLRO(dl_platform) = NULL; /* Default to nothing known about the platform.  */
-
-  for (av = GLRO(dl_auxv); av->a_type != AT_NULL; set_seen (av++))
-    switch (av->a_type)
-      {
-      case AT_PHDR:
-	phdr = (void *) av->a_un.a_val;
-	break;
-      case AT_PHNUM:
-	phnum = av->a_un.a_val;
-	break;
-      case AT_PAGESZ:
-	GLRO(dl_pagesize) = av->a_un.a_val;
-	break;
-      case AT_ENTRY:
-	user_entry = av->a_un.a_val;
-	break;
-#ifdef NEED_DL_BASE_ADDR
-      case AT_BASE:
-	_dl_base_addr = av->a_un.a_val;
-	break;
-#endif
-#ifndef HAVE_AUX_SECURE
-      case AT_UID:
-      case AT_EUID:
-	uid ^= av->a_un.a_val;
-	break;
-      case AT_GID:
-      case AT_EGID:
-	gid ^= av->a_un.a_val;
-	break;
-#endif
-      case AT_SECURE:
-#ifndef HAVE_AUX_SECURE
-	seen = -1;
-#endif
-	__libc_enable_secure = av->a_un.a_val;
-	break;
-      case AT_PLATFORM:
-	GLRO(dl_platform) = (void *) av->a_un.a_val;
-	break;
-      case AT_HWCAP:
-	GLRO(dl_hwcap) = (unsigned long int) av->a_un.a_val;
-	break;
-      case AT_HWCAP2:
-	GLRO(dl_hwcap2) = (unsigned long int) av->a_un.a_val;
-	break;
-      case AT_CLKTCK:
-	GLRO(dl_clktck) = av->a_un.a_val;
-	break;
-      case AT_FPUCW:
-	GLRO(dl_fpu_control) = av->a_un.a_val;
-	break;
-#ifdef NEED_DL_SYSINFO
-      case AT_SYSINFO:
-	new_sysinfo = av->a_un.a_val;
-	break;
-#endif
-#ifdef NEED_DL_SYSINFO_DSO
-      case AT_SYSINFO_EHDR:
-	GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val;
-	break;
-#endif
-      case AT_RANDOM:
-	_dl_random = (void *) av->a_un.a_val;
-	break;
-#ifdef DL_PLATFORM_AUXV
-      DL_PLATFORM_AUXV
-#endif
-      }
-
-#ifndef HAVE_AUX_SECURE
-  if (seen != -1)
-    {
-      /* Fill in the values we have not gotten from the kernel through the
-	 auxiliary vector.  */
-# ifndef HAVE_AUX_XID
-#  define SEE(UID, var, uid) \
-   if ((seen & M (AT_##UID)) == 0) var ^= __get##uid ()
-      SEE (UID, uid, uid);
-      SEE (EUID, uid, euid);
-      SEE (GID, gid, gid);
-      SEE (EGID, gid, egid);
-# endif
-
-      /* If one of the two pairs of IDs does not match this is a setuid
-	 or setgid run.  */
-      __libc_enable_secure = uid | gid;
-    }
-#endif
-
-#ifndef HAVE_AUX_PAGESIZE
-  if (GLRO(dl_pagesize) == 0)
-    GLRO(dl_pagesize) = __getpagesize ();
-#endif
-
-#ifdef NEED_DL_SYSINFO
-  if (new_sysinfo != 0)
-    {
-# ifdef NEED_DL_SYSINFO_DSO
-      /* Only set the sysinfo value if we also have the vsyscall DSO.  */
-      if (GLRO(dl_sysinfo_dso) != 0)
-# endif
-        GLRO(dl_sysinfo) = new_sysinfo;
-    }
-#endif
-
-  __tunables_init (_environ);
-
-#ifdef DL_SYSDEP_INIT
-  DL_SYSDEP_INIT;
-#endif
-
-#ifdef DL_PLATFORM_INIT
-  DL_PLATFORM_INIT;
-#endif
-
-  /* Determine the length of the platform name.  */
-  if (GLRO(dl_platform) != NULL)
-    GLRO(dl_platformlen) = strlen (GLRO(dl_platform));
-
-  if (__sbrk (0) == _end)
-    /* The dynamic linker was run as a program, and so the initial break
-       starts just after our bss, at &_end.  The malloc in dl-minimal.c
-       will consume the rest of this page, so tell the kernel to move the
-       break up that far.  When the user program examines its break, it
-       will see this new value and not clobber our data.  */
-    __sbrk (GLRO(dl_pagesize)
-	    - ((_end - (char *) 0) & (GLRO(dl_pagesize) - 1)));
-
-  /* If this is a SUID program we make sure that FDs 0, 1, and 2 are
-     allocated.  If necessary we are doing it ourself.  If it is not
-     possible we stop the program.  */
-  if (__builtin_expect (__libc_enable_secure, 0))
-    __libc_check_standard_fds ();
-
-  (*dl_main) (phdr, phnum, &user_entry, GLRO(dl_auxv));
-  return user_entry;
-}
-
-void
-internal_function
-_dl_sysdep_start_cleanup (void)
-{
-}
-
-void
-internal_function
-_dl_show_auxv (void)
-{
-  char buf[64];
-  ElfW(auxv_t) *av;
-
-  /* Terminate string.  */
-  buf[63] = '\0';
-
-  /* The following code assumes that the AT_* values are encoded
-     starting from 0 with AT_NULL, 1 for AT_IGNORE, and all other values
-     close by (otherwise the array will be too large).  In case we have
-     to support a platform where these requirements are not fulfilled
-     some alternative implementation has to be used.  */
-  for (av = GLRO(dl_auxv); av->a_type != AT_NULL; ++av)
-    {
-      static const struct
-      {
-	const char label[17];
-	enum { unknown = 0, dec, hex, str, ignore } form : 8;
-      } auxvars[] =
-	{
-	  [AT_EXECFD - 2] =		{ "EXECFD:       ", dec },
-	  [AT_EXECFN - 2] =		{ "EXECFN:       ", str },
-	  [AT_PHDR - 2] =		{ "PHDR:         0x", hex },
-	  [AT_PHENT - 2] =		{ "PHENT:        ", dec },
-	  [AT_PHNUM - 2] =		{ "PHNUM:        ", dec },
-	  [AT_PAGESZ - 2] =		{ "PAGESZ:       ", dec },
-	  [AT_BASE - 2] =		{ "BASE:         0x", hex },
-	  [AT_FLAGS - 2] =		{ "FLAGS:        0x", hex },
-	  [AT_ENTRY - 2] =		{ "ENTRY:        0x", hex },
-	  [AT_NOTELF - 2] =		{ "NOTELF:       ", hex },
-	  [AT_UID - 2] =		{ "UID:          ", dec },
-	  [AT_EUID - 2] =		{ "EUID:         ", dec },
-	  [AT_GID - 2] =		{ "GID:          ", dec },
-	  [AT_EGID - 2] =		{ "EGID:         ", dec },
-	  [AT_PLATFORM - 2] =		{ "PLATFORM:     ", str },
-	  [AT_HWCAP - 2] =		{ "HWCAP:        ", hex },
-	  [AT_CLKTCK - 2] =		{ "CLKTCK:       ", dec },
-	  [AT_FPUCW - 2] =		{ "FPUCW:        ", hex },
-	  [AT_DCACHEBSIZE - 2] =	{ "DCACHEBSIZE:  0x", hex },
-	  [AT_ICACHEBSIZE - 2] =	{ "ICACHEBSIZE:  0x", hex },
-	  [AT_UCACHEBSIZE - 2] =	{ "UCACHEBSIZE:  0x", hex },
-	  [AT_IGNOREPPC - 2] =		{ "IGNOREPPC", ignore },
-	  [AT_SECURE - 2] =		{ "SECURE:       ", dec },
-	  [AT_BASE_PLATFORM - 2] =	{ "BASE_PLATFORM:", str },
-	  [AT_SYSINFO - 2] =		{ "SYSINFO:      0x", hex },
-	  [AT_SYSINFO_EHDR - 2] =	{ "SYSINFO_EHDR: 0x", hex },
-	  [AT_RANDOM - 2] =		{ "RANDOM:       0x", hex },
-	  [AT_HWCAP2 - 2] =		{ "HWCAP2:       0x", hex },
-	};
-      unsigned int idx = (unsigned int) (av->a_type - 2);
-
-      if ((unsigned int) av->a_type < 2u
-	  || (idx < sizeof (auxvars) / sizeof (auxvars[0])
-	      && auxvars[idx].form == ignore))
-	continue;
-
-      assert (AT_NULL == 0);
-      assert (AT_IGNORE == 1);
-
-      if (av->a_type == AT_HWCAP || av->a_type == AT_HWCAP2)
-	{
-	  /* These are handled in a special way per platform.  */
-	  if (_dl_procinfo (av->a_type, av->a_un.a_val) == 0)
-	    continue;
-	}
-
-      if (idx < sizeof (auxvars) / sizeof (auxvars[0])
-	  && auxvars[idx].form != unknown)
-	{
-	  const char *val = (char *) av->a_un.a_val;
-
-	  if (__builtin_expect (auxvars[idx].form, dec) == dec)
-	    val = _itoa ((unsigned long int) av->a_un.a_val,
-			 buf + sizeof buf - 1, 10, 0);
-	  else if (__builtin_expect (auxvars[idx].form, hex) == hex)
-	    val = _itoa ((unsigned long int) av->a_un.a_val,
-			 buf + sizeof buf - 1, 16, 0);
-
-	  _dl_printf ("AT_%s%s\n", auxvars[idx].label, val);
-
-	  continue;
-	}
-
-      /* Unknown value: print a generic line.  */
-      char buf2[17];
-      buf2[sizeof (buf2) - 1] = '\0';
-      const char *val2 = _itoa ((unsigned long int) av->a_un.a_val,
-				buf2 + sizeof buf2 - 1, 16, 0);
-      const char *val =  _itoa ((unsigned long int) av->a_type,
-				buf + sizeof buf - 1, 16, 0);
-      _dl_printf ("AT_??? (0x%s): 0x%s\n", val, val2);
-    }
-}
-
-#endif
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
deleted file mode 100644
index 5aba33b3fa..0000000000
--- a/elf/dl-tls.c
+++ /dev/null
@@ -1,953 +0,0 @@
-/* Thread-local storage handling in the ELF dynamic linker.  Generic version.
-   Copyright (C) 2002-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <errno.h>
-#include <libintl.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <atomic.h>
-
-#include <tls.h>
-#include <dl-tls.h>
-#include <ldsodefs.h>
-
-/* Amount of excess space to allocate in the static TLS area
-   to allow dynamic loading of modules defining IE-model TLS data.  */
-#define TLS_STATIC_SURPLUS	64 + DL_NNS * 100
-
-
-/* Out-of-memory handler.  */
-static void
-__attribute__ ((__noreturn__))
-oom (void)
-{
-  _dl_fatal_printf ("cannot allocate memory for thread-local data: ABORT\n");
-}
-
-
-size_t
-internal_function
-_dl_next_tls_modid (void)
-{
-  size_t result;
-
-  if (__builtin_expect (GL(dl_tls_dtv_gaps), false))
-    {
-      size_t disp = 0;
-      struct dtv_slotinfo_list *runp = GL(dl_tls_dtv_slotinfo_list);
-
-      /* Note that this branch will never be executed during program
-	 start since there are no gaps at that time.  Therefore it
-	 does not matter that the dl_tls_dtv_slotinfo is not allocated
-	 yet when the function is called for the first times.
-
-	 NB: the offset +1 is due to the fact that DTV[0] is used
-	 for something else.  */
-      result = GL(dl_tls_static_nelem) + 1;
-      if (result <= GL(dl_tls_max_dtv_idx))
-	do
-	  {
-	    while (result - disp < runp->len)
-	      {
-		if (runp->slotinfo[result - disp].map == NULL)
-		  break;
-
-		++result;
-		assert (result <= GL(dl_tls_max_dtv_idx) + 1);
-	      }
-
-	    if (result - disp < runp->len)
-	      break;
-
-	    disp += runp->len;
-	  }
-	while ((runp = runp->next) != NULL);
-
-      if (result > GL(dl_tls_max_dtv_idx))
-	{
-	  /* The new index must indeed be exactly one higher than the
-	     previous high.  */
-	  assert (result == GL(dl_tls_max_dtv_idx) + 1);
-	  /* There is no gap anymore.  */
-	  GL(dl_tls_dtv_gaps) = false;
-
-	  goto nogaps;
-	}
-    }
-  else
-    {
-      /* No gaps, allocate a new entry.  */
-    nogaps:
-
-      result = ++GL(dl_tls_max_dtv_idx);
-    }
-
-  return result;
-}
-
-
-size_t
-internal_function
-_dl_count_modids (void)
-{
-  /* It is rare that we have gaps; see elf/dl-open.c (_dl_open) where
-     we fail to load a module and unload it leaving a gap.  If we don't
-     have gaps then the number of modids is the current maximum so
-     return that.  */
-  if (__glibc_likely (!GL(dl_tls_dtv_gaps)))
-    return GL(dl_tls_max_dtv_idx);
-
-  /* We have gaps and are forced to count the non-NULL entries.  */
-  size_t n = 0;
-  struct dtv_slotinfo_list *runp = GL(dl_tls_dtv_slotinfo_list);
-  while (runp != NULL)
-    {
-      for (size_t i = 0; i < runp->len; ++i)
-	if (runp->slotinfo[i].map != NULL)
-	  ++n;
-
-      runp = runp->next;
-    }
-
-  return n;
-}
-
-
-#ifdef SHARED
-void
-internal_function
-_dl_determine_tlsoffset (void)
-{
-  size_t max_align = TLS_TCB_ALIGN;
-  size_t freetop = 0;
-  size_t freebottom = 0;
-
-  /* The first element of the dtv slot info list is allocated.  */
-  assert (GL(dl_tls_dtv_slotinfo_list) != NULL);
-  /* There is at this point only one element in the
-     dl_tls_dtv_slotinfo_list list.  */
-  assert (GL(dl_tls_dtv_slotinfo_list)->next == NULL);
-
-  struct dtv_slotinfo *slotinfo = GL(dl_tls_dtv_slotinfo_list)->slotinfo;
-
-  /* Determining the offset of the various parts of the static TLS
-     block has several dependencies.  In addition we have to work
-     around bugs in some toolchains.
-
-     Each TLS block from the objects available at link time has a size
-     and an alignment requirement.  The GNU ld computes the alignment
-     requirements for the data at the positions *in the file*, though.
-     I.e, it is not simply possible to allocate a block with the size
-     of the TLS program header entry.  The data is layed out assuming
-     that the first byte of the TLS block fulfills
-
-       p_vaddr mod p_align == &TLS_BLOCK mod p_align
-
-     This means we have to add artificial padding at the beginning of
-     the TLS block.  These bytes are never used for the TLS data in
-     this module but the first byte allocated must be aligned
-     according to mod p_align == 0 so that the first byte of the TLS
-     block is aligned according to p_vaddr mod p_align.  This is ugly
-     and the linker can help by computing the offsets in the TLS block
-     assuming the first byte of the TLS block is aligned according to
-     p_align.
-
-     The extra space which might be allocated before the first byte of
-     the TLS block need not go unused.  The code below tries to use
-     that memory for the next TLS block.  This can work if the total
-     memory requirement for the next TLS block is smaller than the
-     gap.  */
-
-#if TLS_TCB_AT_TP
-  /* We simply start with zero.  */
-  size_t offset = 0;
-
-  for (size_t cnt = 0; slotinfo[cnt].map != NULL; ++cnt)
-    {
-      assert (cnt < GL(dl_tls_dtv_slotinfo_list)->len);
-
-      size_t firstbyte = (-slotinfo[cnt].map->l_tls_firstbyte_offset
-			  & (slotinfo[cnt].map->l_tls_align - 1));
-      size_t off;
-      max_align = MAX (max_align, slotinfo[cnt].map->l_tls_align);
-
-      if (freebottom - freetop >= slotinfo[cnt].map->l_tls_blocksize)
-	{
-	  off = roundup (freetop + slotinfo[cnt].map->l_tls_blocksize
-			 - firstbyte, slotinfo[cnt].map->l_tls_align)
-		+ firstbyte;
-	  if (off <= freebottom)
-	    {
-	      freetop = off;
-
-	      /* XXX For some architectures we perhaps should store the
-		 negative offset.  */
-	      slotinfo[cnt].map->l_tls_offset = off;
-	      continue;
-	    }
-	}
-
-      off = roundup (offset + slotinfo[cnt].map->l_tls_blocksize - firstbyte,
-		     slotinfo[cnt].map->l_tls_align) + firstbyte;
-      if (off > offset + slotinfo[cnt].map->l_tls_blocksize
-		+ (freebottom - freetop))
-	{
-	  freetop = offset;
-	  freebottom = off - slotinfo[cnt].map->l_tls_blocksize;
-	}
-      offset = off;
-
-      /* XXX For some architectures we perhaps should store the
-	 negative offset.  */
-      slotinfo[cnt].map->l_tls_offset = off;
-    }
-
-  GL(dl_tls_static_used) = offset;
-  GL(dl_tls_static_size) = (roundup (offset + TLS_STATIC_SURPLUS, max_align)
-			    + TLS_TCB_SIZE);
-#elif TLS_DTV_AT_TP
-  /* The TLS blocks start right after the TCB.  */
-  size_t offset = TLS_TCB_SIZE;
-
-  for (size_t cnt = 0; slotinfo[cnt].map != NULL; ++cnt)
-    {
-      assert (cnt < GL(dl_tls_dtv_slotinfo_list)->len);
-
-      size_t firstbyte = (-slotinfo[cnt].map->l_tls_firstbyte_offset
-			  & (slotinfo[cnt].map->l_tls_align - 1));
-      size_t off;
-      max_align = MAX (max_align, slotinfo[cnt].map->l_tls_align);
-
-      if (slotinfo[cnt].map->l_tls_blocksize <= freetop - freebottom)
-	{
-	  off = roundup (freebottom, slotinfo[cnt].map->l_tls_align);
-	  if (off - freebottom < firstbyte)
-	    off += slotinfo[cnt].map->l_tls_align;
-	  if (off + slotinfo[cnt].map->l_tls_blocksize - firstbyte <= freetop)
-	    {
-	      slotinfo[cnt].map->l_tls_offset = off - firstbyte;
-	      freebottom = (off + slotinfo[cnt].map->l_tls_blocksize
-			    - firstbyte);
-	      continue;
-	    }
-	}
-
-      off = roundup (offset, slotinfo[cnt].map->l_tls_align);
-      if (off - offset < firstbyte)
-	off += slotinfo[cnt].map->l_tls_align;
-
-      slotinfo[cnt].map->l_tls_offset = off - firstbyte;
-      if (off - firstbyte - offset > freetop - freebottom)
-	{
-	  freebottom = offset;
-	  freetop = off - firstbyte;
-	}
-
-      offset = off + slotinfo[cnt].map->l_tls_blocksize - firstbyte;
-    }
-
-  GL(dl_tls_static_used) = offset;
-  GL(dl_tls_static_size) = roundup (offset + TLS_STATIC_SURPLUS,
-				    TLS_TCB_ALIGN);
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
-
-  /* The alignment requirement for the static TLS block.  */
-  GL(dl_tls_static_align) = max_align;
-}
-#endif /* SHARED */
-
-static void *
-internal_function
-allocate_dtv (void *result)
-{
-  dtv_t *dtv;
-  size_t dtv_length;
-
-  /* We allocate a few more elements in the dtv than are needed for the
-     initial set of modules.  This should avoid in most cases expansions
-     of the dtv.  */
-  dtv_length = GL(dl_tls_max_dtv_idx) + DTV_SURPLUS;
-  dtv = calloc (dtv_length + 2, sizeof (dtv_t));
-  if (dtv != NULL)
-    {
-      /* This is the initial length of the dtv.  */
-      dtv[0].counter = dtv_length;
-
-      /* The rest of the dtv (including the generation counter) is
-	 Initialize with zero to indicate nothing there.  */
-
-      /* Add the dtv to the thread data structures.  */
-      INSTALL_DTV (result, dtv);
-    }
-  else
-    result = NULL;
-
-  return result;
-}
-
-
-/* Get size and alignment requirements of the static TLS block.  */
-void
-internal_function
-_dl_get_tls_static_info (size_t *sizep, size_t *alignp)
-{
-  *sizep = GL(dl_tls_static_size);
-  *alignp = GL(dl_tls_static_align);
-}
-
-/* Derive the location of the pointer to the start of the original
-   allocation (before alignment) from the pointer to the TCB.  */
-static inline void **
-tcb_to_pointer_to_free_location (void *tcb)
-{
-#if TLS_TCB_AT_TP
-  /* The TCB follows the TLS blocks, and the pointer to the front
-     follows the TCB.  */
-  void **original_pointer_location = tcb + TLS_TCB_SIZE;
-#elif TLS_DTV_AT_TP
-  /* The TCB comes first, preceded by the pre-TCB, and the pointer is
-     before that.  */
-  void **original_pointer_location = tcb - TLS_PRE_TCB_SIZE - sizeof (void *);
-#endif
-  return original_pointer_location;
-}
-
-void *
-internal_function
-_dl_allocate_tls_storage (void)
-{
-  void *result;
-  size_t size = GL(dl_tls_static_size);
-
-#if TLS_DTV_AT_TP
-  /* Memory layout is:
-     [ TLS_PRE_TCB_SIZE ] [ TLS_TCB_SIZE ] [ TLS blocks ]
-			  ^ This should be returned.  */
-  size += TLS_PRE_TCB_SIZE;
-#endif
-
-  /* Perform the allocation.  Reserve space for the required alignment
-     and the pointer to the original allocation.  */
-  size_t alignment = GL(dl_tls_static_align);
-  void *allocated = malloc (size + alignment + sizeof (void *));
-  if (__glibc_unlikely (allocated == NULL))
-    return NULL;
-
-  /* Perform alignment and allocate the DTV.  */
-#if TLS_TCB_AT_TP
-  /* The TCB follows the TLS blocks, which determine the alignment.
-     (TCB alignment requirements have been taken into account when
-     calculating GL(dl_tls_static_align).)  */
-  void *aligned = (void *) roundup ((uintptr_t) allocated, alignment);
-  result = aligned + size - TLS_TCB_SIZE;
-
-  /* Clear the TCB data structure.  We can't ask the caller (i.e.
-     libpthread) to do it, because we will initialize the DTV et al.  */
-  memset (result, '\0', TLS_TCB_SIZE);
-#elif TLS_DTV_AT_TP
-  /* Pre-TCB and TCB come before the TLS blocks.  The layout computed
-     in _dl_determine_tlsoffset assumes that the TCB is aligned to the
-     TLS block alignment, and not just the TLS blocks after it.  This
-     can leave an unused alignment gap between the TCB and the TLS
-     blocks.  */
-  result = (void *) roundup
-    (sizeof (void *) + TLS_PRE_TCB_SIZE + (uintptr_t) allocated,
-     alignment);
-
-  /* Clear the TCB data structure and TLS_PRE_TCB_SIZE bytes before
-     it.  We can't ask the caller (i.e. libpthread) to do it, because
-     we will initialize the DTV et al.  */
-  memset (result - TLS_PRE_TCB_SIZE, '\0', TLS_PRE_TCB_SIZE + TLS_TCB_SIZE);
-#endif
-
-  /* Record the value of the original pointer for later
-     deallocation.  */
-  *tcb_to_pointer_to_free_location (result) = allocated;
-
-  result = allocate_dtv (result);
-  if (result == NULL)
-    free (allocated);
-  return result;
-}
-
-
-#ifndef SHARED
-extern dtv_t _dl_static_dtv[];
-# define _dl_initial_dtv (&_dl_static_dtv[1])
-#endif
-
-static dtv_t *
-_dl_resize_dtv (dtv_t *dtv)
-{
-  /* Resize the dtv.  */
-  dtv_t *newp;
-  /* Load GL(dl_tls_max_dtv_idx) atomically since it may be written to by
-     other threads concurrently.  */
-  size_t newsize
-    = atomic_load_acquire (&GL(dl_tls_max_dtv_idx)) + DTV_SURPLUS;
-  size_t oldsize = dtv[-1].counter;
-
-  if (dtv == GL(dl_initial_dtv))
-    {
-      /* This is the initial dtv that was either statically allocated in
-	 __libc_setup_tls or allocated during rtld startup using the
-	 dl-minimal.c malloc instead of the real malloc.  We can't free
-	 it, we have to abandon the old storage.  */
-
-      newp = malloc ((2 + newsize) * sizeof (dtv_t));
-      if (newp == NULL)
-	oom ();
-      memcpy (newp, &dtv[-1], (2 + oldsize) * sizeof (dtv_t));
-    }
-  else
-    {
-      newp = realloc (&dtv[-1],
-		      (2 + newsize) * sizeof (dtv_t));
-      if (newp == NULL)
-	oom ();
-    }
-
-  newp[0].counter = newsize;
-
-  /* Clear the newly allocated part.  */
-  memset (newp + 2 + oldsize, '\0',
-	  (newsize - oldsize) * sizeof (dtv_t));
-
-  /* Return the generation counter.  */
-  return &newp[1];
-}
-
-
-void *
-internal_function
-_dl_allocate_tls_init (void *result)
-{
-  if (result == NULL)
-    /* The memory allocation failed.  */
-    return NULL;
-
-  dtv_t *dtv = GET_DTV (result);
-  struct dtv_slotinfo_list *listp;
-  size_t total = 0;
-  size_t maxgen = 0;
-
-  /* Check if the current dtv is big enough.   */
-  if (dtv[-1].counter < GL(dl_tls_max_dtv_idx))
-    {
-      /* Resize the dtv.  */
-      dtv = _dl_resize_dtv (dtv);
-
-      /* Install this new dtv in the thread data structures.  */
-      INSTALL_DTV (result, &dtv[-1]);
-    }
-
-  /* We have to prepare the dtv for all currently loaded modules using
-     TLS.  For those which are dynamically loaded we add the values
-     indicating deferred allocation.  */
-  listp = GL(dl_tls_dtv_slotinfo_list);
-  while (1)
-    {
-      size_t cnt;
-
-      for (cnt = total == 0 ? 1 : 0; cnt < listp->len; ++cnt)
-	{
-	  struct link_map *map;
-	  void *dest;
-
-	  /* Check for the total number of used slots.  */
-	  if (total + cnt > GL(dl_tls_max_dtv_idx))
-	    break;
-
-	  map = listp->slotinfo[cnt].map;
-	  if (map == NULL)
-	    /* Unused entry.  */
-	    continue;
-
-	  /* Keep track of the maximum generation number.  This might
-	     not be the generation counter.  */
-	  assert (listp->slotinfo[cnt].gen <= GL(dl_tls_generation));
-	  maxgen = MAX (maxgen, listp->slotinfo[cnt].gen);
-
-	  dtv[map->l_tls_modid].pointer.val = TLS_DTV_UNALLOCATED;
-	  dtv[map->l_tls_modid].pointer.to_free = NULL;
-
-	  if (map->l_tls_offset == NO_TLS_OFFSET
-	      || map->l_tls_offset == FORCED_DYNAMIC_TLS_OFFSET)
-	    continue;
-
-	  assert (map->l_tls_modid == total + cnt);
-	  assert (map->l_tls_blocksize >= map->l_tls_initimage_size);
-#if TLS_TCB_AT_TP
-	  assert ((size_t) map->l_tls_offset >= map->l_tls_blocksize);
-	  dest = (char *) result - map->l_tls_offset;
-#elif TLS_DTV_AT_TP
-	  dest = (char *) result + map->l_tls_offset;
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
-
-	  /* Set up the DTV entry.  The simplified __tls_get_addr that
-	     some platforms use in static programs requires it.  */
-	  dtv[map->l_tls_modid].pointer.val = dest;
-
-	  /* Copy the initialization image and clear the BSS part.  */
-	  memset (__mempcpy (dest, map->l_tls_initimage,
-			     map->l_tls_initimage_size), '\0',
-		  map->l_tls_blocksize - map->l_tls_initimage_size);
-	}
-
-      total += cnt;
-      if (total >= GL(dl_tls_max_dtv_idx))
-	break;
-
-      listp = listp->next;
-      assert (listp != NULL);
-    }
-
-  /* The DTV version is up-to-date now.  */
-  dtv[0].counter = maxgen;
-
-  return result;
-}
-rtld_hidden_def (_dl_allocate_tls_init)
-
-void *
-internal_function
-_dl_allocate_tls (void *mem)
-{
-  return _dl_allocate_tls_init (mem == NULL
-				? _dl_allocate_tls_storage ()
-				: allocate_dtv (mem));
-}
-rtld_hidden_def (_dl_allocate_tls)
-
-
-void
-internal_function
-_dl_deallocate_tls (void *tcb, bool dealloc_tcb)
-{
-  dtv_t *dtv = GET_DTV (tcb);
-
-  /* We need to free the memory allocated for non-static TLS.  */
-  for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt)
-    free (dtv[1 + cnt].pointer.to_free);
-
-  /* The array starts with dtv[-1].  */
-  if (dtv != GL(dl_initial_dtv))
-    free (dtv - 1);
-
-  if (dealloc_tcb)
-    free (*tcb_to_pointer_to_free_location (tcb));
-}
-rtld_hidden_def (_dl_deallocate_tls)
-
-
-#ifdef SHARED
-/* The __tls_get_addr function has two basic forms which differ in the
-   arguments.  The IA-64 form takes two parameters, the module ID and
-   offset.  The form used, among others, on IA-32 takes a reference to
-   a special structure which contain the same information.  The second
-   form seems to be more often used (in the moment) so we default to
-   it.  Users of the IA-64 form have to provide adequate definitions
-   of the following macros.  */
-# ifndef GET_ADDR_ARGS
-#  define GET_ADDR_ARGS tls_index *ti
-#  define GET_ADDR_PARAM ti
-# endif
-# ifndef GET_ADDR_MODULE
-#  define GET_ADDR_MODULE ti->ti_module
-# endif
-# ifndef GET_ADDR_OFFSET
-#  define GET_ADDR_OFFSET ti->ti_offset
-# endif
-
-/* Allocate one DTV entry.  */
-static struct dtv_pointer
-allocate_dtv_entry (size_t alignment, size_t size)
-{
-  if (powerof2 (alignment) && alignment <= _Alignof (max_align_t))
-    {
-      /* The alignment is supported by malloc.  */
-      void *ptr = malloc (size);
-      return (struct dtv_pointer) { ptr, ptr };
-    }
-
-  /* Emulate memalign to by manually aligning a pointer returned by
-     malloc.  First compute the size with an overflow check.  */
-  size_t alloc_size = size + alignment;
-  if (alloc_size < size)
-    return (struct dtv_pointer) {};
-
-  /* Perform the allocation.  This is the pointer we need to free
-     later.  */
-  void *start = malloc (alloc_size);
-  if (start == NULL)
-    return (struct dtv_pointer) {};
-
-  /* Find the aligned position within the larger allocation.  */
-  void *aligned = (void *) roundup ((uintptr_t) start, alignment);
-
-  return (struct dtv_pointer) { .val = aligned, .to_free = start };
-}
-
-static struct dtv_pointer
-allocate_and_init (struct link_map *map)
-{
-  struct dtv_pointer result = allocate_dtv_entry
-    (map->l_tls_align, map->l_tls_blocksize);
-  if (result.val == NULL)
-    oom ();
-
-  /* Initialize the memory.  */
-  memset (__mempcpy (result.val, map->l_tls_initimage,
-		     map->l_tls_initimage_size),
-	  '\0', map->l_tls_blocksize - map->l_tls_initimage_size);
-
-  return result;
-}
-
-
-struct link_map *
-_dl_update_slotinfo (unsigned long int req_modid)
-{
-  struct link_map *the_map = NULL;
-  dtv_t *dtv = THREAD_DTV ();
-
-  /* The global dl_tls_dtv_slotinfo array contains for each module
-     index the generation counter current when the entry was created.
-     This array never shrinks so that all module indices which were
-     valid at some time can be used to access it.  Before the first
-     use of a new module index in this function the array was extended
-     appropriately.  Access also does not have to be guarded against
-     modifications of the array.  It is assumed that pointer-size
-     values can be read atomically even in SMP environments.  It is
-     possible that other threads at the same time dynamically load
-     code and therefore add to the slotinfo list.  This is a problem
-     since we must not pick up any information about incomplete work.
-     The solution to this is to ignore all dtv slots which were
-     created after the one we are currently interested.  We know that
-     dynamic loading for this module is completed and this is the last
-     load operation we know finished.  */
-  unsigned long int idx = req_modid;
-  struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
-
-  while (idx >= listp->len)
-    {
-      idx -= listp->len;
-      listp = listp->next;
-    }
-
-  if (dtv[0].counter < listp->slotinfo[idx].gen)
-    {
-      /* The generation counter for the slot is higher than what the
-	 current dtv implements.  We have to update the whole dtv but
-	 only those entries with a generation counter <= the one for
-	 the entry we need.  */
-      size_t new_gen = listp->slotinfo[idx].gen;
-      size_t total = 0;
-
-      /* We have to look through the entire dtv slotinfo list.  */
-      listp =  GL(dl_tls_dtv_slotinfo_list);
-      do
-	{
-	  for (size_t cnt = total == 0 ? 1 : 0; cnt < listp->len; ++cnt)
-	    {
-	      size_t gen = listp->slotinfo[cnt].gen;
-
-	      if (gen > new_gen)
-		/* This is a slot for a generation younger than the
-		   one we are handling now.  It might be incompletely
-		   set up so ignore it.  */
-		continue;
-
-	      /* If the entry is older than the current dtv layout we
-		 know we don't have to handle it.  */
-	      if (gen <= dtv[0].counter)
-		continue;
-
-	      /* If there is no map this means the entry is empty.  */
-	      struct link_map *map = listp->slotinfo[cnt].map;
-	      if (map == NULL)
-		{
-		  if (dtv[-1].counter >= total + cnt)
-		    {
-		      /* If this modid was used at some point the memory
-			 might still be allocated.  */
-		      free (dtv[total + cnt].pointer.to_free);
-		      dtv[total + cnt].pointer.val = TLS_DTV_UNALLOCATED;
-		      dtv[total + cnt].pointer.to_free = NULL;
-		    }
-
-		  continue;
-		}
-
-	      /* Check whether the current dtv array is large enough.  */
-	      size_t modid = map->l_tls_modid;
-	      assert (total + cnt == modid);
-	      if (dtv[-1].counter < modid)
-		{
-		  /* Resize the dtv.  */
-		  dtv = _dl_resize_dtv (dtv);
-
-		  assert (modid <= dtv[-1].counter);
-
-		  /* Install this new dtv in the thread data
-		     structures.  */
-		  INSTALL_NEW_DTV (dtv);
-		}
-
-	      /* If there is currently memory allocate for this
-		 dtv entry free it.  */
-	      /* XXX Ideally we will at some point create a memory
-		 pool.  */
-	      free (dtv[modid].pointer.to_free);
-	      dtv[modid].pointer.val = TLS_DTV_UNALLOCATED;
-	      dtv[modid].pointer.to_free = NULL;
-
-	      if (modid == req_modid)
-		the_map = map;
-	    }
-
-	  total += listp->len;
-	}
-      while ((listp = listp->next) != NULL);
-
-      /* This will be the new maximum generation counter.  */
-      dtv[0].counter = new_gen;
-    }
-
-  return the_map;
-}
-
-
-static void *
-__attribute_noinline__
-tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
-{
-  /* The allocation was deferred.  Do it now.  */
-  if (the_map == NULL)
-    {
-      /* Find the link map for this module.  */
-      size_t idx = GET_ADDR_MODULE;
-      struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
-
-      while (idx >= listp->len)
-	{
-	  idx -= listp->len;
-	  listp = listp->next;
-	}
-
-      the_map = listp->slotinfo[idx].map;
-    }
-
-  /* Make sure that, if a dlopen running in parallel forces the
-     variable into static storage, we'll wait until the address in the
-     static TLS block is set up, and use that.  If we're undecided
-     yet, make sure we make the decision holding the lock as well.  */
-  if (__glibc_unlikely (the_map->l_tls_offset
-			!= FORCED_DYNAMIC_TLS_OFFSET))
-    {
-      __rtld_lock_lock_recursive (GL(dl_load_lock));
-      if (__glibc_likely (the_map->l_tls_offset == NO_TLS_OFFSET))
-	{
-	  the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET;
-	  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-	}
-      else if (__glibc_likely (the_map->l_tls_offset
-			       != FORCED_DYNAMIC_TLS_OFFSET))
-	{
-#if TLS_TCB_AT_TP
-	  void *p = (char *) THREAD_SELF - the_map->l_tls_offset;
-#elif TLS_DTV_AT_TP
-	  void *p = (char *) THREAD_SELF + the_map->l_tls_offset + TLS_PRE_TCB_SIZE;
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
-	  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-
-	  dtv[GET_ADDR_MODULE].pointer.to_free = NULL;
-	  dtv[GET_ADDR_MODULE].pointer.val = p;
-
-	  return (char *) p + GET_ADDR_OFFSET;
-	}
-      else
-	__rtld_lock_unlock_recursive (GL(dl_load_lock));
-    }
-  struct dtv_pointer result = allocate_and_init (the_map);
-  dtv[GET_ADDR_MODULE].pointer = result;
-  assert (result.to_free != NULL);
-
-  return (char *) result.val + GET_ADDR_OFFSET;
-}
-
-
-static struct link_map *
-__attribute_noinline__
-update_get_addr (GET_ADDR_ARGS)
-{
-  struct link_map *the_map = _dl_update_slotinfo (GET_ADDR_MODULE);
-  dtv_t *dtv = THREAD_DTV ();
-
-  void *p = dtv[GET_ADDR_MODULE].pointer.val;
-
-  if (__glibc_unlikely (p == TLS_DTV_UNALLOCATED))
-    return tls_get_addr_tail (GET_ADDR_PARAM, dtv, the_map);
-
-  return (void *) p + GET_ADDR_OFFSET;
-}
-
-/* For all machines that have a non-macro version of __tls_get_addr, we
-   want to use rtld_hidden_proto/rtld_hidden_def in order to call the
-   internal alias for __tls_get_addr from ld.so. This avoids a PLT entry
-   in ld.so for __tls_get_addr.  */
-
-#ifndef __tls_get_addr
-extern void * __tls_get_addr (GET_ADDR_ARGS);
-rtld_hidden_proto (__tls_get_addr)
-rtld_hidden_def (__tls_get_addr)
-#endif
-
-/* The generic dynamic and local dynamic model cannot be used in
-   statically linked applications.  */
-void *
-__tls_get_addr (GET_ADDR_ARGS)
-{
-  dtv_t *dtv = THREAD_DTV ();
-
-  if (__glibc_unlikely (dtv[0].counter != GL(dl_tls_generation)))
-    return update_get_addr (GET_ADDR_PARAM);
-
-  void *p = dtv[GET_ADDR_MODULE].pointer.val;
-
-  if (__glibc_unlikely (p == TLS_DTV_UNALLOCATED))
-    return tls_get_addr_tail (GET_ADDR_PARAM, dtv, NULL);
-
-  return (char *) p + GET_ADDR_OFFSET;
-}
-#endif
-
-
-/* Look up the module's TLS block as for __tls_get_addr,
-   but never touch anything.  Return null if it's not allocated yet.  */
-void *
-_dl_tls_get_addr_soft (struct link_map *l)
-{
-  if (__glibc_unlikely (l->l_tls_modid == 0))
-    /* This module has no TLS segment.  */
-    return NULL;
-
-  dtv_t *dtv = THREAD_DTV ();
-  if (__glibc_unlikely (dtv[0].counter != GL(dl_tls_generation)))
-    {
-      /* This thread's DTV is not completely current,
-	 but it might already cover this module.  */
-
-      if (l->l_tls_modid >= dtv[-1].counter)
-	/* Nope.  */
-	return NULL;
-
-      size_t idx = l->l_tls_modid;
-      struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
-      while (idx >= listp->len)
-	{
-	  idx -= listp->len;
-	  listp = listp->next;
-	}
-
-      /* We've reached the slot for this module.
-	 If its generation counter is higher than the DTV's,
-	 this thread does not know about this module yet.  */
-      if (dtv[0].counter < listp->slotinfo[idx].gen)
-	return NULL;
-    }
-
-  void *data = dtv[l->l_tls_modid].pointer.val;
-  if (__glibc_unlikely (data == TLS_DTV_UNALLOCATED))
-    /* The DTV is current, but this thread has not yet needed
-       to allocate this module's segment.  */
-    data = NULL;
-
-  return data;
-}
-
-
-void
-_dl_add_to_slotinfo (struct link_map *l)
-{
-  /* Now that we know the object is loaded successfully add
-     modules containing TLS data to the dtv info table.  We
-     might have to increase its size.  */
-  struct dtv_slotinfo_list *listp;
-  struct dtv_slotinfo_list *prevp;
-  size_t idx = l->l_tls_modid;
-
-  /* Find the place in the dtv slotinfo list.  */
-  listp = GL(dl_tls_dtv_slotinfo_list);
-  prevp = NULL;		/* Needed to shut up gcc.  */
-  do
-    {
-      /* Does it fit in the array of this list element?  */
-      if (idx < listp->len)
-	break;
-      idx -= listp->len;
-      prevp = listp;
-      listp = listp->next;
-    }
-  while (listp != NULL);
-
-  if (listp == NULL)
-    {
-      /* When we come here it means we have to add a new element
-	 to the slotinfo list.  And the new module must be in
-	 the first slot.  */
-      assert (idx == 0);
-
-      listp = prevp->next = (struct dtv_slotinfo_list *)
-	malloc (sizeof (struct dtv_slotinfo_list)
-		+ TLS_SLOTINFO_SURPLUS * sizeof (struct dtv_slotinfo));
-      if (listp == NULL)
-	{
-	  /* We ran out of memory.  We will simply fail this
-	     call but don't undo anything we did so far.  The
-	     application will crash or be terminated anyway very
-	     soon.  */
-
-	  /* We have to do this since some entries in the dtv
-	     slotinfo array might already point to this
-	     generation.  */
-	  ++GL(dl_tls_generation);
-
-	  _dl_signal_error (ENOMEM, "dlopen", NULL, N_("\
-cannot create TLS data structures"));
-	}
-
-      listp->len = TLS_SLOTINFO_SURPLUS;
-      listp->next = NULL;
-      memset (listp->slotinfo, '\0',
-	      TLS_SLOTINFO_SURPLUS * sizeof (struct dtv_slotinfo));
-    }
-
-  /* Add the information into the slotinfo data structure.  */
-  listp->slotinfo[idx].map = l;
-  listp->slotinfo[idx].gen = GL(dl_tls_generation) + 1;
-}
diff --git a/elf/dl-trampoline.c b/elf/dl-trampoline.c
deleted file mode 100644
index 3ca89f3879..0000000000
--- a/elf/dl-trampoline.c
+++ /dev/null
@@ -1 +0,0 @@
-#error "Architecture specific PLT trampolines must be defined."
diff --git a/elf/dl-tunable-types.h b/elf/dl-tunable-types.h
deleted file mode 100644
index 1d516df08f..0000000000
--- a/elf/dl-tunable-types.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Tunable type information.
-
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _TUNABLE_TYPES_H_
-# define _TUNABLE_TYPES_H_
-#include <stddef.h>
-
-typedef enum
-{
-  TUNABLE_TYPE_INT_32,
-  TUNABLE_TYPE_UINT_64,
-  TUNABLE_TYPE_SIZE_T,
-  TUNABLE_TYPE_STRING
-} tunable_type_code_t;
-
-typedef struct
-{
-  tunable_type_code_t type_code;
-  int64_t min;
-  int64_t max;
-} tunable_type_t;
-
-typedef union
-{
-  int64_t numval;
-  const char *strval;
-} tunable_val_t;
-
-typedef void (*tunable_callback_t) (tunable_val_t *);
-
-/* Security level for tunables.  This decides what to do with individual
-   tunables for AT_SECURE binaries.  */
-typedef enum
-{
-  /* Erase the tunable for AT_SECURE binaries so that child processes don't
-     read it.  */
-  TUNABLE_SECLEVEL_SXID_ERASE = 0,
-  /* Ignore the tunable for AT_SECURE binaries, but don't erase it, so that
-     child processes can read it.  */
-  TUNABLE_SECLEVEL_SXID_IGNORE = 1,
-  /* Read the tunable.  */
-  TUNABLE_SECLEVEL_NONE = 2,
-} tunable_seclevel_t;
-
-
-#endif
diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c
deleted file mode 100644
index 76e8c5cae1..0000000000
--- a/elf/dl-tunables.c
+++ /dev/null
@@ -1,490 +0,0 @@
-/* The tunable framework.  See the README.tunables to know how to use the
-   tunable in a glibc module.
-
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdint.h>
-#include <stdbool.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sysdep.h>
-#include <fcntl.h>
-#include <ldsodefs.h>
-
-#define TUNABLES_INTERNAL 1
-#include "dl-tunables.h"
-
-#if TUNABLES_FRONTEND == TUNABLES_FRONTEND_valstring
-# define GLIBC_TUNABLES "GLIBC_TUNABLES"
-#endif
-
-/* Compare environment or tunable names, bounded by the name hardcoded in
-   glibc.  */
-static bool
-is_name (const char *orig, const char *envname)
-{
-  for (;*orig != '\0' && *envname != '\0'; envname++, orig++)
-    if (*orig != *envname)
-      break;
-
-  /* The ENVNAME is immediately followed by a value.  */
-  if (*orig == '\0' && *envname == '=')
-    return true;
-  else
-    return false;
-}
-
-#if TUNABLES_FRONTEND == TUNABLES_FRONTEND_valstring
-static char *
-tunables_strdup (const char *in)
-{
-  size_t i = 0;
-
-  while (in[i++] != '\0');
-  char *out = __sbrk (i);
-
-  /* FIXME: In reality if the allocation fails, __sbrk will crash attempting to
-     set the thread-local errno since the TCB has not yet been set up.  This
-     needs to be fixed with an __sbrk implementation that does not set
-     errno.  */
-  if (out == (void *)-1)
-    return NULL;
-
-  i--;
-
-  while (i-- > 0)
-    out[i] = in[i];
-
-  return out;
-}
-#endif
-
-static char **
-get_next_env (char **envp, char **name, size_t *namelen, char **val,
-	      char ***prev_envp)
-{
-  while (envp != NULL && *envp != NULL)
-    {
-      char **prev = envp;
-      char *envline = *envp++;
-      int len = 0;
-
-      while (envline[len] != '\0' && envline[len] != '=')
-	len++;
-
-      /* Just the name and no value, go to the next one.  */
-      if (envline[len] == '\0')
-	continue;
-
-      *name = envline;
-      *namelen = len;
-      *val = &envline[len + 1];
-      *prev_envp = prev;
-
-      return envp;
-    }
-
-  return NULL;
-}
-
-/* A stripped down strtoul-like implementation for very early use.  It does not
-   set errno if the result is outside bounds because it gets called before
-   errno may have been set up.  */
-static uint64_t
-tunables_strtoul (const char *nptr)
-{
-  uint64_t result = 0;
-  long int sign = 1;
-  unsigned max_digit;
-
-  while (*nptr == ' ' || *nptr == '\t')
-    ++nptr;
-
-  if (*nptr == '-')
-    {
-      sign = -1;
-      ++nptr;
-    }
-  else if (*nptr == '+')
-    ++nptr;
-
-  if (*nptr < '0' || *nptr > '9')
-    return 0UL;
-
-  int base = 10;
-  max_digit = 9;
-  if (*nptr == '0')
-    {
-      if (nptr[1] == 'x' || nptr[1] == 'X')
-	{
-	  base = 16;
-	  nptr += 2;
-	}
-      else
-	{
-	  base = 8;
-	  max_digit = 7;
-	}
-    }
-
-  while (1)
-    {
-      int digval;
-      if (*nptr >= '0' && *nptr <= '0' + max_digit)
-        digval = *nptr - '0';
-      else if (base == 16)
-        {
-	  if (*nptr >= 'a' && *nptr <= 'f')
-	    digval = *nptr - 'a' + 10;
-	  else if (*nptr >= 'A' && *nptr <= 'F')
-	    digval = *nptr - 'A' + 10;
-	  else
-	    break;
-	}
-      else
-        break;
-
-      if (result >= (UINT64_MAX - digval) / base)
-	return UINT64_MAX;
-      result *= base;
-      result += digval;
-      ++nptr;
-    }
-
-  return result * sign;
-}
-
-#define TUNABLE_SET_VAL_IF_VALID_RANGE(__cur, __val, __type, __default_min, \
-				       __default_max)			      \
-({									      \
-  __type min = (__cur)->type.min;					      \
-  __type max = (__cur)->type.max;					      \
-									      \
-  if (min == max)							      \
-    {									      \
-      min = __default_min;						      \
-      max = __default_max;						      \
-    }									      \
-									      \
-  if ((__type) (__val) >= min && (__type) (val) <= max)			      \
-    {									      \
-      (__cur)->val.numval = val;					      \
-      (__cur)->initialized = true;					      \
-    }									      \
-})
-
-static void
-do_tunable_update_val (tunable_t *cur, const void *valp)
-{
-  uint64_t val;
-
-  if (cur->type.type_code != TUNABLE_TYPE_STRING)
-    val = *((int64_t *) valp);
-
-  switch (cur->type.type_code)
-    {
-    case TUNABLE_TYPE_INT_32:
-	{
-	  TUNABLE_SET_VAL_IF_VALID_RANGE (cur, val, int64_t, INT32_MIN, INT32_MAX);
-	  break;
-	}
-    case TUNABLE_TYPE_UINT_64:
-	{
-	  TUNABLE_SET_VAL_IF_VALID_RANGE (cur, val, uint64_t, 0, UINT64_MAX);
-	  break;
-	}
-    case TUNABLE_TYPE_SIZE_T:
-	{
-	  TUNABLE_SET_VAL_IF_VALID_RANGE (cur, val, uint64_t, 0, SIZE_MAX);
-	  break;
-	}
-    case TUNABLE_TYPE_STRING:
-	{
-	  cur->val.strval = valp;
-	  break;
-	}
-    default:
-      __builtin_unreachable ();
-    }
-}
-
-/* Validate range of the input value and initialize the tunable CUR if it looks
-   good.  */
-static void
-tunable_initialize (tunable_t *cur, const char *strval)
-{
-  uint64_t val;
-  const void *valp;
-
-  if (cur->type.type_code != TUNABLE_TYPE_STRING)
-    {
-      val = tunables_strtoul (strval);
-      valp = &val;
-    }
-  else
-    {
-      cur->initialized = true;
-      valp = strval;
-    }
-  do_tunable_update_val (cur, valp);
-}
-
-void
-__tunable_set_val (tunable_id_t id, void *valp)
-{
-  tunable_t *cur = &tunable_list[id];
-
-  do_tunable_update_val (cur, valp);
-}
-
-#if TUNABLES_FRONTEND == TUNABLES_FRONTEND_valstring
-/* Parse the tunable string TUNESTR and adjust it to drop any tunables that may
-   be unsafe for AT_SECURE processes so that it can be used as the new
-   environment variable value for GLIBC_TUNABLES.  VALSTRING is the original
-   environment variable string which we use to make NULL terminated values so
-   that we don't have to allocate memory again for it.  */
-static void
-parse_tunables (char *tunestr, char *valstring)
-{
-  if (tunestr == NULL || *tunestr == '\0')
-    return;
-
-  char *p = tunestr;
-
-  while (true)
-    {
-      char *name = p;
-      size_t len = 0;
-
-      /* First, find where the name ends.  */
-      while (p[len] != '=' && p[len] != ':' && p[len] != '\0')
-	len++;
-
-      /* If we reach the end of the string before getting a valid name-value
-	 pair, bail out.  */
-      if (p[len] == '\0')
-	return;
-
-      /* We did not find a valid name-value pair before encountering the
-	 colon.  */
-      if (p[len]== ':')
-	{
-	  p += len + 1;
-	  continue;
-	}
-
-      p += len + 1;
-
-      /* Take the value from the valstring since we need to NULL terminate it.  */
-      char *value = &valstring[p - tunestr];
-      len = 0;
-
-      while (p[len] != ':' && p[len] != '\0')
-	len++;
-
-      /* Add the tunable if it exists.  */
-      for (size_t i = 0; i < sizeof (tunable_list) / sizeof (tunable_t); i++)
-	{
-	  tunable_t *cur = &tunable_list[i];
-
-	  if (is_name (cur->name, name))
-	    {
-	      /* If we are in a secure context (AT_SECURE) then ignore the tunable
-		 unless it is explicitly marked as secure.  Tunable values take
-		 precendence over their envvar aliases.  */
-	      if (__libc_enable_secure)
-		{
-		  if (cur->security_level == TUNABLE_SECLEVEL_SXID_ERASE)
-		    {
-		      if (p[len] == '\0')
-			{
-			  /* Last tunable in the valstring.  Null-terminate and
-			     return.  */
-			  *name = '\0';
-			  return;
-			}
-		      else
-			{
-			  /* Remove the current tunable from the string.  We do
-			     this by overwriting the string starting from NAME
-			     (which is where the current tunable begins) with
-			     the remainder of the string.  We then have P point
-			     to NAME so that we continue in the correct
-			     position in the valstring.  */
-			  char *q = &p[len + 1];
-			  p = name;
-			  while (*q != '\0')
-			    *name++ = *q++;
-			  name[0] = '\0';
-			  len = 0;
-			}
-		    }
-
-		  if (cur->security_level != TUNABLE_SECLEVEL_NONE)
-		    break;
-		}
-
-	      value[len] = '\0';
-	      tunable_initialize (cur, value);
-	      break;
-	    }
-	}
-
-      if (p[len] == '\0')
-	return;
-      else
-	p += len + 1;
-    }
-}
-#endif
-
-/* Enable the glibc.malloc.check tunable in SETUID/SETGID programs only when
-   the system administrator has created the /etc/suid-debug file.  This is a
-   special case where we want to conditionally enable/disable a tunable even
-   for setuid binaries.  We use the special version of access() to avoid
-   setting ERRNO, which is a TLS variable since TLS has not yet been set
-   up.  */
-static inline void
-__always_inline
-maybe_enable_malloc_check (void)
-{
-  tunable_id_t id = TUNABLE_ENUM_NAME (glibc, malloc, check);
-  if (__libc_enable_secure && __access_noerrno ("/etc/suid-debug", F_OK) == 0)
-    tunable_list[id].security_level = TUNABLE_SECLEVEL_NONE;
-}
-
-/* Initialize the tunables list from the environment.  For now we only use the
-   ENV_ALIAS to find values.  Later we will also use the tunable names to find
-   values.  */
-void
-__tunables_init (char **envp)
-{
-  char *envname = NULL;
-  char *envval = NULL;
-  size_t len = 0;
-  char **prev_envp = envp;
-
-  maybe_enable_malloc_check ();
-
-  while ((envp = get_next_env (envp, &envname, &len, &envval,
-			       &prev_envp)) != NULL)
-    {
-#if TUNABLES_FRONTEND == TUNABLES_FRONTEND_valstring
-      if (is_name (GLIBC_TUNABLES, envname))
-	{
-	  char *new_env = tunables_strdup (envname);
-	  if (new_env != NULL)
-	    parse_tunables (new_env + len + 1, envval);
-	  /* Put in the updated envval.  */
-	  *prev_envp = new_env;
-	  continue;
-	}
-#endif
-
-      for (int i = 0; i < sizeof (tunable_list) / sizeof (tunable_t); i++)
-	{
-	  tunable_t *cur = &tunable_list[i];
-
-	  /* Skip over tunables that have either been set already or should be
-	     skipped.  */
-	  if (cur->initialized || cur->env_alias == NULL)
-	    continue;
-
-	  const char *name = cur->env_alias;
-
-	  /* We have a match.  Initialize and move on to the next line.  */
-	  if (is_name (name, envname))
-	    {
-	      /* For AT_SECURE binaries, we need to check the security settings of
-		 the tunable and decide whether we read the value and also whether
-		 we erase the value so that child processes don't inherit them in
-		 the environment.  */
-	      if (__libc_enable_secure)
-		{
-		  if (cur->security_level == TUNABLE_SECLEVEL_SXID_ERASE)
-		    {
-		      /* Erase the environment variable.  */
-		      char **ep = prev_envp;
-
-		      while (*ep != NULL)
-			{
-			  if (is_name (name, *ep))
-			    {
-			      char **dp = ep;
-
-			      do
-				dp[0] = dp[1];
-			      while (*dp++);
-			    }
-			  else
-			    ++ep;
-			}
-		      /* Reset the iterator so that we read the environment again
-			 from the point we erased.  */
-		      envp = prev_envp;
-		    }
-
-		  if (cur->security_level != TUNABLE_SECLEVEL_NONE)
-		    continue;
-		}
-
-	      tunable_initialize (cur, envval);
-	      break;
-	    }
-	}
-    }
-}
-
-/* Set the tunable value.  This is called by the module that the tunable exists
-   in. */
-void
-__tunable_get_val (tunable_id_t id, void *valp, tunable_callback_t callback)
-{
-  tunable_t *cur = &tunable_list[id];
-
-  switch (cur->type.type_code)
-    {
-    case TUNABLE_TYPE_UINT_64:
-	{
-	  *((uint64_t *) valp) = (uint64_t) cur->val.numval;
-	  break;
-	}
-    case TUNABLE_TYPE_INT_32:
-	{
-	  *((int32_t *) valp) = (int32_t) cur->val.numval;
-	  break;
-	}
-    case TUNABLE_TYPE_SIZE_T:
-	{
-	  *((size_t *) valp) = (size_t) cur->val.numval;
-	  break;
-	}
-    case TUNABLE_TYPE_STRING:
-	{
-	  *((const char **)valp) = cur->val.strval;
-	  break;
-	}
-    default:
-      __builtin_unreachable ();
-    }
-
-  if (cur->initialized && callback != NULL)
-    callback (&cur->val);
-}
-
-rtld_hidden_def (__tunable_get_val)
diff --git a/elf/dl-tunables.h b/elf/dl-tunables.h
deleted file mode 100644
index 6c49dcbf47..0000000000
--- a/elf/dl-tunables.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* The tunable framework.  See the README to know how to use the tunable in
-   a glibc module.
-
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _TUNABLES_H_
-#define _TUNABLES_H_
-
-#if !HAVE_TUNABLES
-static inline void
-__always_inline
-__tunables_init (char **unused __attribute__ ((unused)))
-{
-  /* This is optimized out if tunables are not enabled.  */
-}
-#else
-
-# include <stddef.h>
-# include "dl-tunable-types.h"
-
-/* A tunable.  */
-struct _tunable
-{
-  const char *name;			/* Internal name of the tunable.  */
-  tunable_type_t type;			/* Data type of the tunable.  */
-  tunable_val_t val;			/* The value.  */
-  bool initialized;			/* Flag to indicate that the tunable is
-					   initialized.  */
-  tunable_seclevel_t security_level;	/* Specify the security level for the
-					   tunable with respect to AT_SECURE
-					   programs.  See description of
-					   tunable_seclevel_t to see a
-					   description of the values.
-
-					   Note that even if the tunable is
-					   read, it may not get used by the
-					   target module if the value is
-					   considered unsafe.  */
-  /* Compatibility elements.  */
-  const char *env_alias;		/* The compatibility environment
-					   variable name.  */
-};
-
-typedef struct _tunable tunable_t;
-
-/* Full name for a tunable is top_ns.tunable_ns.id.  */
-# define TUNABLE_NAME_S(top,ns,id) #top "." #ns "." #id
-
-# define TUNABLE_ENUM_NAME(__top,__ns,__id) TUNABLE_ENUM_NAME1 (__top,__ns,__id)
-# define TUNABLE_ENUM_NAME1(__top,__ns,__id) __top ## _ ## __ns ## _ ## __id
-
-# include "dl-tunable-list.h"
-
-extern void __tunables_init (char **);
-extern void __tunable_get_val (tunable_id_t, void *, tunable_callback_t);
-extern void __tunable_set_val (tunable_id_t, void *);
-rtld_hidden_proto (__tunables_init)
-rtld_hidden_proto (__tunable_get_val)
-
-/* Define TUNABLE_GET and TUNABLE_SET in short form if TOP_NAMESPACE and
-   TUNABLE_NAMESPACE are defined.  This is useful shorthand to get and set
-   tunables within a module.  */
-#if defined TOP_NAMESPACE && defined TUNABLE_NAMESPACE
-# define TUNABLE_GET(__id, __type, __cb) \
-  TUNABLE_GET_FULL (TOP_NAMESPACE, TUNABLE_NAMESPACE, __id, __type, __cb)
-# define TUNABLE_SET(__id, __type, __val) \
-  TUNABLE_SET_FULL (TOP_NAMESPACE, TUNABLE_NAMESPACE, __id, __type, __val)
-#else
-# define TUNABLE_GET(__top, __ns, __id, __type, __cb) \
-  TUNABLE_GET_FULL (__top, __ns, __id, __type, __cb)
-# define TUNABLE_SET(__top, __ns, __id, __type, __val) \
-  TUNABLE_SET_FULL (__top, __ns, __id, __type, __val)
-#endif
-
-/* Get and return a tunable value.  If the tunable was set externally and __CB
-   is defined then call __CB before returning the value.  */
-# define TUNABLE_GET_FULL(__top, __ns, __id, __type, __cb) \
-({									      \
-  tunable_id_t id = TUNABLE_ENUM_NAME (__top, __ns, __id);		      \
-  __type ret;								      \
-  __tunable_get_val (id, &ret, __cb);					      \
-  ret;									      \
-})
-
-/* Set a tunable value.  */
-# define TUNABLE_SET_FULL(__top, __ns, __id, __type, __val) \
-({									      \
-  __tunable_set_val (TUNABLE_ENUM_NAME (__top, __ns, __id),		      \
-			& (__type) {__val});				      \
-})
-
-/* Namespace sanity for callback functions.  Use this macro to keep the
-   namespace of the modules clean.  */
-# define TUNABLE_CALLBACK(__name) _dl_tunable_ ## __name
-
-# define TUNABLES_FRONTEND_valstring 1
-/* The default value for TUNABLES_FRONTEND.  */
-# define TUNABLES_FRONTEND_yes TUNABLES_FRONTEND_valstring
-#endif
-#endif
diff --git a/elf/dl-tunables.list b/elf/dl-tunables.list
deleted file mode 100644
index 41ce9afa28..0000000000
--- a/elf/dl-tunables.list
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright (C) 2016-2017 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, see
-# <http://www.gnu.org/licenses/>.
-
-# Allowed attributes for tunables:
-#
-# type: Defaults to STRING
-# minval: Optional minimum acceptable value
-# maxval: Optional maximum acceptable value
-# env_alias: An alias environment variable
-# security_level: Specify security level of the tunable.  Valid values are:
-#
-# 	     SXID_ERASE: (default) Don't read for AT_SECURE binaries and
-# 	     		 removed so that child processes can't read it.
-# 	     SXID_IGNORE: Don't read for AT_SECURE binaries, but retained for
-# 	     		  non-AT_SECURE subprocesses.
-# 	     NONE: Read all the time.
-
-glibc {
-  malloc {
-    check {
-      type: INT_32
-      minval: 0
-      maxval: 3
-      env_alias: MALLOC_CHECK_
-    }
-    top_pad {
-      type: SIZE_T
-      env_alias: MALLOC_TOP_PAD_
-      security_level: SXID_IGNORE
-    }
-    perturb {
-      type: INT_32
-      minval: 0
-      maxval: 0xff
-      env_alias: MALLOC_PERTURB_
-      security_level: SXID_IGNORE
-    }
-    mmap_threshold {
-      type: SIZE_T
-      env_alias: MALLOC_MMAP_THRESHOLD_
-      security_level: SXID_IGNORE
-    }
-    trim_threshold {
-      type: SIZE_T
-      env_alias: MALLOC_TRIM_THRESHOLD_
-      security_level: SXID_IGNORE
-    }
-    mmap_max {
-      type: INT_32
-      env_alias: MALLOC_MMAP_MAX_
-      security_level: SXID_IGNORE
-    }
-    arena_max {
-      type: SIZE_T
-      env_alias: MALLOC_ARENA_MAX
-      minval: 1
-      security_level: SXID_IGNORE
-    }
-    arena_test {
-      type: SIZE_T
-      env_alias: MALLOC_ARENA_TEST
-      minval: 1
-      security_level: SXID_IGNORE
-    }
-  }
-  tune {
-    hwcap_mask {
-      type: UINT_64
-      env_alias: LD_HWCAP_MASK
-      default: HWCAP_IMPORTANT
-    }
-  }
-}
diff --git a/elf/dl-unmap-segments.h b/elf/dl-unmap-segments.h
deleted file mode 100644
index f37e183943..0000000000
--- a/elf/dl-unmap-segments.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Unmap a shared object's segments.  Generic version.
-   Copyright (C) 2014-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _DL_UNMAP_SEGMENTS_H
-#define _DL_UNMAP_SEGMENTS_H	1
-
-#include <link.h>
-#include <sys/mman.h>
-
-/* _dl_map_segments ensures that any whole pages in gaps between segments
-   are filled in with PROT_NONE mappings.  So we can just unmap the whole
-   range in one fell swoop.  */
-
-static __always_inline void
-_dl_unmap_segments (struct link_map *l)
-{
-  __munmap ((void *) l->l_map_start, l->l_map_end - l->l_map_start);
-}
-
-#endif  /* dl-unmap-segments.h */
diff --git a/elf/dl-version.c b/elf/dl-version.c
deleted file mode 100644
index c00078e5e4..0000000000
--- a/elf/dl-version.c
+++ /dev/null
@@ -1,389 +0,0 @@
-/* Handle symbol and library versioning.
-   Copyright (C) 1997-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <elf.h>
-#include <errno.h>
-#include <libintl.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ldsodefs.h>
-#include <_itoa.h>
-
-#include <assert.h>
-
-
-#define make_string(string, rest...) \
-  ({									      \
-    const char *all[] = { string, ## rest };				      \
-    size_t len, cnt;							      \
-    char *result, *cp;							      \
-									      \
-    len = 1;								      \
-    for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt)		      \
-      len += strlen (all[cnt]);						      \
-									      \
-    cp = result = alloca (len);						      \
-    for (cnt = 0; cnt < sizeof (all) / sizeof (all[0]); ++cnt)		      \
-      cp = __stpcpy (cp, all[cnt]);					      \
-									      \
-    result;								      \
-  })
-
-
-static inline struct link_map *
-__attribute ((always_inline))
-find_needed (const char *name, struct link_map *map)
-{
-  struct link_map *tmap;
-  unsigned int n;
-
-  for (tmap = GL(dl_ns)[map->l_ns]._ns_loaded; tmap != NULL;
-       tmap = tmap->l_next)
-    if (_dl_name_match_p (name, tmap))
-      return tmap;
-
-  /* The required object is not in the global scope, look to see if it is
-     a dependency of the current object.  */
-  for (n = 0; n < map->l_searchlist.r_nlist; n++)
-    if (_dl_name_match_p (name, map->l_searchlist.r_list[n]))
-      return map->l_searchlist.r_list[n];
-
-  /* Should never happen.  */
-  return NULL;
-}
-
-
-static int
-internal_function
-match_symbol (const char *name, Lmid_t ns, ElfW(Word) hash, const char *string,
-	      struct link_map *map, int verbose, int weak)
-{
-  const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
-  ElfW(Addr) def_offset;
-  ElfW(Verdef) *def;
-  /* Initialize to make the compiler happy.  */
-  const char *errstring = NULL;
-  int result = 0;
-
-  /* Display information about what we are doing while debugging.  */
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_VERSIONS))
-    _dl_debug_printf ("\
-checking for version `%s' in file %s [%lu] required by file %s [%lu]\n",
-		      string, DSO_FILENAME (map->l_name),
-		      map->l_ns, name, ns);
-
-  if (__glibc_unlikely (map->l_info[VERSYMIDX (DT_VERDEF)] == NULL))
-    {
-      /* The file has no symbol versioning.  I.e., the dependent
-	 object was linked against another version of this file.  We
-	 only print a message if verbose output is requested.  */
-      if (verbose)
-	{
-	  /* XXX We cannot translate the messages.  */
-	  errstring = make_string ("\
-no version information available (required by ", name, ")");
-	  goto call_cerror;
-	}
-      return 0;
-    }
-
-  def_offset = map->l_info[VERSYMIDX (DT_VERDEF)]->d_un.d_ptr;
-  assert (def_offset != 0);
-
-  def = (ElfW(Verdef) *) ((char *) map->l_addr + def_offset);
-  while (1)
-    {
-      /* Currently the version number of the definition entry is 1.
-	 Make sure all we see is this version.  */
-      if (__builtin_expect (def->vd_version, 1) != 1)
-	{
-	  char buf[20];
-	  buf[sizeof (buf) - 1] = '\0';
-	  /* XXX We cannot translate the message.  */
-	  errstring = make_string ("unsupported version ",
-				   _itoa (def->vd_version,
-					  &buf[sizeof (buf) - 1], 10, 0),
-				   " of Verdef record");
-	  result = 1;
-	  goto call_cerror;
-	}
-
-      /* Compare the hash values.  */
-      if (hash == def->vd_hash)
-	{
-	  ElfW(Verdaux) *aux = (ElfW(Verdaux) *) ((char *) def + def->vd_aux);
-
-	  /* To be safe, compare the string as well.  */
-	  if (__builtin_expect (strcmp (string, strtab + aux->vda_name), 0)
-	      == 0)
-	    /* Bingo!  */
-	    return 0;
-	}
-
-      /* If no more definitions we failed to find what we want.  */
-      if (def->vd_next == 0)
-	break;
-
-      /* Next definition.  */
-      def = (ElfW(Verdef) *) ((char *) def + def->vd_next);
-    }
-
-  /* Symbol not found.  If it was a weak reference it is not fatal.  */
-  if (__glibc_likely (weak))
-    {
-      if (verbose)
-	{
-	  /* XXX We cannot translate the message.  */
-	  errstring = make_string ("weak version `", string,
-				   "' not found (required by ", name, ")");
-	  goto call_cerror;
-	}
-      return 0;
-    }
-
-  /* XXX We cannot translate the message.  */
-  errstring = make_string ("version `", string, "' not found (required by ",
-			   name, ")");
-  result = 1;
- call_cerror:
-  _dl_signal_cerror (0, DSO_FILENAME (map->l_name),
-		     N_("version lookup error"), errstring);
-  return result;
-}
-
-
-int
-internal_function
-_dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
-{
-  int result = 0;
-  const char *strtab;
-  /* Pointer to section with needed versions.  */
-  ElfW(Dyn) *dyn;
-  /* Pointer to dynamic section with definitions.  */
-  ElfW(Dyn) *def;
-  /* We need to find out which is the highest version index used
-    in a dependecy.  */
-  unsigned int ndx_high = 0;
-  /* Initialize to make the compiler happy.  */
-  const char *errstring = NULL;
-  int errval = 0;
-
-  /* If we don't have a string table, we must be ok.  */
-  if (map->l_info[DT_STRTAB] == NULL)
-    return 0;
-  strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
-
-  dyn = map->l_info[VERSYMIDX (DT_VERNEED)];
-  def = map->l_info[VERSYMIDX (DT_VERDEF)];
-
-  if (dyn != NULL)
-    {
-      /* This file requires special versions from its dependencies.  */
-      ElfW(Verneed) *ent = (ElfW(Verneed) *) (map->l_addr + dyn->d_un.d_ptr);
-
-      /* Currently the version number of the needed entry is 1.
-	 Make sure all we see is this version.  */
-      if (__builtin_expect (ent->vn_version, 1) != 1)
-	{
-	  char buf[20];
-	  buf[sizeof (buf) - 1] = '\0';
-	  /* XXX We cannot translate the message.  */
-	  errstring = make_string ("unsupported version ",
-				   _itoa (ent->vn_version,
-					  &buf[sizeof (buf) - 1], 10, 0),
-				   " of Verneed record\n");
-	call_error:
-	  _dl_signal_error (errval, DSO_FILENAME (map->l_name),
-			    NULL, errstring);
-	}
-
-      while (1)
-	{
-	  ElfW(Vernaux) *aux;
-	  struct link_map *needed = find_needed (strtab + ent->vn_file, map);
-
-	  /* If NEEDED is NULL this means a dependency was not found
-	     and no stub entry was created.  This should never happen.  */
-	  assert (needed != NULL);
-
-	  /* Make sure this is no stub we created because of a missing
-	     dependency.  */
-	  if (__builtin_expect (! trace_mode, 1)
-	      || ! __builtin_expect (needed->l_faked, 0))
-	    {
-	      /* NEEDED is the map for the file we need.  Now look for the
-		 dependency symbols.  */
-	      aux = (ElfW(Vernaux) *) ((char *) ent + ent->vn_aux);
-	      while (1)
-		{
-		  /* Match the symbol.  */
-		  result |= match_symbol (DSO_FILENAME (map->l_name),
-					  map->l_ns, aux->vna_hash,
-					  strtab + aux->vna_name,
-					  needed->l_real, verbose,
-					  aux->vna_flags & VER_FLG_WEAK);
-
-		  /* Compare the version index.  */
-		  if ((unsigned int) (aux->vna_other & 0x7fff) > ndx_high)
-		    ndx_high = aux->vna_other & 0x7fff;
-
-		  if (aux->vna_next == 0)
-		    /* No more symbols.  */
-		    break;
-
-		  /* Next symbol.  */
-		  aux = (ElfW(Vernaux) *) ((char *) aux + aux->vna_next);
-		}
-	    }
-
-	  if (ent->vn_next == 0)
-	    /* No more dependencies.  */
-	    break;
-
-	  /* Next dependency.  */
-	  ent = (ElfW(Verneed) *) ((char *) ent + ent->vn_next);
-	}
-    }
-
-  /* We also must store the names of the defined versions.  Determine
-     the maximum index here as well.
-
-     XXX We could avoid the loop by just taking the number of definitions
-     as an upper bound of new indeces.  */
-  if (def != NULL)
-    {
-      ElfW(Verdef) *ent;
-      ent = (ElfW(Verdef) *) (map->l_addr + def->d_un.d_ptr);
-      while (1)
-	{
-	  if ((unsigned int) (ent->vd_ndx & 0x7fff) > ndx_high)
-	    ndx_high = ent->vd_ndx & 0x7fff;
-
-	  if (ent->vd_next == 0)
-	    /* No more definitions.  */
-	    break;
-
-	  ent = (ElfW(Verdef) *) ((char *) ent + ent->vd_next);
-	}
-    }
-
-  if (ndx_high > 0)
-    {
-      /* Now we are ready to build the array with the version names
-	 which can be indexed by the version index in the VERSYM
-	 section.  */
-      map->l_versions = (struct r_found_version *)
-	calloc (ndx_high + 1, sizeof (*map->l_versions));
-      if (__glibc_unlikely (map->l_versions == NULL))
-	{
-	  errstring = N_("cannot allocate version reference table");
-	  errval = ENOMEM;
-	  goto call_error;
-	}
-
-      /* Store the number of available symbols.  */
-      map->l_nversions = ndx_high + 1;
-
-      /* Compute the pointer to the version symbols.  */
-      map->l_versyms = (void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
-
-      if (dyn != NULL)
-	{
-	  ElfW(Verneed) *ent;
-	  ent = (ElfW(Verneed) *) (map->l_addr + dyn->d_un.d_ptr);
-	  while (1)
-	    {
-	      ElfW(Vernaux) *aux;
-	      aux = (ElfW(Vernaux) *) ((char *) ent + ent->vn_aux);
-	      while (1)
-		{
-		  ElfW(Half) ndx = aux->vna_other & 0x7fff;
-		  /* In trace mode, dependencies may be missing.  */
-		  if (__glibc_likely (ndx < map->l_nversions))
-		    {
-		      map->l_versions[ndx].hash = aux->vna_hash;
-		      map->l_versions[ndx].hidden = aux->vna_other & 0x8000;
-		      map->l_versions[ndx].name = &strtab[aux->vna_name];
-		      map->l_versions[ndx].filename = &strtab[ent->vn_file];
-		    }
-
-		  if (aux->vna_next == 0)
-		    /* No more symbols.  */
-		    break;
-
-		  /* Advance to next symbol.  */
-		  aux = (ElfW(Vernaux) *) ((char *) aux + aux->vna_next);
-		}
-
-	      if (ent->vn_next == 0)
-		/* No more dependencies.  */
-		break;
-
-	      /* Advance to next dependency.  */
-	      ent = (ElfW(Verneed) *) ((char *) ent + ent->vn_next);
-	    }
-	}
-
-      /* And insert the defined versions.  */
-      if (def != NULL)
-	{
-	  ElfW(Verdef) *ent;
-	  ent = (ElfW(Verdef)  *) (map->l_addr + def->d_un.d_ptr);
-	  while (1)
-	    {
-	      ElfW(Verdaux) *aux;
-	      aux = (ElfW(Verdaux) *) ((char *) ent + ent->vd_aux);
-
-	      if ((ent->vd_flags & VER_FLG_BASE) == 0)
-		{
-		  /* The name of the base version should not be
-		     available for matching a versioned symbol.  */
-		  ElfW(Half) ndx = ent->vd_ndx & 0x7fff;
-		  map->l_versions[ndx].hash = ent->vd_hash;
-		  map->l_versions[ndx].name = &strtab[aux->vda_name];
-		  map->l_versions[ndx].filename = NULL;
-		}
-
-	      if (ent->vd_next == 0)
-		/* No more definitions.  */
-		break;
-
-	      ent = (ElfW(Verdef) *) ((char *) ent + ent->vd_next);
-	    }
-	}
-    }
-
-  return result;
-}
-
-
-int
-internal_function
-_dl_check_all_versions (struct link_map *map, int verbose, int trace_mode)
-{
-  struct link_map *l;
-  int result = 0;
-
-  for (l = map; l != NULL; l = l->l_next)
-    result |= (! l->l_faked
-	       && _dl_check_map_versions (l, verbose, trace_mode));
-
-  return result;
-}
diff --git a/elf/dl-writev.h b/elf/dl-writev.h
deleted file mode 100644
index 4db083bef6..0000000000
--- a/elf/dl-writev.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Message-writing for the dynamic linker.  Generic version.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <sys/uio.h>
-#include <ldsodefs.h>
-#include <libc-lock.h>
-
-/* This is used from only one place: dl-misc.c:_dl_debug_vdprintf.
-   Hence it's in a header with the expectation it will be inlined.
-
-   This is writev, but with a constraint added and others loosened:
-
-   1. Under RTLD_PRIVATE_ERRNO, it must not clobber the private errno
-      when another thread holds the dl_load_lock.
-   2. It is not obliged to detect and report errors at all.
-   3. It's not really obliged to deliver a single atomic write
-      (though it may be preferable).  */
-
-static inline void
-_dl_writev (int fd, const struct iovec *iov, size_t niov)
-{
-  /* Note that if __writev is an implementation that calls malloc,
-     this will cause linking problems building the dynamic linker.  */
-
-#if RTLD_PRIVATE_ERRNO
-  /* We have to take this lock just to be sure we don't clobber the private
-     errno when it's being used by another thread that cares about it.
-     Yet we must be sure not to try calling the lock functions before
-     the thread library is fully initialized.  */
-  if (__glibc_unlikely (_dl_starting_up))
-    __writev (fd, iov, niov);
-  else
-    {
-      __rtld_lock_lock_recursive (GL(dl_load_lock));
-      __writev (fd, iov, niov);
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
-    }
-#else
-  __writev (fd, iov, niov);
-#endif
-}
diff --git a/elf/do-rel.h b/elf/do-rel.h
deleted file mode 100644
index 70071e5c44..0000000000
--- a/elf/do-rel.h
+++ /dev/null
@@ -1,191 +0,0 @@
-/* Do relocations for ELF dynamic linking.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This file may be included twice, to define both
-   `elf_dynamic_do_rel' and `elf_dynamic_do_rela'.  */
-
-#ifdef DO_RELA
-# define elf_dynamic_do_Rel		elf_dynamic_do_Rela
-# define Rel				Rela
-# define elf_machine_rel		elf_machine_rela
-# define elf_machine_rel_relative	elf_machine_rela_relative
-#endif
-
-#ifndef DO_ELF_MACHINE_REL_RELATIVE
-# define DO_ELF_MACHINE_REL_RELATIVE(map, l_addr, relative) \
-  elf_machine_rel_relative (l_addr, relative,				      \
-			    (void *) (l_addr + relative->r_offset))
-#endif
-
-/* Perform the relocations in MAP on the running program image as specified
-   by RELTAG, SZTAG.  If LAZY is nonzero, this is the first pass on PLT
-   relocations; they should be set up to call _dl_runtime_resolve, rather
-   than fully resolved now.  */
-
-auto inline void __attribute__ ((always_inline))
-elf_dynamic_do_Rel (struct link_map *map,
-		    ElfW(Addr) reladdr, ElfW(Addr) relsize,
-		    __typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative,
-		    int lazy, int skip_ifunc)
-{
-  const ElfW(Rel) *r = (const void *) reladdr;
-  const ElfW(Rel) *end = (const void *) (reladdr + relsize);
-  ElfW(Addr) l_addr = map->l_addr;
-# if defined ELF_MACHINE_IRELATIVE && !defined RTLD_BOOTSTRAP
-  const ElfW(Rel) *r2 = NULL;
-  const ElfW(Rel) *end2 = NULL;
-# endif
-
-#if (!defined DO_RELA || !defined ELF_MACHINE_PLT_REL) && !defined RTLD_BOOTSTRAP
-  /* We never bind lazily during ld.so bootstrap.  Unfortunately gcc is
-     not clever enough to see through all the function calls to realize
-     that.  */
-  if (lazy)
-    {
-      /* Doing lazy PLT relocations; they need very little info.  */
-      for (; r < end; ++r)
-# ifdef ELF_MACHINE_IRELATIVE
-	if (ELFW(R_TYPE) (r->r_info) == ELF_MACHINE_IRELATIVE)
-	  {
-	    if (r2 == NULL)
-	      r2 = r;
-	    end2 = r;
-	  }
-	else
-# endif
-	  elf_machine_lazy_rel (map, l_addr, r, skip_ifunc);
-
-# ifdef ELF_MACHINE_IRELATIVE
-      if (r2 != NULL)
-	for (; r2 <= end2; ++r2)
-	  if (ELFW(R_TYPE) (r2->r_info) == ELF_MACHINE_IRELATIVE)
-	    elf_machine_lazy_rel (map, l_addr, r2, skip_ifunc);
-# endif
-    }
-  else
-#endif
-    {
-      const ElfW(Sym) *const symtab =
-	(const void *) D_PTR (map, l_info[DT_SYMTAB]);
-      const ElfW(Rel) *relative = r;
-      r += nrelative;
-
-#ifndef RTLD_BOOTSTRAP
-      /* This is defined in rtld.c, but nowhere in the static libc.a; make
-	 the reference weak so static programs can still link.  This
-	 declaration cannot be done when compiling rtld.c (i.e. #ifdef
-	 RTLD_BOOTSTRAP) because rtld.c contains the common defn for
-	 _dl_rtld_map, which is incompatible with a weak decl in the same
-	 file.  */
-# ifndef SHARED
-      weak_extern (GL(dl_rtld_map));
-# endif
-      if (map != &GL(dl_rtld_map)) /* Already done in rtld itself.  */
-# if !defined DO_RELA || defined ELF_MACHINE_REL_RELATIVE
-	/* Rela platforms get the offset from r_addend and this must
-	   be copied in the relocation address.  Therefore we can skip
-	   the relative relocations only if this is for rel
-	   relocations or rela relocations if they are computed as
-	   memory_loc += l_addr...  */
-	if (l_addr != 0)
-# else
-	/* ...or we know the object has been prelinked.  */
-	if (l_addr != 0 || ! map->l_info[VALIDX(DT_GNU_PRELINKED)])
-# endif
-#endif
-	  for (; relative < r; ++relative)
-	    DO_ELF_MACHINE_REL_RELATIVE (map, l_addr, relative);
-
-#ifdef RTLD_BOOTSTRAP
-      /* The dynamic linker always uses versioning.  */
-      assert (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL);
-#else
-      if (map->l_info[VERSYMIDX (DT_VERSYM)])
-#endif
-	{
-	  const ElfW(Half) *const version =
-	    (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
-
-	  for (; r < end; ++r)
-	    {
-#if defined ELF_MACHINE_IRELATIVE && !defined RTLD_BOOTSTRAP
-	      if (ELFW(R_TYPE) (r->r_info) == ELF_MACHINE_IRELATIVE)
-		{
-		  if (r2 == NULL)
-		    r2 = r;
-		  end2 = r;
-		  continue;
-		}
-#endif
-
-	      ElfW(Half) ndx = version[ELFW(R_SYM) (r->r_info)] & 0x7fff;
-	      elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)],
-			       &map->l_versions[ndx],
-			       (void *) (l_addr + r->r_offset), skip_ifunc);
-	    }
-
-#if defined ELF_MACHINE_IRELATIVE && !defined RTLD_BOOTSTRAP
-	  if (r2 != NULL)
-	    for (; r2 <= end2; ++r2)
-	      if (ELFW(R_TYPE) (r2->r_info) == ELF_MACHINE_IRELATIVE)
-		{
-		  ElfW(Half) ndx
-		    = version[ELFW(R_SYM) (r2->r_info)] & 0x7fff;
-		  elf_machine_rel (map, r2,
-				   &symtab[ELFW(R_SYM) (r2->r_info)],
-				   &map->l_versions[ndx],
-				   (void *) (l_addr + r2->r_offset),
-				   skip_ifunc);
-		}
-#endif
-	}
-#ifndef RTLD_BOOTSTRAP
-      else
-	{
-	  for (; r < end; ++r)
-# ifdef ELF_MACHINE_IRELATIVE
-	    if (ELFW(R_TYPE) (r->r_info) == ELF_MACHINE_IRELATIVE)
-	      {
-		if (r2 == NULL)
-		  r2 = r;
-		end2 = r;
-	      }
-	    else
-# endif
-	      elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL,
-			       (void *) (l_addr + r->r_offset), skip_ifunc);
-
-# ifdef ELF_MACHINE_IRELATIVE
-	  if (r2 != NULL)
-	    for (; r2 <= end2; ++r2)
-	      if (ELFW(R_TYPE) (r2->r_info) == ELF_MACHINE_IRELATIVE)
-		elf_machine_rel (map, r2, &symtab[ELFW(R_SYM) (r2->r_info)],
-				 NULL, (void *) (l_addr + r2->r_offset),
-				 skip_ifunc);
-# endif
-	}
-#endif
-    }
-}
-
-#undef elf_dynamic_do_Rel
-#undef Rel
-#undef elf_machine_rel
-#undef elf_machine_rel_relative
-#undef DO_ELF_MACHINE_REL_RELATIVE
-#undef DO_RELA
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
deleted file mode 100644
index 60f2d91151..0000000000
--- a/elf/dynamic-link.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/* Inline functions for dynamic linking.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This macro is used as a callback from elf_machine_rel{a,} when a
-   static TLS reloc is about to be performed.  Since (in dl-load.c) we
-   permit dynamic loading of objects that might use such relocs, we
-   have to check whether each use is actually doable.  If the object
-   whose TLS segment the reference resolves to was allocated space in
-   the static TLS block at startup, then it's ok.  Otherwise, we make
-   an attempt to allocate it in surplus space on the fly.  If that
-   can't be done, we fall back to the error that DF_STATIC_TLS is
-   intended to produce.  */
-#define HAVE_STATIC_TLS(map, sym_map)					\
-    (__builtin_expect ((sym_map)->l_tls_offset != NO_TLS_OFFSET		\
-		       && ((sym_map)->l_tls_offset			\
-			   != FORCED_DYNAMIC_TLS_OFFSET), 1))
-
-#define CHECK_STATIC_TLS(map, sym_map)					\
-    do {								\
-      if (!HAVE_STATIC_TLS (map, sym_map))				\
-	_dl_allocate_static_tls (sym_map);				\
-    } while (0)
-
-#define TRY_STATIC_TLS(map, sym_map)					\
-    (__builtin_expect ((sym_map)->l_tls_offset				\
-		       != FORCED_DYNAMIC_TLS_OFFSET, 1)			\
-     && (__builtin_expect ((sym_map)->l_tls_offset != NO_TLS_OFFSET, 1)	\
-	 || _dl_try_allocate_static_tls (sym_map) == 0))
-
-int internal_function attribute_hidden
-  _dl_try_allocate_static_tls (struct link_map *map);
-
-#include <elf.h>
-
-#ifdef RESOLVE_MAP
-/* We pass reloc_addr as a pointer to void, as opposed to a pointer to
-   ElfW(Addr), because not all architectures can assume that the
-   relocated address is properly aligned, whereas the compiler is
-   entitled to assume that a pointer to a type is properly aligned for
-   the type.  Even if we cast the pointer back to some other type with
-   less strict alignment requirements, the compiler might still
-   remember that the pointer was originally more aligned, thereby
-   optimizing away alignment tests or using word instructions for
-   copying memory, breaking the very code written to handle the
-   unaligned cases.  */
-# if ! ELF_MACHINE_NO_REL
-auto inline void __attribute__((always_inline))
-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
-		 const ElfW(Sym) *sym, const struct r_found_version *version,
-		 void *const reloc_addr, int skip_ifunc);
-auto inline void __attribute__((always_inline))
-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
-			  void *const reloc_addr);
-# endif
-# if ! ELF_MACHINE_NO_RELA
-auto inline void __attribute__((always_inline))
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
-		  const ElfW(Sym) *sym, const struct r_found_version *version,
-		  void *const reloc_addr, int skip_ifunc);
-auto inline void __attribute__((always_inline))
-elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
-			   void *const reloc_addr);
-# endif
-# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL
-auto inline void __attribute__((always_inline))
-elf_machine_lazy_rel (struct link_map *map,
-		      ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
-		      int skip_ifunc);
-# else
-auto inline void __attribute__((always_inline))
-elf_machine_lazy_rel (struct link_map *map,
-		      ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
-		      int skip_ifunc);
-# endif
-#endif
-
-#include <dl-machine.h>
-
-#include "get-dynamic-info.h"
-
-#ifdef RESOLVE_MAP
-
-# ifdef RTLD_BOOTSTRAP
-#  define ELF_DURING_STARTUP (1)
-# else
-#  define ELF_DURING_STARTUP (0)
-# endif
-
-/* Get the definitions of `elf_dynamic_do_rel' and `elf_dynamic_do_rela'.
-   These functions are almost identical, so we use cpp magic to avoid
-   duplicating their code.  It cannot be done in a more general function
-   because we must be able to completely inline.  */
-
-/* On some machines, notably SPARC, DT_REL* includes DT_JMPREL in its
-   range.  Note that according to the ELF spec, this is completely legal!
-
-   We are guarenteed that we have one of three situations.  Either DT_JMPREL
-   comes immediately after DT_REL*, or there is overlap and DT_JMPREL
-   consumes precisely the very end of the DT_REL*, or DT_JMPREL and DT_REL*
-   are completely separate and there is a gap between them.  */
-
-# define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, do_lazy, skip_ifunc, test_rel) \
-  do {									      \
-    struct { ElfW(Addr) start, size;					      \
-	     __typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative; int lazy; }  \
-      ranges[2] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };			      \
-									      \
-    if ((map)->l_info[DT_##RELOC])					      \
-      {									      \
-	ranges[0].start = D_PTR ((map), l_info[DT_##RELOC]);		      \
-	ranges[0].size = (map)->l_info[DT_##RELOC##SZ]->d_un.d_val;	      \
-	if (map->l_info[VERSYMIDX (DT_##RELOC##COUNT)] != NULL)		      \
-	  ranges[0].nrelative						      \
-	    = map->l_info[VERSYMIDX (DT_##RELOC##COUNT)]->d_un.d_val;	      \
-      }									      \
-    if ((map)->l_info[DT_PLTREL]					      \
-	&& (!test_rel || (map)->l_info[DT_PLTREL]->d_un.d_val == DT_##RELOC)) \
-      {									      \
-	ElfW(Addr) start = D_PTR ((map), l_info[DT_JMPREL]);		      \
-	ElfW(Addr) size = (map)->l_info[DT_PLTRELSZ]->d_un.d_val;	      \
-									      \
-	if (ranges[0].start + ranges[0].size == (start + size))		      \
-	  ranges[0].size -= size;					      \
-	if (ELF_DURING_STARTUP						      \
-	    || (!(do_lazy)						      \
-		&& (ranges[0].start + ranges[0].size) == start))	      \
-	  {								      \
-	    /* Combine processing the sections.  */			      \
-	    ranges[0].size += size;					      \
-	  }								      \
-	else								      \
-	  {								      \
-	    ranges[1].start = start;					      \
-	    ranges[1].size = size;					      \
-	    ranges[1].lazy = (do_lazy);					      \
-	  }								      \
-      }									      \
-									      \
-    if (ELF_DURING_STARTUP)						      \
-      elf_dynamic_do_##reloc ((map), ranges[0].start, ranges[0].size,	      \
-			      ranges[0].nrelative, 0, skip_ifunc);	      \
-    else								      \
-      {									      \
-	int ranges_index;						      \
-	for (ranges_index = 0; ranges_index < 2; ++ranges_index)	      \
-	  elf_dynamic_do_##reloc ((map),				      \
-				  ranges[ranges_index].start,		      \
-				  ranges[ranges_index].size,		      \
-				  ranges[ranges_index].nrelative,	      \
-				  ranges[ranges_index].lazy,		      \
-				  skip_ifunc);				      \
-      }									      \
-  } while (0)
-
-# if ELF_MACHINE_NO_REL || ELF_MACHINE_NO_RELA
-#  define _ELF_CHECK_REL 0
-# else
-#  define _ELF_CHECK_REL 1
-# endif
-
-# if ! ELF_MACHINE_NO_REL
-#  include "do-rel.h"
-#  define ELF_DYNAMIC_DO_REL(map, lazy, skip_ifunc) \
-  _ELF_DYNAMIC_DO_RELOC (REL, Rel, map, lazy, skip_ifunc, _ELF_CHECK_REL)
-# else
-#  define ELF_DYNAMIC_DO_REL(map, lazy, skip_ifunc) /* Nothing to do.  */
-# endif
-
-# if ! ELF_MACHINE_NO_RELA
-#  define DO_RELA
-#  include "do-rel.h"
-#  define ELF_DYNAMIC_DO_RELA(map, lazy, skip_ifunc) \
-  _ELF_DYNAMIC_DO_RELOC (RELA, Rela, map, lazy, skip_ifunc, _ELF_CHECK_REL)
-# else
-#  define ELF_DYNAMIC_DO_RELA(map, lazy, skip_ifunc) /* Nothing to do.  */
-# endif
-
-/* This can't just be an inline function because GCC is too dumb
-   to inline functions containing inlines themselves.  */
-# define ELF_DYNAMIC_RELOCATE(map, lazy, consider_profile, skip_ifunc) \
-  do {									      \
-    int edr_lazy = elf_machine_runtime_setup ((map), (lazy),		      \
-					      (consider_profile));	      \
-    ELF_DYNAMIC_DO_REL ((map), edr_lazy, skip_ifunc);			      \
-    ELF_DYNAMIC_DO_RELA ((map), edr_lazy, skip_ifunc);			      \
-  } while (0)
-
-#endif
diff --git a/elf/elf.h b/elf/elf.h
deleted file mode 100644
index fff893d433..0000000000
--- a/elf/elf.h
+++ /dev/null
@@ -1,3761 +0,0 @@
-/* This file defines standard ELF types, structures, and macros.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _ELF_H
-#define	_ELF_H 1
-
-#include <features.h>
-
-__BEGIN_DECLS
-
-/* Standard ELF types.  */
-
-#include <stdint.h>
-
-/* Type for a 16-bit quantity.  */
-typedef uint16_t Elf32_Half;
-typedef uint16_t Elf64_Half;
-
-/* Types for signed and unsigned 32-bit quantities.  */
-typedef uint32_t Elf32_Word;
-typedef	int32_t  Elf32_Sword;
-typedef uint32_t Elf64_Word;
-typedef	int32_t  Elf64_Sword;
-
-/* Types for signed and unsigned 64-bit quantities.  */
-typedef uint64_t Elf32_Xword;
-typedef	int64_t  Elf32_Sxword;
-typedef uint64_t Elf64_Xword;
-typedef	int64_t  Elf64_Sxword;
-
-/* Type of addresses.  */
-typedef uint32_t Elf32_Addr;
-typedef uint64_t Elf64_Addr;
-
-/* Type of file offsets.  */
-typedef uint32_t Elf32_Off;
-typedef uint64_t Elf64_Off;
-
-/* Type for section indices, which are 16-bit quantities.  */
-typedef uint16_t Elf32_Section;
-typedef uint16_t Elf64_Section;
-
-/* Type for version symbol information.  */
-typedef Elf32_Half Elf32_Versym;
-typedef Elf64_Half Elf64_Versym;
-
-
-/* The ELF file header.  This appears at the start of every ELF file.  */
-
-#define EI_NIDENT (16)
-
-typedef struct
-{
-  unsigned char	e_ident[EI_NIDENT];	/* Magic number and other info */
-  Elf32_Half	e_type;			/* Object file type */
-  Elf32_Half	e_machine;		/* Architecture */
-  Elf32_Word	e_version;		/* Object file version */
-  Elf32_Addr	e_entry;		/* Entry point virtual address */
-  Elf32_Off	e_phoff;		/* Program header table file offset */
-  Elf32_Off	e_shoff;		/* Section header table file offset */
-  Elf32_Word	e_flags;		/* Processor-specific flags */
-  Elf32_Half	e_ehsize;		/* ELF header size in bytes */
-  Elf32_Half	e_phentsize;		/* Program header table entry size */
-  Elf32_Half	e_phnum;		/* Program header table entry count */
-  Elf32_Half	e_shentsize;		/* Section header table entry size */
-  Elf32_Half	e_shnum;		/* Section header table entry count */
-  Elf32_Half	e_shstrndx;		/* Section header string table index */
-} Elf32_Ehdr;
-
-typedef struct
-{
-  unsigned char	e_ident[EI_NIDENT];	/* Magic number and other info */
-  Elf64_Half	e_type;			/* Object file type */
-  Elf64_Half	e_machine;		/* Architecture */
-  Elf64_Word	e_version;		/* Object file version */
-  Elf64_Addr	e_entry;		/* Entry point virtual address */
-  Elf64_Off	e_phoff;		/* Program header table file offset */
-  Elf64_Off	e_shoff;		/* Section header table file offset */
-  Elf64_Word	e_flags;		/* Processor-specific flags */
-  Elf64_Half	e_ehsize;		/* ELF header size in bytes */
-  Elf64_Half	e_phentsize;		/* Program header table entry size */
-  Elf64_Half	e_phnum;		/* Program header table entry count */
-  Elf64_Half	e_shentsize;		/* Section header table entry size */
-  Elf64_Half	e_shnum;		/* Section header table entry count */
-  Elf64_Half	e_shstrndx;		/* Section header string table index */
-} Elf64_Ehdr;
-
-/* Fields in the e_ident array.  The EI_* macros are indices into the
-   array.  The macros under each EI_* macro are the values the byte
-   may have.  */
-
-#define EI_MAG0		0		/* File identification byte 0 index */
-#define ELFMAG0		0x7f		/* Magic number byte 0 */
-
-#define EI_MAG1		1		/* File identification byte 1 index */
-#define ELFMAG1		'E'		/* Magic number byte 1 */
-
-#define EI_MAG2		2		/* File identification byte 2 index */
-#define ELFMAG2		'L'		/* Magic number byte 2 */
-
-#define EI_MAG3		3		/* File identification byte 3 index */
-#define ELFMAG3		'F'		/* Magic number byte 3 */
-
-/* Conglomeration of the identification bytes, for easy testing as a word.  */
-#define	ELFMAG		"\177ELF"
-#define	SELFMAG		4
-
-#define EI_CLASS	4		/* File class byte index */
-#define ELFCLASSNONE	0		/* Invalid class */
-#define ELFCLASS32	1		/* 32-bit objects */
-#define ELFCLASS64	2		/* 64-bit objects */
-#define ELFCLASSNUM	3
-
-#define EI_DATA		5		/* Data encoding byte index */
-#define ELFDATANONE	0		/* Invalid data encoding */
-#define ELFDATA2LSB	1		/* 2's complement, little endian */
-#define ELFDATA2MSB	2		/* 2's complement, big endian */
-#define ELFDATANUM	3
-
-#define EI_VERSION	6		/* File version byte index */
-					/* Value must be EV_CURRENT */
-
-#define EI_OSABI	7		/* OS ABI identification */
-#define ELFOSABI_NONE		0	/* UNIX System V ABI */
-#define ELFOSABI_SYSV		0	/* Alias.  */
-#define ELFOSABI_HPUX		1	/* HP-UX */
-#define ELFOSABI_NETBSD		2	/* NetBSD.  */
-#define ELFOSABI_GNU		3	/* Object uses GNU ELF extensions.  */
-#define ELFOSABI_LINUX		ELFOSABI_GNU /* Compatibility alias.  */
-#define ELFOSABI_SOLARIS	6	/* Sun Solaris.  */
-#define ELFOSABI_AIX		7	/* IBM AIX.  */
-#define ELFOSABI_IRIX		8	/* SGI Irix.  */
-#define ELFOSABI_FREEBSD	9	/* FreeBSD.  */
-#define ELFOSABI_TRU64		10	/* Compaq TRU64 UNIX.  */
-#define ELFOSABI_MODESTO	11	/* Novell Modesto.  */
-#define ELFOSABI_OPENBSD	12	/* OpenBSD.  */
-#define ELFOSABI_ARM_AEABI	64	/* ARM EABI */
-#define ELFOSABI_ARM		97	/* ARM */
-#define ELFOSABI_STANDALONE	255	/* Standalone (embedded) application */
-
-#define EI_ABIVERSION	8		/* ABI version */
-
-#define EI_PAD		9		/* Byte index of padding bytes */
-
-/* Legal values for e_type (object file type).  */
-
-#define ET_NONE		0		/* No file type */
-#define ET_REL		1		/* Relocatable file */
-#define ET_EXEC		2		/* Executable file */
-#define ET_DYN		3		/* Shared object file */
-#define ET_CORE		4		/* Core file */
-#define	ET_NUM		5		/* Number of defined types */
-#define ET_LOOS		0xfe00		/* OS-specific range start */
-#define ET_HIOS		0xfeff		/* OS-specific range end */
-#define ET_LOPROC	0xff00		/* Processor-specific range start */
-#define ET_HIPROC	0xffff		/* Processor-specific range end */
-
-/* Legal values for e_machine (architecture).  */
-
-#define EM_NONE		 0	/* No machine */
-#define EM_M32		 1	/* AT&T WE 32100 */
-#define EM_SPARC	 2	/* SUN SPARC */
-#define EM_386		 3	/* Intel 80386 */
-#define EM_68K		 4	/* Motorola m68k family */
-#define EM_88K		 5	/* Motorola m88k family */
-#define EM_IAMCU	 6	/* Intel MCU */
-#define EM_860		 7	/* Intel 80860 */
-#define EM_MIPS		 8	/* MIPS R3000 big-endian */
-#define EM_S370		 9	/* IBM System/370 */
-#define EM_MIPS_RS3_LE	10	/* MIPS R3000 little-endian */
-				/* reserved 11-14 */
-#define EM_PARISC	15	/* HPPA */
-				/* reserved 16 */
-#define EM_VPP500	17	/* Fujitsu VPP500 */
-#define EM_SPARC32PLUS	18	/* Sun's "v8plus" */
-#define EM_960		19	/* Intel 80960 */
-#define EM_PPC		20	/* PowerPC */
-#define EM_PPC64	21	/* PowerPC 64-bit */
-#define EM_S390		22	/* IBM S390 */
-#define EM_SPU		23	/* IBM SPU/SPC */
-				/* reserved 24-35 */
-#define EM_V800		36	/* NEC V800 series */
-#define EM_FR20		37	/* Fujitsu FR20 */
-#define EM_RH32		38	/* TRW RH-32 */
-#define EM_RCE		39	/* Motorola RCE */
-#define EM_ARM		40	/* ARM */
-#define EM_FAKE_ALPHA	41	/* Digital Alpha */
-#define EM_SH		42	/* Hitachi SH */
-#define EM_SPARCV9	43	/* SPARC v9 64-bit */
-#define EM_TRICORE	44	/* Siemens Tricore */
-#define EM_ARC		45	/* Argonaut RISC Core */
-#define EM_H8_300	46	/* Hitachi H8/300 */
-#define EM_H8_300H	47	/* Hitachi H8/300H */
-#define EM_H8S		48	/* Hitachi H8S */
-#define EM_H8_500	49	/* Hitachi H8/500 */
-#define EM_IA_64	50	/* Intel Merced */
-#define EM_MIPS_X	51	/* Stanford MIPS-X */
-#define EM_COLDFIRE	52	/* Motorola Coldfire */
-#define EM_68HC12	53	/* Motorola M68HC12 */
-#define EM_MMA		54	/* Fujitsu MMA Multimedia Accelerator */
-#define EM_PCP		55	/* Siemens PCP */
-#define EM_NCPU		56	/* Sony nCPU embeeded RISC */
-#define EM_NDR1		57	/* Denso NDR1 microprocessor */
-#define EM_STARCORE	58	/* Motorola Start*Core processor */
-#define EM_ME16		59	/* Toyota ME16 processor */
-#define EM_ST100	60	/* STMicroelectronic ST100 processor */
-#define EM_TINYJ	61	/* Advanced Logic Corp. Tinyj emb.fam */
-#define EM_X86_64	62	/* AMD x86-64 architecture */
-#define EM_PDSP		63	/* Sony DSP Processor */
-#define EM_PDP10	64	/* Digital PDP-10 */
-#define EM_PDP11	65	/* Digital PDP-11 */
-#define EM_FX66		66	/* Siemens FX66 microcontroller */
-#define EM_ST9PLUS	67	/* STMicroelectronics ST9+ 8/16 mc */
-#define EM_ST7		68	/* STmicroelectronics ST7 8 bit mc */
-#define EM_68HC16	69	/* Motorola MC68HC16 microcontroller */
-#define EM_68HC11	70	/* Motorola MC68HC11 microcontroller */
-#define EM_68HC08	71	/* Motorola MC68HC08 microcontroller */
-#define EM_68HC05	72	/* Motorola MC68HC05 microcontroller */
-#define EM_SVX		73	/* Silicon Graphics SVx */
-#define EM_ST19		74	/* STMicroelectronics ST19 8 bit mc */
-#define EM_VAX		75	/* Digital VAX */
-#define EM_CRIS		76	/* Axis Communications 32-bit emb.proc */
-#define EM_JAVELIN	77	/* Infineon Technologies 32-bit emb.proc */
-#define EM_FIREPATH	78	/* Element 14 64-bit DSP Processor */
-#define EM_ZSP		79	/* LSI Logic 16-bit DSP Processor */
-#define EM_MMIX		80	/* Donald Knuth's educational 64-bit proc */
-#define EM_HUANY	81	/* Harvard University machine-independent object files */
-#define EM_PRISM	82	/* SiTera Prism */
-#define EM_AVR		83	/* Atmel AVR 8-bit microcontroller */
-#define EM_FR30		84	/* Fujitsu FR30 */
-#define EM_D10V		85	/* Mitsubishi D10V */
-#define EM_D30V		86	/* Mitsubishi D30V */
-#define EM_V850		87	/* NEC v850 */
-#define EM_M32R		88	/* Mitsubishi M32R */
-#define EM_MN10300	89	/* Matsushita MN10300 */
-#define EM_MN10200	90	/* Matsushita MN10200 */
-#define EM_PJ		91	/* picoJava */
-#define EM_OPENRISC	92	/* OpenRISC 32-bit embedded processor */
-#define EM_ARC_COMPACT	93	/* ARC International ARCompact */
-#define EM_XTENSA	94	/* Tensilica Xtensa Architecture */
-#define EM_VIDEOCORE	95	/* Alphamosaic VideoCore */
-#define EM_TMM_GPP	96	/* Thompson Multimedia General Purpose Proc */
-#define EM_NS32K	97	/* National Semi. 32000 */
-#define EM_TPC		98	/* Tenor Network TPC */
-#define EM_SNP1K	99	/* Trebia SNP 1000 */
-#define EM_ST200	100	/* STMicroelectronics ST200 */
-#define EM_IP2K		101	/* Ubicom IP2xxx */
-#define EM_MAX		102	/* MAX processor */
-#define EM_CR		103	/* National Semi. CompactRISC */
-#define EM_F2MC16	104	/* Fujitsu F2MC16 */
-#define EM_MSP430	105	/* Texas Instruments msp430 */
-#define EM_BLACKFIN	106	/* Analog Devices Blackfin DSP */
-#define EM_SE_C33	107	/* Seiko Epson S1C33 family */
-#define EM_SEP		108	/* Sharp embedded microprocessor */
-#define EM_ARCA		109	/* Arca RISC */
-#define EM_UNICORE	110	/* PKU-Unity & MPRC Peking Uni. mc series */
-#define EM_EXCESS	111	/* eXcess configurable cpu */
-#define EM_DXP		112	/* Icera Semi. Deep Execution Processor */
-#define EM_ALTERA_NIOS2 113	/* Altera Nios II */
-#define EM_CRX		114	/* National Semi. CompactRISC CRX */
-#define EM_XGATE	115	/* Motorola XGATE */
-#define EM_C166		116	/* Infineon C16x/XC16x */
-#define EM_M16C		117	/* Renesas M16C */
-#define EM_DSPIC30F	118	/* Microchip Technology dsPIC30F */
-#define EM_CE		119	/* Freescale Communication Engine RISC */
-#define EM_M32C		120	/* Renesas M32C */
-				/* reserved 121-130 */
-#define EM_TSK3000	131	/* Altium TSK3000 */
-#define EM_RS08		132	/* Freescale RS08 */
-#define EM_SHARC	133	/* Analog Devices SHARC family */
-#define EM_ECOG2	134	/* Cyan Technology eCOG2 */
-#define EM_SCORE7	135	/* Sunplus S+core7 RISC */
-#define EM_DSP24	136	/* New Japan Radio (NJR) 24-bit DSP */
-#define EM_VIDEOCORE3	137	/* Broadcom VideoCore III */
-#define EM_LATTICEMICO32 138	/* RISC for Lattice FPGA */
-#define EM_SE_C17	139	/* Seiko Epson C17 */
-#define EM_TI_C6000	140	/* Texas Instruments TMS320C6000 DSP */
-#define EM_TI_C2000	141	/* Texas Instruments TMS320C2000 DSP */
-#define EM_TI_C5500	142	/* Texas Instruments TMS320C55x DSP */
-#define EM_TI_ARP32	143	/* Texas Instruments App. Specific RISC */
-#define EM_TI_PRU	144	/* Texas Instruments Prog. Realtime Unit */
-				/* reserved 145-159 */
-#define EM_MMDSP_PLUS	160	/* STMicroelectronics 64bit VLIW DSP */
-#define EM_CYPRESS_M8C	161	/* Cypress M8C */
-#define EM_R32C		162	/* Renesas R32C */
-#define EM_TRIMEDIA	163	/* NXP Semi. TriMedia */
-#define EM_QDSP6	164	/* QUALCOMM DSP6 */
-#define EM_8051		165	/* Intel 8051 and variants */
-#define EM_STXP7X	166	/* STMicroelectronics STxP7x */
-#define EM_NDS32	167	/* Andes Tech. compact code emb. RISC */
-#define EM_ECOG1X	168	/* Cyan Technology eCOG1X */
-#define EM_MAXQ30	169	/* Dallas Semi. MAXQ30 mc */
-#define EM_XIMO16	170	/* New Japan Radio (NJR) 16-bit DSP */
-#define EM_MANIK	171	/* M2000 Reconfigurable RISC */
-#define EM_CRAYNV2	172	/* Cray NV2 vector architecture */
-#define EM_RX		173	/* Renesas RX */
-#define EM_METAG	174	/* Imagination Tech. META */
-#define EM_MCST_ELBRUS	175	/* MCST Elbrus */
-#define EM_ECOG16	176	/* Cyan Technology eCOG16 */
-#define EM_CR16		177	/* National Semi. CompactRISC CR16 */
-#define EM_ETPU		178	/* Freescale Extended Time Processing Unit */
-#define EM_SLE9X	179	/* Infineon Tech. SLE9X */
-#define EM_L10M		180	/* Intel L10M */
-#define EM_K10M		181	/* Intel K10M */
-				/* reserved 182 */
-#define EM_AARCH64	183	/* ARM AARCH64 */
-				/* reserved 184 */
-#define EM_AVR32	185	/* Amtel 32-bit microprocessor */
-#define EM_STM8		186	/* STMicroelectronics STM8 */
-#define EM_TILE64	187	/* Tileta TILE64 */
-#define EM_TILEPRO	188	/* Tilera TILEPro */
-#define EM_MICROBLAZE	189	/* Xilinx MicroBlaze */
-#define EM_CUDA		190	/* NVIDIA CUDA */
-#define EM_TILEGX	191	/* Tilera TILE-Gx */
-#define EM_CLOUDSHIELD	192	/* CloudShield */
-#define EM_COREA_1ST	193	/* KIPO-KAIST Core-A 1st gen. */
-#define EM_COREA_2ND	194	/* KIPO-KAIST Core-A 2nd gen. */
-#define EM_ARC_COMPACT2	195	/* Synopsys ARCompact V2 */
-#define EM_OPEN8	196	/* Open8 RISC */
-#define EM_RL78		197	/* Renesas RL78 */
-#define EM_VIDEOCORE5	198	/* Broadcom VideoCore V */
-#define EM_78KOR	199	/* Renesas 78KOR */
-#define EM_56800EX	200	/* Freescale 56800EX DSC */
-#define EM_BA1		201	/* Beyond BA1 */
-#define EM_BA2		202	/* Beyond BA2 */
-#define EM_XCORE	203	/* XMOS xCORE */
-#define EM_MCHP_PIC	204	/* Microchip 8-bit PIC(r) */
-				/* reserved 205-209 */
-#define EM_KM32		210	/* KM211 KM32 */
-#define EM_KMX32	211	/* KM211 KMX32 */
-#define EM_EMX16	212	/* KM211 KMX16 */
-#define EM_EMX8		213	/* KM211 KMX8 */
-#define EM_KVARC	214	/* KM211 KVARC */
-#define EM_CDP		215	/* Paneve CDP */
-#define EM_COGE		216	/* Cognitive Smart Memory Processor */
-#define EM_COOL		217	/* Bluechip CoolEngine */
-#define EM_NORC		218	/* Nanoradio Optimized RISC */
-#define EM_CSR_KALIMBA	219	/* CSR Kalimba */
-#define EM_Z80		220	/* Zilog Z80 */
-#define EM_VISIUM	221	/* Controls and Data Services VISIUMcore */
-#define EM_FT32		222	/* FTDI Chip FT32 */
-#define EM_MOXIE	223	/* Moxie processor */
-#define EM_AMDGPU	224	/* AMD GPU */
-				/* reserved 225-242 */
-#define EM_RISCV	243	/* RISC-V */
-
-#define EM_BPF		247	/* Linux BPF -- in-kernel virtual machine */
-
-#define EM_NUM		248
-
-/* Old spellings/synonyms.  */
-
-#define EM_ARC_A5	EM_ARC_COMPACT
-
-/* If it is necessary to assign new unofficial EM_* values, please
-   pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
-   chances of collision with official or non-GNU unofficial values.  */
-
-#define EM_ALPHA	0x9026
-
-/* Legal values for e_version (version).  */
-
-#define EV_NONE		0		/* Invalid ELF version */
-#define EV_CURRENT	1		/* Current version */
-#define EV_NUM		2
-
-/* Section header.  */
-
-typedef struct
-{
-  Elf32_Word	sh_name;		/* Section name (string tbl index) */
-  Elf32_Word	sh_type;		/* Section type */
-  Elf32_Word	sh_flags;		/* Section flags */
-  Elf32_Addr	sh_addr;		/* Section virtual addr at execution */
-  Elf32_Off	sh_offset;		/* Section file offset */
-  Elf32_Word	sh_size;		/* Section size in bytes */
-  Elf32_Word	sh_link;		/* Link to another section */
-  Elf32_Word	sh_info;		/* Additional section information */
-  Elf32_Word	sh_addralign;		/* Section alignment */
-  Elf32_Word	sh_entsize;		/* Entry size if section holds table */
-} Elf32_Shdr;
-
-typedef struct
-{
-  Elf64_Word	sh_name;		/* Section name (string tbl index) */
-  Elf64_Word	sh_type;		/* Section type */
-  Elf64_Xword	sh_flags;		/* Section flags */
-  Elf64_Addr	sh_addr;		/* Section virtual addr at execution */
-  Elf64_Off	sh_offset;		/* Section file offset */
-  Elf64_Xword	sh_size;		/* Section size in bytes */
-  Elf64_Word	sh_link;		/* Link to another section */
-  Elf64_Word	sh_info;		/* Additional section information */
-  Elf64_Xword	sh_addralign;		/* Section alignment */
-  Elf64_Xword	sh_entsize;		/* Entry size if section holds table */
-} Elf64_Shdr;
-
-/* Special section indices.  */
-
-#define SHN_UNDEF	0		/* Undefined section */
-#define SHN_LORESERVE	0xff00		/* Start of reserved indices */
-#define SHN_LOPROC	0xff00		/* Start of processor-specific */
-#define SHN_BEFORE	0xff00		/* Order section before all others
-					   (Solaris).  */
-#define SHN_AFTER	0xff01		/* Order section after all others
-					   (Solaris).  */
-#define SHN_HIPROC	0xff1f		/* End of processor-specific */
-#define SHN_LOOS	0xff20		/* Start of OS-specific */
-#define SHN_HIOS	0xff3f		/* End of OS-specific */
-#define SHN_ABS		0xfff1		/* Associated symbol is absolute */
-#define SHN_COMMON	0xfff2		/* Associated symbol is common */
-#define SHN_XINDEX	0xffff		/* Index is in extra table.  */
-#define SHN_HIRESERVE	0xffff		/* End of reserved indices */
-
-/* Legal values for sh_type (section type).  */
-
-#define SHT_NULL	  0		/* Section header table entry unused */
-#define SHT_PROGBITS	  1		/* Program data */
-#define SHT_SYMTAB	  2		/* Symbol table */
-#define SHT_STRTAB	  3		/* String table */
-#define SHT_RELA	  4		/* Relocation entries with addends */
-#define SHT_HASH	  5		/* Symbol hash table */
-#define SHT_DYNAMIC	  6		/* Dynamic linking information */
-#define SHT_NOTE	  7		/* Notes */
-#define SHT_NOBITS	  8		/* Program space with no data (bss) */
-#define SHT_REL		  9		/* Relocation entries, no addends */
-#define SHT_SHLIB	  10		/* Reserved */
-#define SHT_DYNSYM	  11		/* Dynamic linker symbol table */
-#define SHT_INIT_ARRAY	  14		/* Array of constructors */
-#define SHT_FINI_ARRAY	  15		/* Array of destructors */
-#define SHT_PREINIT_ARRAY 16		/* Array of pre-constructors */
-#define SHT_GROUP	  17		/* Section group */
-#define SHT_SYMTAB_SHNDX  18		/* Extended section indeces */
-#define	SHT_NUM		  19		/* Number of defined types.  */
-#define SHT_LOOS	  0x60000000	/* Start OS-specific.  */
-#define SHT_GNU_ATTRIBUTES 0x6ffffff5	/* Object attributes.  */
-#define SHT_GNU_HASH	  0x6ffffff6	/* GNU-style hash table.  */
-#define SHT_GNU_LIBLIST	  0x6ffffff7	/* Prelink library list */
-#define SHT_CHECKSUM	  0x6ffffff8	/* Checksum for DSO content.  */
-#define SHT_LOSUNW	  0x6ffffffa	/* Sun-specific low bound.  */
-#define SHT_SUNW_move	  0x6ffffffa
-#define SHT_SUNW_COMDAT   0x6ffffffb
-#define SHT_SUNW_syminfo  0x6ffffffc
-#define SHT_GNU_verdef	  0x6ffffffd	/* Version definition section.  */
-#define SHT_GNU_verneed	  0x6ffffffe	/* Version needs section.  */
-#define SHT_GNU_versym	  0x6fffffff	/* Version symbol table.  */
-#define SHT_HISUNW	  0x6fffffff	/* Sun-specific high bound.  */
-#define SHT_HIOS	  0x6fffffff	/* End OS-specific type */
-#define SHT_LOPROC	  0x70000000	/* Start of processor-specific */
-#define SHT_HIPROC	  0x7fffffff	/* End of processor-specific */
-#define SHT_LOUSER	  0x80000000	/* Start of application-specific */
-#define SHT_HIUSER	  0x8fffffff	/* End of application-specific */
-
-/* Legal values for sh_flags (section flags).  */
-
-#define SHF_WRITE	     (1 << 0)	/* Writable */
-#define SHF_ALLOC	     (1 << 1)	/* Occupies memory during execution */
-#define SHF_EXECINSTR	     (1 << 2)	/* Executable */
-#define SHF_MERGE	     (1 << 4)	/* Might be merged */
-#define SHF_STRINGS	     (1 << 5)	/* Contains nul-terminated strings */
-#define SHF_INFO_LINK	     (1 << 6)	/* `sh_info' contains SHT index */
-#define SHF_LINK_ORDER	     (1 << 7)	/* Preserve order after combining */
-#define SHF_OS_NONCONFORMING (1 << 8)	/* Non-standard OS specific handling
-					   required */
-#define SHF_GROUP	     (1 << 9)	/* Section is member of a group.  */
-#define SHF_TLS		     (1 << 10)	/* Section hold thread-local data.  */
-#define SHF_COMPRESSED	     (1 << 11)	/* Section with compressed data. */
-#define SHF_MASKOS	     0x0ff00000	/* OS-specific.  */
-#define SHF_MASKPROC	     0xf0000000	/* Processor-specific */
-#define SHF_ORDERED	     (1 << 30)	/* Special ordering requirement
-					   (Solaris).  */
-#define SHF_EXCLUDE	     (1U << 31)	/* Section is excluded unless
-					   referenced or allocated (Solaris).*/
-
-/* Section compression header.  Used when SHF_COMPRESSED is set.  */
-
-typedef struct
-{
-  Elf32_Word	ch_type;	/* Compression format.  */
-  Elf32_Word	ch_size;	/* Uncompressed data size.  */
-  Elf32_Word	ch_addralign;	/* Uncompressed data alignment.  */
-} Elf32_Chdr;
-
-typedef struct
-{
-  Elf64_Word	ch_type;	/* Compression format.  */
-  Elf64_Word	ch_reserved;
-  Elf64_Xword	ch_size;	/* Uncompressed data size.  */
-  Elf64_Xword	ch_addralign;	/* Uncompressed data alignment.  */
-} Elf64_Chdr;
-
-/* Legal values for ch_type (compression algorithm).  */
-#define ELFCOMPRESS_ZLIB	1	   /* ZLIB/DEFLATE algorithm.  */
-#define ELFCOMPRESS_LOOS	0x60000000 /* Start of OS-specific.  */
-#define ELFCOMPRESS_HIOS	0x6fffffff /* End of OS-specific.  */
-#define ELFCOMPRESS_LOPROC	0x70000000 /* Start of processor-specific.  */
-#define ELFCOMPRESS_HIPROC	0x7fffffff /* End of processor-specific.  */
-
-/* Section group handling.  */
-#define GRP_COMDAT	0x1		/* Mark group as COMDAT.  */
-
-/* Symbol table entry.  */
-
-typedef struct
-{
-  Elf32_Word	st_name;		/* Symbol name (string tbl index) */
-  Elf32_Addr	st_value;		/* Symbol value */
-  Elf32_Word	st_size;		/* Symbol size */
-  unsigned char	st_info;		/* Symbol type and binding */
-  unsigned char	st_other;		/* Symbol visibility */
-  Elf32_Section	st_shndx;		/* Section index */
-} Elf32_Sym;
-
-typedef struct
-{
-  Elf64_Word	st_name;		/* Symbol name (string tbl index) */
-  unsigned char	st_info;		/* Symbol type and binding */
-  unsigned char st_other;		/* Symbol visibility */
-  Elf64_Section	st_shndx;		/* Section index */
-  Elf64_Addr	st_value;		/* Symbol value */
-  Elf64_Xword	st_size;		/* Symbol size */
-} Elf64_Sym;
-
-/* The syminfo section if available contains additional information about
-   every dynamic symbol.  */
-
-typedef struct
-{
-  Elf32_Half si_boundto;		/* Direct bindings, symbol bound to */
-  Elf32_Half si_flags;			/* Per symbol flags */
-} Elf32_Syminfo;
-
-typedef struct
-{
-  Elf64_Half si_boundto;		/* Direct bindings, symbol bound to */
-  Elf64_Half si_flags;			/* Per symbol flags */
-} Elf64_Syminfo;
-
-/* Possible values for si_boundto.  */
-#define SYMINFO_BT_SELF		0xffff	/* Symbol bound to self */
-#define SYMINFO_BT_PARENT	0xfffe	/* Symbol bound to parent */
-#define SYMINFO_BT_LOWRESERVE	0xff00	/* Beginning of reserved entries */
-
-/* Possible bitmasks for si_flags.  */
-#define SYMINFO_FLG_DIRECT	0x0001	/* Direct bound symbol */
-#define SYMINFO_FLG_PASSTHRU	0x0002	/* Pass-thru symbol for translator */
-#define SYMINFO_FLG_COPY	0x0004	/* Symbol is a copy-reloc */
-#define SYMINFO_FLG_LAZYLOAD	0x0008	/* Symbol bound to object to be lazy
-					   loaded */
-/* Syminfo version values.  */
-#define SYMINFO_NONE		0
-#define SYMINFO_CURRENT		1
-#define SYMINFO_NUM		2
-
-
-/* How to extract and insert information held in the st_info field.  */
-
-#define ELF32_ST_BIND(val)		(((unsigned char) (val)) >> 4)
-#define ELF32_ST_TYPE(val)		((val) & 0xf)
-#define ELF32_ST_INFO(bind, type)	(((bind) << 4) + ((type) & 0xf))
-
-/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field.  */
-#define ELF64_ST_BIND(val)		ELF32_ST_BIND (val)
-#define ELF64_ST_TYPE(val)		ELF32_ST_TYPE (val)
-#define ELF64_ST_INFO(bind, type)	ELF32_ST_INFO ((bind), (type))
-
-/* Legal values for ST_BIND subfield of st_info (symbol binding).  */
-
-#define STB_LOCAL	0		/* Local symbol */
-#define STB_GLOBAL	1		/* Global symbol */
-#define STB_WEAK	2		/* Weak symbol */
-#define	STB_NUM		3		/* Number of defined types.  */
-#define STB_LOOS	10		/* Start of OS-specific */
-#define STB_GNU_UNIQUE	10		/* Unique symbol.  */
-#define STB_HIOS	12		/* End of OS-specific */
-#define STB_LOPROC	13		/* Start of processor-specific */
-#define STB_HIPROC	15		/* End of processor-specific */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
-
-#define STT_NOTYPE	0		/* Symbol type is unspecified */
-#define STT_OBJECT	1		/* Symbol is a data object */
-#define STT_FUNC	2		/* Symbol is a code object */
-#define STT_SECTION	3		/* Symbol associated with a section */
-#define STT_FILE	4		/* Symbol's name is file name */
-#define STT_COMMON	5		/* Symbol is a common data object */
-#define STT_TLS		6		/* Symbol is thread-local data object*/
-#define	STT_NUM		7		/* Number of defined types.  */
-#define STT_LOOS	10		/* Start of OS-specific */
-#define STT_GNU_IFUNC	10		/* Symbol is indirect code object */
-#define STT_HIOS	12		/* End of OS-specific */
-#define STT_LOPROC	13		/* Start of processor-specific */
-#define STT_HIPROC	15		/* End of processor-specific */
-
-
-/* Symbol table indices are found in the hash buckets and chain table
-   of a symbol hash table section.  This special index value indicates
-   the end of a chain, meaning no further symbols are found in that bucket.  */
-
-#define STN_UNDEF	0		/* End of a chain.  */
-
-
-/* How to extract and insert information held in the st_other field.  */
-
-#define ELF32_ST_VISIBILITY(o)	((o) & 0x03)
-
-/* For ELF64 the definitions are the same.  */
-#define ELF64_ST_VISIBILITY(o)	ELF32_ST_VISIBILITY (o)
-
-/* Symbol visibility specification encoded in the st_other field.  */
-#define STV_DEFAULT	0		/* Default symbol visibility rules */
-#define STV_INTERNAL	1		/* Processor specific hidden class */
-#define STV_HIDDEN	2		/* Sym unavailable in other modules */
-#define STV_PROTECTED	3		/* Not preemptible, not exported */
-
-
-/* Relocation table entry without addend (in section of type SHT_REL).  */
-
-typedef struct
-{
-  Elf32_Addr	r_offset;		/* Address */
-  Elf32_Word	r_info;			/* Relocation type and symbol index */
-} Elf32_Rel;
-
-/* I have seen two different definitions of the Elf64_Rel and
-   Elf64_Rela structures, so we'll leave them out until Novell (or
-   whoever) gets their act together.  */
-/* The following, at least, is used on Sparc v9, MIPS, and Alpha.  */
-
-typedef struct
-{
-  Elf64_Addr	r_offset;		/* Address */
-  Elf64_Xword	r_info;			/* Relocation type and symbol index */
-} Elf64_Rel;
-
-/* Relocation table entry with addend (in section of type SHT_RELA).  */
-
-typedef struct
-{
-  Elf32_Addr	r_offset;		/* Address */
-  Elf32_Word	r_info;			/* Relocation type and symbol index */
-  Elf32_Sword	r_addend;		/* Addend */
-} Elf32_Rela;
-
-typedef struct
-{
-  Elf64_Addr	r_offset;		/* Address */
-  Elf64_Xword	r_info;			/* Relocation type and symbol index */
-  Elf64_Sxword	r_addend;		/* Addend */
-} Elf64_Rela;
-
-/* How to extract and insert information held in the r_info field.  */
-
-#define ELF32_R_SYM(val)		((val) >> 8)
-#define ELF32_R_TYPE(val)		((val) & 0xff)
-#define ELF32_R_INFO(sym, type)		(((sym) << 8) + ((type) & 0xff))
-
-#define ELF64_R_SYM(i)			((i) >> 32)
-#define ELF64_R_TYPE(i)			((i) & 0xffffffff)
-#define ELF64_R_INFO(sym,type)		((((Elf64_Xword) (sym)) << 32) + (type))
-
-/* Program segment header.  */
-
-typedef struct
-{
-  Elf32_Word	p_type;			/* Segment type */
-  Elf32_Off	p_offset;		/* Segment file offset */
-  Elf32_Addr	p_vaddr;		/* Segment virtual address */
-  Elf32_Addr	p_paddr;		/* Segment physical address */
-  Elf32_Word	p_filesz;		/* Segment size in file */
-  Elf32_Word	p_memsz;		/* Segment size in memory */
-  Elf32_Word	p_flags;		/* Segment flags */
-  Elf32_Word	p_align;		/* Segment alignment */
-} Elf32_Phdr;
-
-typedef struct
-{
-  Elf64_Word	p_type;			/* Segment type */
-  Elf64_Word	p_flags;		/* Segment flags */
-  Elf64_Off	p_offset;		/* Segment file offset */
-  Elf64_Addr	p_vaddr;		/* Segment virtual address */
-  Elf64_Addr	p_paddr;		/* Segment physical address */
-  Elf64_Xword	p_filesz;		/* Segment size in file */
-  Elf64_Xword	p_memsz;		/* Segment size in memory */
-  Elf64_Xword	p_align;		/* Segment alignment */
-} Elf64_Phdr;
-
-/* Special value for e_phnum.  This indicates that the real number of
-   program headers is too large to fit into e_phnum.  Instead the real
-   value is in the field sh_info of section 0.  */
-
-#define PN_XNUM		0xffff
-
-/* Legal values for p_type (segment type).  */
-
-#define	PT_NULL		0		/* Program header table entry unused */
-#define PT_LOAD		1		/* Loadable program segment */
-#define PT_DYNAMIC	2		/* Dynamic linking information */
-#define PT_INTERP	3		/* Program interpreter */
-#define PT_NOTE		4		/* Auxiliary information */
-#define PT_SHLIB	5		/* Reserved */
-#define PT_PHDR		6		/* Entry for header table itself */
-#define PT_TLS		7		/* Thread-local storage segment */
-#define	PT_NUM		8		/* Number of defined types */
-#define PT_LOOS		0x60000000	/* Start of OS-specific */
-#define PT_GNU_EH_FRAME	0x6474e550	/* GCC .eh_frame_hdr segment */
-#define PT_GNU_STACK	0x6474e551	/* Indicates stack executability */
-#define PT_GNU_RELRO	0x6474e552	/* Read-only after relocation */
-#define PT_LOSUNW	0x6ffffffa
-#define PT_SUNWBSS	0x6ffffffa	/* Sun Specific segment */
-#define PT_SUNWSTACK	0x6ffffffb	/* Stack segment */
-#define PT_HISUNW	0x6fffffff
-#define PT_HIOS		0x6fffffff	/* End of OS-specific */
-#define PT_LOPROC	0x70000000	/* Start of processor-specific */
-#define PT_HIPROC	0x7fffffff	/* End of processor-specific */
-
-/* Legal values for p_flags (segment flags).  */
-
-#define PF_X		(1 << 0)	/* Segment is executable */
-#define PF_W		(1 << 1)	/* Segment is writable */
-#define PF_R		(1 << 2)	/* Segment is readable */
-#define PF_MASKOS	0x0ff00000	/* OS-specific */
-#define PF_MASKPROC	0xf0000000	/* Processor-specific */
-
-/* Legal values for note segment descriptor types for core files. */
-
-#define NT_PRSTATUS	1		/* Contains copy of prstatus struct */
-#define NT_FPREGSET	2		/* Contains copy of fpregset struct */
-#define NT_PRPSINFO	3		/* Contains copy of prpsinfo struct */
-#define NT_PRXREG	4		/* Contains copy of prxregset struct */
-#define NT_TASKSTRUCT	4		/* Contains copy of task structure */
-#define NT_PLATFORM	5		/* String from sysinfo(SI_PLATFORM) */
-#define NT_AUXV		6		/* Contains copy of auxv array */
-#define NT_GWINDOWS	7		/* Contains copy of gwindows struct */
-#define NT_ASRS		8		/* Contains copy of asrset struct */
-#define NT_PSTATUS	10		/* Contains copy of pstatus struct */
-#define NT_PSINFO	13		/* Contains copy of psinfo struct */
-#define NT_PRCRED	14		/* Contains copy of prcred struct */
-#define NT_UTSNAME	15		/* Contains copy of utsname struct */
-#define NT_LWPSTATUS	16		/* Contains copy of lwpstatus struct */
-#define NT_LWPSINFO	17		/* Contains copy of lwpinfo struct */
-#define NT_PRFPXREG	20		/* Contains copy of fprxregset struct */
-#define NT_SIGINFO	0x53494749	/* Contains copy of siginfo_t,
-					   size might increase */
-#define NT_FILE		0x46494c45	/* Contains information about mapped
-					   files */
-#define NT_PRXFPREG	0x46e62b7f	/* Contains copy of user_fxsr_struct */
-#define NT_PPC_VMX	0x100		/* PowerPC Altivec/VMX registers */
-#define NT_PPC_SPE	0x101		/* PowerPC SPE/EVR registers */
-#define NT_PPC_VSX	0x102		/* PowerPC VSX registers */
-#define NT_386_TLS	0x200		/* i386 TLS slots (struct user_desc) */
-#define NT_386_IOPERM	0x201		/* x86 io permission bitmap (1=deny) */
-#define NT_X86_XSTATE	0x202		/* x86 extended state using xsave */
-#define NT_S390_HIGH_GPRS	0x300	/* s390 upper register halves */
-#define NT_S390_TIMER	0x301		/* s390 timer register */
-#define NT_S390_TODCMP	0x302		/* s390 TOD clock comparator register */
-#define NT_S390_TODPREG	0x303		/* s390 TOD programmable register */
-#define NT_S390_CTRS	0x304		/* s390 control registers */
-#define NT_S390_PREFIX	0x305		/* s390 prefix register */
-#define NT_S390_LAST_BREAK	0x306	/* s390 breaking event address */
-#define NT_S390_SYSTEM_CALL	0x307	/* s390 system call restart data */
-#define NT_S390_TDB	0x308		/* s390 transaction diagnostic block */
-#define NT_ARM_VFP	0x400		/* ARM VFP/NEON registers */
-#define NT_ARM_TLS	0x401		/* ARM TLS register */
-#define NT_ARM_HW_BREAK	0x402		/* ARM hardware breakpoint registers */
-#define NT_ARM_HW_WATCH	0x403		/* ARM hardware watchpoint registers */
-#define NT_ARM_SYSTEM_CALL	0x404	/* ARM system call number */
-
-/* Legal values for the note segment descriptor types for object files.  */
-
-#define NT_VERSION	1		/* Contains a version string.  */
-
-
-/* Dynamic section entry.  */
-
-typedef struct
-{
-  Elf32_Sword	d_tag;			/* Dynamic entry type */
-  union
-    {
-      Elf32_Word d_val;			/* Integer value */
-      Elf32_Addr d_ptr;			/* Address value */
-    } d_un;
-} Elf32_Dyn;
-
-typedef struct
-{
-  Elf64_Sxword	d_tag;			/* Dynamic entry type */
-  union
-    {
-      Elf64_Xword d_val;		/* Integer value */
-      Elf64_Addr d_ptr;			/* Address value */
-    } d_un;
-} Elf64_Dyn;
-
-/* Legal values for d_tag (dynamic entry type).  */
-
-#define DT_NULL		0		/* Marks end of dynamic section */
-#define DT_NEEDED	1		/* Name of needed library */
-#define DT_PLTRELSZ	2		/* Size in bytes of PLT relocs */
-#define DT_PLTGOT	3		/* Processor defined value */
-#define DT_HASH		4		/* Address of symbol hash table */
-#define DT_STRTAB	5		/* Address of string table */
-#define DT_SYMTAB	6		/* Address of symbol table */
-#define DT_RELA		7		/* Address of Rela relocs */
-#define DT_RELASZ	8		/* Total size of Rela relocs */
-#define DT_RELAENT	9		/* Size of one Rela reloc */
-#define DT_STRSZ	10		/* Size of string table */
-#define DT_SYMENT	11		/* Size of one symbol table entry */
-#define DT_INIT		12		/* Address of init function */
-#define DT_FINI		13		/* Address of termination function */
-#define DT_SONAME	14		/* Name of shared object */
-#define DT_RPATH	15		/* Library search path (deprecated) */
-#define DT_SYMBOLIC	16		/* Start symbol search here */
-#define DT_REL		17		/* Address of Rel relocs */
-#define DT_RELSZ	18		/* Total size of Rel relocs */
-#define DT_RELENT	19		/* Size of one Rel reloc */
-#define DT_PLTREL	20		/* Type of reloc in PLT */
-#define DT_DEBUG	21		/* For debugging; unspecified */
-#define DT_TEXTREL	22		/* Reloc might modify .text */
-#define DT_JMPREL	23		/* Address of PLT relocs */
-#define	DT_BIND_NOW	24		/* Process relocations of object */
-#define	DT_INIT_ARRAY	25		/* Array with addresses of init fct */
-#define	DT_FINI_ARRAY	26		/* Array with addresses of fini fct */
-#define	DT_INIT_ARRAYSZ	27		/* Size in bytes of DT_INIT_ARRAY */
-#define	DT_FINI_ARRAYSZ	28		/* Size in bytes of DT_FINI_ARRAY */
-#define DT_RUNPATH	29		/* Library search path */
-#define DT_FLAGS	30		/* Flags for the object being loaded */
-#define DT_ENCODING	32		/* Start of encoded range */
-#define DT_PREINIT_ARRAY 32		/* Array with addresses of preinit fct*/
-#define DT_PREINIT_ARRAYSZ 33		/* size in bytes of DT_PREINIT_ARRAY */
-#define	DT_NUM		34		/* Number used */
-#define DT_LOOS		0x6000000d	/* Start of OS-specific */
-#define DT_HIOS		0x6ffff000	/* End of OS-specific */
-#define DT_LOPROC	0x70000000	/* Start of processor-specific */
-#define DT_HIPROC	0x7fffffff	/* End of processor-specific */
-#define	DT_PROCNUM	DT_MIPS_NUM	/* Most used by any processor */
-
-/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
-   Dyn.d_un.d_val field of the Elf*_Dyn structure.  This follows Sun's
-   approach.  */
-#define DT_VALRNGLO	0x6ffffd00
-#define DT_GNU_PRELINKED 0x6ffffdf5	/* Prelinking timestamp */
-#define DT_GNU_CONFLICTSZ 0x6ffffdf6	/* Size of conflict section */
-#define DT_GNU_LIBLISTSZ 0x6ffffdf7	/* Size of library list */
-#define DT_CHECKSUM	0x6ffffdf8
-#define DT_PLTPADSZ	0x6ffffdf9
-#define DT_MOVEENT	0x6ffffdfa
-#define DT_MOVESZ	0x6ffffdfb
-#define DT_FEATURE_1	0x6ffffdfc	/* Feature selection (DTF_*).  */
-#define DT_POSFLAG_1	0x6ffffdfd	/* Flags for DT_* entries, effecting
-					   the following DT_* entry.  */
-#define DT_SYMINSZ	0x6ffffdfe	/* Size of syminfo table (in bytes) */
-#define DT_SYMINENT	0x6ffffdff	/* Entry size of syminfo */
-#define DT_VALRNGHI	0x6ffffdff
-#define DT_VALTAGIDX(tag)	(DT_VALRNGHI - (tag))	/* Reverse order! */
-#define DT_VALNUM 12
-
-/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
-   Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
-
-   If any adjustment is made to the ELF object after it has been
-   built these entries will need to be adjusted.  */
-#define DT_ADDRRNGLO	0x6ffffe00
-#define DT_GNU_HASH	0x6ffffef5	/* GNU-style hash table.  */
-#define DT_TLSDESC_PLT	0x6ffffef6
-#define DT_TLSDESC_GOT	0x6ffffef7
-#define DT_GNU_CONFLICT	0x6ffffef8	/* Start of conflict section */
-#define DT_GNU_LIBLIST	0x6ffffef9	/* Library list */
-#define DT_CONFIG	0x6ffffefa	/* Configuration information.  */
-#define DT_DEPAUDIT	0x6ffffefb	/* Dependency auditing.  */
-#define DT_AUDIT	0x6ffffefc	/* Object auditing.  */
-#define	DT_PLTPAD	0x6ffffefd	/* PLT padding.  */
-#define	DT_MOVETAB	0x6ffffefe	/* Move table.  */
-#define DT_SYMINFO	0x6ffffeff	/* Syminfo table.  */
-#define DT_ADDRRNGHI	0x6ffffeff
-#define DT_ADDRTAGIDX(tag)	(DT_ADDRRNGHI - (tag))	/* Reverse order! */
-#define DT_ADDRNUM 11
-
-/* The versioning entry types.  The next are defined as part of the
-   GNU extension.  */
-#define DT_VERSYM	0x6ffffff0
-
-#define DT_RELACOUNT	0x6ffffff9
-#define DT_RELCOUNT	0x6ffffffa
-
-/* These were chosen by Sun.  */
-#define DT_FLAGS_1	0x6ffffffb	/* State flags, see DF_1_* below.  */
-#define	DT_VERDEF	0x6ffffffc	/* Address of version definition
-					   table */
-#define	DT_VERDEFNUM	0x6ffffffd	/* Number of version definitions */
-#define	DT_VERNEED	0x6ffffffe	/* Address of table with needed
-					   versions */
-#define	DT_VERNEEDNUM	0x6fffffff	/* Number of needed versions */
-#define DT_VERSIONTAGIDX(tag)	(DT_VERNEEDNUM - (tag))	/* Reverse order! */
-#define DT_VERSIONTAGNUM 16
-
-/* Sun added these machine-independent extensions in the "processor-specific"
-   range.  Be compatible.  */
-#define DT_AUXILIARY    0x7ffffffd      /* Shared object to load before self */
-#define DT_FILTER       0x7fffffff      /* Shared object to get values from */
-#define DT_EXTRATAGIDX(tag)	((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
-#define DT_EXTRANUM	3
-
-/* Values of `d_un.d_val' in the DT_FLAGS entry.  */
-#define DF_ORIGIN	0x00000001	/* Object may use DF_ORIGIN */
-#define DF_SYMBOLIC	0x00000002	/* Symbol resolutions starts here */
-#define DF_TEXTREL	0x00000004	/* Object contains text relocations */
-#define DF_BIND_NOW	0x00000008	/* No lazy binding for this object */
-#define DF_STATIC_TLS	0x00000010	/* Module uses the static TLS model */
-
-/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
-   entry in the dynamic section.  */
-#define DF_1_NOW	0x00000001	/* Set RTLD_NOW for this object.  */
-#define DF_1_GLOBAL	0x00000002	/* Set RTLD_GLOBAL for this object.  */
-#define DF_1_GROUP	0x00000004	/* Set RTLD_GROUP for this object.  */
-#define DF_1_NODELETE	0x00000008	/* Set RTLD_NODELETE for this object.*/
-#define DF_1_LOADFLTR	0x00000010	/* Trigger filtee loading at runtime.*/
-#define DF_1_INITFIRST	0x00000020	/* Set RTLD_INITFIRST for this object*/
-#define DF_1_NOOPEN	0x00000040	/* Set RTLD_NOOPEN for this object.  */
-#define DF_1_ORIGIN	0x00000080	/* $ORIGIN must be handled.  */
-#define DF_1_DIRECT	0x00000100	/* Direct binding enabled.  */
-#define DF_1_TRANS	0x00000200
-#define DF_1_INTERPOSE	0x00000400	/* Object is used to interpose.  */
-#define DF_1_NODEFLIB	0x00000800	/* Ignore default lib search path.  */
-#define DF_1_NODUMP	0x00001000	/* Object can't be dldump'ed.  */
-#define DF_1_CONFALT	0x00002000	/* Configuration alternative created.*/
-#define DF_1_ENDFILTEE	0x00004000	/* Filtee terminates filters search. */
-#define	DF_1_DISPRELDNE	0x00008000	/* Disp reloc applied at build time. */
-#define	DF_1_DISPRELPND	0x00010000	/* Disp reloc applied at run-time.  */
-#define	DF_1_NODIRECT	0x00020000	/* Object has no-direct binding. */
-#define	DF_1_IGNMULDEF	0x00040000
-#define	DF_1_NOKSYMS	0x00080000
-#define	DF_1_NOHDR	0x00100000
-#define	DF_1_EDITED	0x00200000	/* Object is modified after built.  */
-#define	DF_1_NORELOC	0x00400000
-#define	DF_1_SYMINTPOSE	0x00800000	/* Object has individual interposers.  */
-#define	DF_1_GLOBAUDIT	0x01000000	/* Global auditing required.  */
-#define	DF_1_SINGLETON	0x02000000	/* Singleton symbols are used.  */
-
-/* Flags for the feature selection in DT_FEATURE_1.  */
-#define DTF_1_PARINIT	0x00000001
-#define DTF_1_CONFEXP	0x00000002
-
-/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry.  */
-#define DF_P1_LAZYLOAD	0x00000001	/* Lazyload following object.  */
-#define DF_P1_GROUPPERM	0x00000002	/* Symbols from next object are not
-					   generally available.  */
-
-/* Version definition sections.  */
-
-typedef struct
-{
-  Elf32_Half	vd_version;		/* Version revision */
-  Elf32_Half	vd_flags;		/* Version information */
-  Elf32_Half	vd_ndx;			/* Version Index */
-  Elf32_Half	vd_cnt;			/* Number of associated aux entries */
-  Elf32_Word	vd_hash;		/* Version name hash value */
-  Elf32_Word	vd_aux;			/* Offset in bytes to verdaux array */
-  Elf32_Word	vd_next;		/* Offset in bytes to next verdef
-					   entry */
-} Elf32_Verdef;
-
-typedef struct
-{
-  Elf64_Half	vd_version;		/* Version revision */
-  Elf64_Half	vd_flags;		/* Version information */
-  Elf64_Half	vd_ndx;			/* Version Index */
-  Elf64_Half	vd_cnt;			/* Number of associated aux entries */
-  Elf64_Word	vd_hash;		/* Version name hash value */
-  Elf64_Word	vd_aux;			/* Offset in bytes to verdaux array */
-  Elf64_Word	vd_next;		/* Offset in bytes to next verdef
-					   entry */
-} Elf64_Verdef;
-
-
-/* Legal values for vd_version (version revision).  */
-#define VER_DEF_NONE	0		/* No version */
-#define VER_DEF_CURRENT	1		/* Current version */
-#define VER_DEF_NUM	2		/* Given version number */
-
-/* Legal values for vd_flags (version information flags).  */
-#define VER_FLG_BASE	0x1		/* Version definition of file itself */
-#define VER_FLG_WEAK	0x2		/* Weak version identifier */
-
-/* Versym symbol index values.  */
-#define	VER_NDX_LOCAL		0	/* Symbol is local.  */
-#define	VER_NDX_GLOBAL		1	/* Symbol is global.  */
-#define	VER_NDX_LORESERVE	0xff00	/* Beginning of reserved entries.  */
-#define	VER_NDX_ELIMINATE	0xff01	/* Symbol is to be eliminated.  */
-
-/* Auxialiary version information.  */
-
-typedef struct
-{
-  Elf32_Word	vda_name;		/* Version or dependency names */
-  Elf32_Word	vda_next;		/* Offset in bytes to next verdaux
-					   entry */
-} Elf32_Verdaux;
-
-typedef struct
-{
-  Elf64_Word	vda_name;		/* Version or dependency names */
-  Elf64_Word	vda_next;		/* Offset in bytes to next verdaux
-					   entry */
-} Elf64_Verdaux;
-
-
-/* Version dependency section.  */
-
-typedef struct
-{
-  Elf32_Half	vn_version;		/* Version of structure */
-  Elf32_Half	vn_cnt;			/* Number of associated aux entries */
-  Elf32_Word	vn_file;		/* Offset of filename for this
-					   dependency */
-  Elf32_Word	vn_aux;			/* Offset in bytes to vernaux array */
-  Elf32_Word	vn_next;		/* Offset in bytes to next verneed
-					   entry */
-} Elf32_Verneed;
-
-typedef struct
-{
-  Elf64_Half	vn_version;		/* Version of structure */
-  Elf64_Half	vn_cnt;			/* Number of associated aux entries */
-  Elf64_Word	vn_file;		/* Offset of filename for this
-					   dependency */
-  Elf64_Word	vn_aux;			/* Offset in bytes to vernaux array */
-  Elf64_Word	vn_next;		/* Offset in bytes to next verneed
-					   entry */
-} Elf64_Verneed;
-
-
-/* Legal values for vn_version (version revision).  */
-#define VER_NEED_NONE	 0		/* No version */
-#define VER_NEED_CURRENT 1		/* Current version */
-#define VER_NEED_NUM	 2		/* Given version number */
-
-/* Auxiliary needed version information.  */
-
-typedef struct
-{
-  Elf32_Word	vna_hash;		/* Hash value of dependency name */
-  Elf32_Half	vna_flags;		/* Dependency specific information */
-  Elf32_Half	vna_other;		/* Unused */
-  Elf32_Word	vna_name;		/* Dependency name string offset */
-  Elf32_Word	vna_next;		/* Offset in bytes to next vernaux
-					   entry */
-} Elf32_Vernaux;
-
-typedef struct
-{
-  Elf64_Word	vna_hash;		/* Hash value of dependency name */
-  Elf64_Half	vna_flags;		/* Dependency specific information */
-  Elf64_Half	vna_other;		/* Unused */
-  Elf64_Word	vna_name;		/* Dependency name string offset */
-  Elf64_Word	vna_next;		/* Offset in bytes to next vernaux
-					   entry */
-} Elf64_Vernaux;
-
-
-/* Legal values for vna_flags.  */
-#define VER_FLG_WEAK	0x2		/* Weak version identifier */
-
-
-/* Auxiliary vector.  */
-
-/* This vector is normally only used by the program interpreter.  The
-   usual definition in an ABI supplement uses the name auxv_t.  The
-   vector is not usually defined in a standard <elf.h> file, but it
-   can't hurt.  We rename it to avoid conflicts.  The sizes of these
-   types are an arrangement between the exec server and the program
-   interpreter, so we don't fully specify them here.  */
-
-typedef struct
-{
-  uint32_t a_type;		/* Entry type */
-  union
-    {
-      uint32_t a_val;		/* Integer value */
-      /* We use to have pointer elements added here.  We cannot do that,
-	 though, since it does not work when using 32-bit definitions
-	 on 64-bit platforms and vice versa.  */
-    } a_un;
-} Elf32_auxv_t;
-
-typedef struct
-{
-  uint64_t a_type;		/* Entry type */
-  union
-    {
-      uint64_t a_val;		/* Integer value */
-      /* We use to have pointer elements added here.  We cannot do that,
-	 though, since it does not work when using 32-bit definitions
-	 on 64-bit platforms and vice versa.  */
-    } a_un;
-} Elf64_auxv_t;
-
-/* Legal values for a_type (entry type).  */
-
-#define AT_NULL		0		/* End of vector */
-#define AT_IGNORE	1		/* Entry should be ignored */
-#define AT_EXECFD	2		/* File descriptor of program */
-#define AT_PHDR		3		/* Program headers for program */
-#define AT_PHENT	4		/* Size of program header entry */
-#define AT_PHNUM	5		/* Number of program headers */
-#define AT_PAGESZ	6		/* System page size */
-#define AT_BASE		7		/* Base address of interpreter */
-#define AT_FLAGS	8		/* Flags */
-#define AT_ENTRY	9		/* Entry point of program */
-#define AT_NOTELF	10		/* Program is not ELF */
-#define AT_UID		11		/* Real uid */
-#define AT_EUID		12		/* Effective uid */
-#define AT_GID		13		/* Real gid */
-#define AT_EGID		14		/* Effective gid */
-#define AT_CLKTCK	17		/* Frequency of times() */
-
-/* Some more special a_type values describing the hardware.  */
-#define AT_PLATFORM	15		/* String identifying platform.  */
-#define AT_HWCAP	16		/* Machine-dependent hints about
-					   processor capabilities.  */
-
-/* This entry gives some information about the FPU initialization
-   performed by the kernel.  */
-#define AT_FPUCW	18		/* Used FPU control word.  */
-
-/* Cache block sizes.  */
-#define AT_DCACHEBSIZE	19		/* Data cache block size.  */
-#define AT_ICACHEBSIZE	20		/* Instruction cache block size.  */
-#define AT_UCACHEBSIZE	21		/* Unified cache block size.  */
-
-/* A special ignored value for PPC, used by the kernel to control the
-   interpretation of the AUXV. Must be > 16.  */
-#define AT_IGNOREPPC	22		/* Entry should be ignored.  */
-
-#define	AT_SECURE	23		/* Boolean, was exec setuid-like?  */
-
-#define AT_BASE_PLATFORM 24		/* String identifying real platforms.*/
-
-#define AT_RANDOM	25		/* Address of 16 random bytes.  */
-
-#define AT_HWCAP2	26		/* More machine-dependent hints about
-					   processor capabilities.  */
-
-#define AT_EXECFN	31		/* Filename of executable.  */
-
-/* Pointer to the global system page used for system calls and other
-   nice things.  */
-#define AT_SYSINFO	32
-#define AT_SYSINFO_EHDR	33
-
-/* Shapes of the caches.  Bits 0-3 contains associativity; bits 4-7 contains
-   log2 of line size; mask those to get cache size.  */
-#define AT_L1I_CACHESHAPE	34
-#define AT_L1D_CACHESHAPE	35
-#define AT_L2_CACHESHAPE	36
-#define AT_L3_CACHESHAPE	37
-
-/* Shapes of the caches, with more room to describe them.
-   *GEOMETRY are comprised of cache line size in bytes in the bottom 16 bits
-   and the cache associativity in the next 16 bits.  */
-#define AT_L1I_CACHESIZE	40
-#define AT_L1I_CACHEGEOMETRY	41
-#define AT_L1D_CACHESIZE	42
-#define AT_L1D_CACHEGEOMETRY	43
-#define AT_L2_CACHESIZE		44
-#define AT_L2_CACHEGEOMETRY	45
-#define AT_L3_CACHESIZE		46
-#define AT_L3_CACHEGEOMETRY	47
-
-/* Note section contents.  Each entry in the note section begins with
-   a header of a fixed form.  */
-
-typedef struct
-{
-  Elf32_Word n_namesz;			/* Length of the note's name.  */
-  Elf32_Word n_descsz;			/* Length of the note's descriptor.  */
-  Elf32_Word n_type;			/* Type of the note.  */
-} Elf32_Nhdr;
-
-typedef struct
-{
-  Elf64_Word n_namesz;			/* Length of the note's name.  */
-  Elf64_Word n_descsz;			/* Length of the note's descriptor.  */
-  Elf64_Word n_type;			/* Type of the note.  */
-} Elf64_Nhdr;
-
-/* Known names of notes.  */
-
-/* Solaris entries in the note section have this name.  */
-#define ELF_NOTE_SOLARIS	"SUNW Solaris"
-
-/* Note entries for GNU systems have this name.  */
-#define ELF_NOTE_GNU		"GNU"
-
-
-/* Defined types of notes for Solaris.  */
-
-/* Value of descriptor (one word) is desired pagesize for the binary.  */
-#define ELF_NOTE_PAGESIZE_HINT	1
-
-
-/* Defined note types for GNU systems.  */
-
-/* ABI information.  The descriptor consists of words:
-   word 0: OS descriptor
-   word 1: major version of the ABI
-   word 2: minor version of the ABI
-   word 3: subminor version of the ABI
-*/
-#define NT_GNU_ABI_TAG	1
-#define ELF_NOTE_ABI	NT_GNU_ABI_TAG /* Old name.  */
-
-/* Known OSes.  These values can appear in word 0 of an
-   NT_GNU_ABI_TAG note section entry.  */
-#define ELF_NOTE_OS_LINUX	0
-#define ELF_NOTE_OS_GNU		1
-#define ELF_NOTE_OS_SOLARIS2	2
-#define ELF_NOTE_OS_FREEBSD	3
-
-/* Synthetic hwcap information.  The descriptor begins with two words:
-   word 0: number of entries
-   word 1: bitmask of enabled entries
-   Then follow variable-length entries, one byte followed by a
-   '\0'-terminated hwcap name string.  The byte gives the bit
-   number to test if enabled, (1U << bit) & bitmask.  */
-#define NT_GNU_HWCAP	2
-
-/* Build ID bits as generated by ld --build-id.
-   The descriptor consists of any nonzero number of bytes.  */
-#define NT_GNU_BUILD_ID	3
-
-/* Version note generated by GNU gold containing a version string.  */
-#define NT_GNU_GOLD_VERSION	4
-
-
-/* Move records.  */
-typedef struct
-{
-  Elf32_Xword m_value;		/* Symbol value.  */
-  Elf32_Word m_info;		/* Size and index.  */
-  Elf32_Word m_poffset;		/* Symbol offset.  */
-  Elf32_Half m_repeat;		/* Repeat count.  */
-  Elf32_Half m_stride;		/* Stride info.  */
-} Elf32_Move;
-
-typedef struct
-{
-  Elf64_Xword m_value;		/* Symbol value.  */
-  Elf64_Xword m_info;		/* Size and index.  */
-  Elf64_Xword m_poffset;	/* Symbol offset.  */
-  Elf64_Half m_repeat;		/* Repeat count.  */
-  Elf64_Half m_stride;		/* Stride info.  */
-} Elf64_Move;
-
-/* Macro to construct move records.  */
-#define ELF32_M_SYM(info)	((info) >> 8)
-#define ELF32_M_SIZE(info)	((unsigned char) (info))
-#define ELF32_M_INFO(sym, size)	(((sym) << 8) + (unsigned char) (size))
-
-#define ELF64_M_SYM(info)	ELF32_M_SYM (info)
-#define ELF64_M_SIZE(info)	ELF32_M_SIZE (info)
-#define ELF64_M_INFO(sym, size)	ELF32_M_INFO (sym, size)
-
-
-/* Motorola 68k specific definitions.  */
-
-/* Values for Elf32_Ehdr.e_flags.  */
-#define EF_CPU32	0x00810000
-
-/* m68k relocs.  */
-
-#define R_68K_NONE	0		/* No reloc */
-#define R_68K_32	1		/* Direct 32 bit  */
-#define R_68K_16	2		/* Direct 16 bit  */
-#define R_68K_8		3		/* Direct 8 bit  */
-#define R_68K_PC32	4		/* PC relative 32 bit */
-#define R_68K_PC16	5		/* PC relative 16 bit */
-#define R_68K_PC8	6		/* PC relative 8 bit */
-#define R_68K_GOT32	7		/* 32 bit PC relative GOT entry */
-#define R_68K_GOT16	8		/* 16 bit PC relative GOT entry */
-#define R_68K_GOT8	9		/* 8 bit PC relative GOT entry */
-#define R_68K_GOT32O	10		/* 32 bit GOT offset */
-#define R_68K_GOT16O	11		/* 16 bit GOT offset */
-#define R_68K_GOT8O	12		/* 8 bit GOT offset */
-#define R_68K_PLT32	13		/* 32 bit PC relative PLT address */
-#define R_68K_PLT16	14		/* 16 bit PC relative PLT address */
-#define R_68K_PLT8	15		/* 8 bit PC relative PLT address */
-#define R_68K_PLT32O	16		/* 32 bit PLT offset */
-#define R_68K_PLT16O	17		/* 16 bit PLT offset */
-#define R_68K_PLT8O	18		/* 8 bit PLT offset */
-#define R_68K_COPY	19		/* Copy symbol at runtime */
-#define R_68K_GLOB_DAT	20		/* Create GOT entry */
-#define R_68K_JMP_SLOT	21		/* Create PLT entry */
-#define R_68K_RELATIVE	22		/* Adjust by program base */
-#define R_68K_TLS_GD32      25          /* 32 bit GOT offset for GD */
-#define R_68K_TLS_GD16      26          /* 16 bit GOT offset for GD */
-#define R_68K_TLS_GD8       27          /* 8 bit GOT offset for GD */
-#define R_68K_TLS_LDM32     28          /* 32 bit GOT offset for LDM */
-#define R_68K_TLS_LDM16     29          /* 16 bit GOT offset for LDM */
-#define R_68K_TLS_LDM8      30          /* 8 bit GOT offset for LDM */
-#define R_68K_TLS_LDO32     31          /* 32 bit module-relative offset */
-#define R_68K_TLS_LDO16     32          /* 16 bit module-relative offset */
-#define R_68K_TLS_LDO8      33          /* 8 bit module-relative offset */
-#define R_68K_TLS_IE32      34          /* 32 bit GOT offset for IE */
-#define R_68K_TLS_IE16      35          /* 16 bit GOT offset for IE */
-#define R_68K_TLS_IE8       36          /* 8 bit GOT offset for IE */
-#define R_68K_TLS_LE32      37          /* 32 bit offset relative to
-					   static TLS block */
-#define R_68K_TLS_LE16      38          /* 16 bit offset relative to
-					   static TLS block */
-#define R_68K_TLS_LE8       39          /* 8 bit offset relative to
-					   static TLS block */
-#define R_68K_TLS_DTPMOD32  40          /* 32 bit module number */
-#define R_68K_TLS_DTPREL32  41          /* 32 bit module-relative offset */
-#define R_68K_TLS_TPREL32   42          /* 32 bit TP-relative offset */
-/* Keep this the last entry.  */
-#define R_68K_NUM	43
-
-/* Intel 80386 specific definitions.  */
-
-/* i386 relocs.  */
-
-#define R_386_NONE	   0		/* No reloc */
-#define R_386_32	   1		/* Direct 32 bit  */
-#define R_386_PC32	   2		/* PC relative 32 bit */
-#define R_386_GOT32	   3		/* 32 bit GOT entry */
-#define R_386_PLT32	   4		/* 32 bit PLT address */
-#define R_386_COPY	   5		/* Copy symbol at runtime */
-#define R_386_GLOB_DAT	   6		/* Create GOT entry */
-#define R_386_JMP_SLOT	   7		/* Create PLT entry */
-#define R_386_RELATIVE	   8		/* Adjust by program base */
-#define R_386_GOTOFF	   9		/* 32 bit offset to GOT */
-#define R_386_GOTPC	   10		/* 32 bit PC relative offset to GOT */
-#define R_386_32PLT	   11
-#define R_386_TLS_TPOFF	   14		/* Offset in static TLS block */
-#define R_386_TLS_IE	   15		/* Address of GOT entry for static TLS
-					   block offset */
-#define R_386_TLS_GOTIE	   16		/* GOT entry for static TLS block
-					   offset */
-#define R_386_TLS_LE	   17		/* Offset relative to static TLS
-					   block */
-#define R_386_TLS_GD	   18		/* Direct 32 bit for GNU version of
-					   general dynamic thread local data */
-#define R_386_TLS_LDM	   19		/* Direct 32 bit for GNU version of
-					   local dynamic thread local data
-					   in LE code */
-#define R_386_16	   20
-#define R_386_PC16	   21
-#define R_386_8		   22
-#define R_386_PC8	   23
-#define R_386_TLS_GD_32	   24		/* Direct 32 bit for general dynamic
-					   thread local data */
-#define R_386_TLS_GD_PUSH  25		/* Tag for pushl in GD TLS code */
-#define R_386_TLS_GD_CALL  26		/* Relocation for call to
-					   __tls_get_addr() */
-#define R_386_TLS_GD_POP   27		/* Tag for popl in GD TLS code */
-#define R_386_TLS_LDM_32   28		/* Direct 32 bit for local dynamic
-					   thread local data in LE code */
-#define R_386_TLS_LDM_PUSH 29		/* Tag for pushl in LDM TLS code */
-#define R_386_TLS_LDM_CALL 30		/* Relocation for call to
-					   __tls_get_addr() in LDM code */
-#define R_386_TLS_LDM_POP  31		/* Tag for popl in LDM TLS code */
-#define R_386_TLS_LDO_32   32		/* Offset relative to TLS block */
-#define R_386_TLS_IE_32	   33		/* GOT entry for negated static TLS
-					   block offset */
-#define R_386_TLS_LE_32	   34		/* Negated offset relative to static
-					   TLS block */
-#define R_386_TLS_DTPMOD32 35		/* ID of module containing symbol */
-#define R_386_TLS_DTPOFF32 36		/* Offset in TLS block */
-#define R_386_TLS_TPOFF32  37		/* Negated offset in static TLS block */
-#define R_386_SIZE32	   38 		/* 32-bit symbol size */
-#define R_386_TLS_GOTDESC  39		/* GOT offset for TLS descriptor.  */
-#define R_386_TLS_DESC_CALL 40		/* Marker of call through TLS
-					   descriptor for
-					   relaxation.  */
-#define R_386_TLS_DESC     41		/* TLS descriptor containing
-					   pointer to code and to
-					   argument, returning the TLS
-					   offset for the symbol.  */
-#define R_386_IRELATIVE	   42		/* Adjust indirectly by program base */
-#define R_386_GOT32X	   43		/* Load from 32 bit GOT entry,
-					   relaxable. */
-/* Keep this the last entry.  */
-#define R_386_NUM	   44
-
-/* SUN SPARC specific definitions.  */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
-
-#define STT_SPARC_REGISTER	13	/* Global register reserved to app. */
-
-/* Values for Elf64_Ehdr.e_flags.  */
-
-#define EF_SPARCV9_MM		3
-#define EF_SPARCV9_TSO		0
-#define EF_SPARCV9_PSO		1
-#define EF_SPARCV9_RMO		2
-#define EF_SPARC_LEDATA		0x800000 /* little endian data */
-#define EF_SPARC_EXT_MASK	0xFFFF00
-#define EF_SPARC_32PLUS		0x000100 /* generic V8+ features */
-#define EF_SPARC_SUN_US1	0x000200 /* Sun UltraSPARC1 extensions */
-#define EF_SPARC_HAL_R1		0x000400 /* HAL R1 extensions */
-#define EF_SPARC_SUN_US3	0x000800 /* Sun UltraSPARCIII extensions */
-
-/* SPARC relocs.  */
-
-#define R_SPARC_NONE		0	/* No reloc */
-#define R_SPARC_8		1	/* Direct 8 bit */
-#define R_SPARC_16		2	/* Direct 16 bit */
-#define R_SPARC_32		3	/* Direct 32 bit */
-#define R_SPARC_DISP8		4	/* PC relative 8 bit */
-#define R_SPARC_DISP16		5	/* PC relative 16 bit */
-#define R_SPARC_DISP32		6	/* PC relative 32 bit */
-#define R_SPARC_WDISP30		7	/* PC relative 30 bit shifted */
-#define R_SPARC_WDISP22		8	/* PC relative 22 bit shifted */
-#define R_SPARC_HI22		9	/* High 22 bit */
-#define R_SPARC_22		10	/* Direct 22 bit */
-#define R_SPARC_13		11	/* Direct 13 bit */
-#define R_SPARC_LO10		12	/* Truncated 10 bit */
-#define R_SPARC_GOT10		13	/* Truncated 10 bit GOT entry */
-#define R_SPARC_GOT13		14	/* 13 bit GOT entry */
-#define R_SPARC_GOT22		15	/* 22 bit GOT entry shifted */
-#define R_SPARC_PC10		16	/* PC relative 10 bit truncated */
-#define R_SPARC_PC22		17	/* PC relative 22 bit shifted */
-#define R_SPARC_WPLT30		18	/* 30 bit PC relative PLT address */
-#define R_SPARC_COPY		19	/* Copy symbol at runtime */
-#define R_SPARC_GLOB_DAT	20	/* Create GOT entry */
-#define R_SPARC_JMP_SLOT	21	/* Create PLT entry */
-#define R_SPARC_RELATIVE	22	/* Adjust by program base */
-#define R_SPARC_UA32		23	/* Direct 32 bit unaligned */
-
-/* Additional Sparc64 relocs.  */
-
-#define R_SPARC_PLT32		24	/* Direct 32 bit ref to PLT entry */
-#define R_SPARC_HIPLT22		25	/* High 22 bit PLT entry */
-#define R_SPARC_LOPLT10		26	/* Truncated 10 bit PLT entry */
-#define R_SPARC_PCPLT32		27	/* PC rel 32 bit ref to PLT entry */
-#define R_SPARC_PCPLT22		28	/* PC rel high 22 bit PLT entry */
-#define R_SPARC_PCPLT10		29	/* PC rel trunc 10 bit PLT entry */
-#define R_SPARC_10		30	/* Direct 10 bit */
-#define R_SPARC_11		31	/* Direct 11 bit */
-#define R_SPARC_64		32	/* Direct 64 bit */
-#define R_SPARC_OLO10		33	/* 10bit with secondary 13bit addend */
-#define R_SPARC_HH22		34	/* Top 22 bits of direct 64 bit */
-#define R_SPARC_HM10		35	/* High middle 10 bits of ... */
-#define R_SPARC_LM22		36	/* Low middle 22 bits of ... */
-#define R_SPARC_PC_HH22		37	/* Top 22 bits of pc rel 64 bit */
-#define R_SPARC_PC_HM10		38	/* High middle 10 bit of ... */
-#define R_SPARC_PC_LM22		39	/* Low miggle 22 bits of ... */
-#define R_SPARC_WDISP16		40	/* PC relative 16 bit shifted */
-#define R_SPARC_WDISP19		41	/* PC relative 19 bit shifted */
-#define R_SPARC_GLOB_JMP	42	/* was part of v9 ABI but was removed */
-#define R_SPARC_7		43	/* Direct 7 bit */
-#define R_SPARC_5		44	/* Direct 5 bit */
-#define R_SPARC_6		45	/* Direct 6 bit */
-#define R_SPARC_DISP64		46	/* PC relative 64 bit */
-#define R_SPARC_PLT64		47	/* Direct 64 bit ref to PLT entry */
-#define R_SPARC_HIX22		48	/* High 22 bit complemented */
-#define R_SPARC_LOX10		49	/* Truncated 11 bit complemented */
-#define R_SPARC_H44		50	/* Direct high 12 of 44 bit */
-#define R_SPARC_M44		51	/* Direct mid 22 of 44 bit */
-#define R_SPARC_L44		52	/* Direct low 10 of 44 bit */
-#define R_SPARC_REGISTER	53	/* Global register usage */
-#define R_SPARC_UA64		54	/* Direct 64 bit unaligned */
-#define R_SPARC_UA16		55	/* Direct 16 bit unaligned */
-#define R_SPARC_TLS_GD_HI22	56
-#define R_SPARC_TLS_GD_LO10	57
-#define R_SPARC_TLS_GD_ADD	58
-#define R_SPARC_TLS_GD_CALL	59
-#define R_SPARC_TLS_LDM_HI22	60
-#define R_SPARC_TLS_LDM_LO10	61
-#define R_SPARC_TLS_LDM_ADD	62
-#define R_SPARC_TLS_LDM_CALL	63
-#define R_SPARC_TLS_LDO_HIX22	64
-#define R_SPARC_TLS_LDO_LOX10	65
-#define R_SPARC_TLS_LDO_ADD	66
-#define R_SPARC_TLS_IE_HI22	67
-#define R_SPARC_TLS_IE_LO10	68
-#define R_SPARC_TLS_IE_LD	69
-#define R_SPARC_TLS_IE_LDX	70
-#define R_SPARC_TLS_IE_ADD	71
-#define R_SPARC_TLS_LE_HIX22	72
-#define R_SPARC_TLS_LE_LOX10	73
-#define R_SPARC_TLS_DTPMOD32	74
-#define R_SPARC_TLS_DTPMOD64	75
-#define R_SPARC_TLS_DTPOFF32	76
-#define R_SPARC_TLS_DTPOFF64	77
-#define R_SPARC_TLS_TPOFF32	78
-#define R_SPARC_TLS_TPOFF64	79
-#define R_SPARC_GOTDATA_HIX22	80
-#define R_SPARC_GOTDATA_LOX10	81
-#define R_SPARC_GOTDATA_OP_HIX22	82
-#define R_SPARC_GOTDATA_OP_LOX10	83
-#define R_SPARC_GOTDATA_OP	84
-#define R_SPARC_H34		85
-#define R_SPARC_SIZE32		86
-#define R_SPARC_SIZE64		87
-#define R_SPARC_WDISP10		88
-#define R_SPARC_JMP_IREL	248
-#define R_SPARC_IRELATIVE	249
-#define R_SPARC_GNU_VTINHERIT	250
-#define R_SPARC_GNU_VTENTRY	251
-#define R_SPARC_REV32		252
-/* Keep this the last entry.  */
-#define R_SPARC_NUM		253
-
-/* For Sparc64, legal values for d_tag of Elf64_Dyn.  */
-
-#define DT_SPARC_REGISTER	0x70000001
-#define DT_SPARC_NUM		2
-
-/* MIPS R3000 specific definitions.  */
-
-/* Legal values for e_flags field of Elf32_Ehdr.  */
-
-#define EF_MIPS_NOREORDER	1     /* A .noreorder directive was used.  */
-#define EF_MIPS_PIC		2     /* Contains PIC code.  */
-#define EF_MIPS_CPIC		4     /* Uses PIC calling sequence.  */
-#define EF_MIPS_XGOT		8
-#define EF_MIPS_64BIT_WHIRL	16
-#define EF_MIPS_ABI2		32
-#define EF_MIPS_ABI_ON32	64
-#define EF_MIPS_FP64		512  /* Uses FP64 (12 callee-saved).  */
-#define EF_MIPS_NAN2008	1024  /* Uses IEEE 754-2008 NaN encoding.  */
-#define EF_MIPS_ARCH		0xf0000000 /* MIPS architecture level.  */
-
-/* Legal values for MIPS architecture level.  */
-
-#define EF_MIPS_ARCH_1		0x00000000 /* -mips1 code.  */
-#define EF_MIPS_ARCH_2		0x10000000 /* -mips2 code.  */
-#define EF_MIPS_ARCH_3		0x20000000 /* -mips3 code.  */
-#define EF_MIPS_ARCH_4		0x30000000 /* -mips4 code.  */
-#define EF_MIPS_ARCH_5		0x40000000 /* -mips5 code.  */
-#define EF_MIPS_ARCH_32		0x50000000 /* MIPS32 code.  */
-#define EF_MIPS_ARCH_64		0x60000000 /* MIPS64 code.  */
-#define EF_MIPS_ARCH_32R2	0x70000000 /* MIPS32r2 code.  */
-#define EF_MIPS_ARCH_64R2	0x80000000 /* MIPS64r2 code.  */
-
-/* The following are unofficial names and should not be used.  */
-
-#define E_MIPS_ARCH_1		EF_MIPS_ARCH_1
-#define E_MIPS_ARCH_2		EF_MIPS_ARCH_2
-#define E_MIPS_ARCH_3		EF_MIPS_ARCH_3
-#define E_MIPS_ARCH_4		EF_MIPS_ARCH_4
-#define E_MIPS_ARCH_5		EF_MIPS_ARCH_5
-#define E_MIPS_ARCH_32		EF_MIPS_ARCH_32
-#define E_MIPS_ARCH_64		EF_MIPS_ARCH_64
-
-/* Special section indices.  */
-
-#define SHN_MIPS_ACOMMON	0xff00	/* Allocated common symbols.  */
-#define SHN_MIPS_TEXT		0xff01	/* Allocated test symbols.  */
-#define SHN_MIPS_DATA		0xff02	/* Allocated data symbols.  */
-#define SHN_MIPS_SCOMMON 	0xff03	/* Small common symbols.  */
-#define SHN_MIPS_SUNDEFINED	0xff04	/* Small undefined symbols.  */
-
-/* Legal values for sh_type field of Elf32_Shdr.  */
-
-#define SHT_MIPS_LIBLIST	0x70000000 /* Shared objects used in link.  */
-#define SHT_MIPS_MSYM		0x70000001
-#define SHT_MIPS_CONFLICT	0x70000002 /* Conflicting symbols.  */
-#define SHT_MIPS_GPTAB		0x70000003 /* Global data area sizes.  */
-#define SHT_MIPS_UCODE		0x70000004 /* Reserved for SGI/MIPS compilers */
-#define SHT_MIPS_DEBUG		0x70000005 /* MIPS ECOFF debugging info.  */
-#define SHT_MIPS_REGINFO	0x70000006 /* Register usage information.  */
-#define SHT_MIPS_PACKAGE	0x70000007
-#define SHT_MIPS_PACKSYM	0x70000008
-#define SHT_MIPS_RELD		0x70000009
-#define SHT_MIPS_IFACE		0x7000000b
-#define SHT_MIPS_CONTENT	0x7000000c
-#define SHT_MIPS_OPTIONS	0x7000000d /* Miscellaneous options.  */
-#define SHT_MIPS_SHDR		0x70000010
-#define SHT_MIPS_FDESC		0x70000011
-#define SHT_MIPS_EXTSYM		0x70000012
-#define SHT_MIPS_DENSE		0x70000013
-#define SHT_MIPS_PDESC		0x70000014
-#define SHT_MIPS_LOCSYM		0x70000015
-#define SHT_MIPS_AUXSYM		0x70000016
-#define SHT_MIPS_OPTSYM		0x70000017
-#define SHT_MIPS_LOCSTR		0x70000018
-#define SHT_MIPS_LINE		0x70000019
-#define SHT_MIPS_RFDESC		0x7000001a
-#define SHT_MIPS_DELTASYM	0x7000001b
-#define SHT_MIPS_DELTAINST	0x7000001c
-#define SHT_MIPS_DELTACLASS	0x7000001d
-#define SHT_MIPS_DWARF		0x7000001e /* DWARF debugging information.  */
-#define SHT_MIPS_DELTADECL	0x7000001f
-#define SHT_MIPS_SYMBOL_LIB	0x70000020
-#define SHT_MIPS_EVENTS		0x70000021 /* Event section.  */
-#define SHT_MIPS_TRANSLATE	0x70000022
-#define SHT_MIPS_PIXIE		0x70000023
-#define SHT_MIPS_XLATE		0x70000024
-#define SHT_MIPS_XLATE_DEBUG	0x70000025
-#define SHT_MIPS_WHIRL		0x70000026
-#define SHT_MIPS_EH_REGION	0x70000027
-#define SHT_MIPS_XLATE_OLD	0x70000028
-#define SHT_MIPS_PDR_EXCEPTION	0x70000029
-
-/* Legal values for sh_flags field of Elf32_Shdr.  */
-
-#define SHF_MIPS_GPREL		0x10000000 /* Must be in global data area.  */
-#define SHF_MIPS_MERGE		0x20000000
-#define SHF_MIPS_ADDR		0x40000000
-#define SHF_MIPS_STRINGS	0x80000000
-#define SHF_MIPS_NOSTRIP	0x08000000
-#define SHF_MIPS_LOCAL		0x04000000
-#define SHF_MIPS_NAMES		0x02000000
-#define SHF_MIPS_NODUPE		0x01000000
-
-
-/* Symbol tables.  */
-
-/* MIPS specific values for `st_other'.  */
-#define STO_MIPS_DEFAULT		0x0
-#define STO_MIPS_INTERNAL		0x1
-#define STO_MIPS_HIDDEN			0x2
-#define STO_MIPS_PROTECTED		0x3
-#define STO_MIPS_PLT			0x8
-#define STO_MIPS_SC_ALIGN_UNUSED	0xff
-
-/* MIPS specific values for `st_info'.  */
-#define STB_MIPS_SPLIT_COMMON		13
-
-/* Entries found in sections of type SHT_MIPS_GPTAB.  */
-
-typedef union
-{
-  struct
-    {
-      Elf32_Word gt_current_g_value;	/* -G value used for compilation.  */
-      Elf32_Word gt_unused;		/* Not used.  */
-    } gt_header;			/* First entry in section.  */
-  struct
-    {
-      Elf32_Word gt_g_value;		/* If this value were used for -G.  */
-      Elf32_Word gt_bytes;		/* This many bytes would be used.  */
-    } gt_entry;				/* Subsequent entries in section.  */
-} Elf32_gptab;
-
-/* Entry found in sections of type SHT_MIPS_REGINFO.  */
-
-typedef struct
-{
-  Elf32_Word ri_gprmask;		/* General registers used.  */
-  Elf32_Word ri_cprmask[4];		/* Coprocessor registers used.  */
-  Elf32_Sword ri_gp_value;		/* $gp register value.  */
-} Elf32_RegInfo;
-
-/* Entries found in sections of type SHT_MIPS_OPTIONS.  */
-
-typedef struct
-{
-  unsigned char kind;		/* Determines interpretation of the
-				   variable part of descriptor.  */
-  unsigned char size;		/* Size of descriptor, including header.  */
-  Elf32_Section section;	/* Section header index of section affected,
-				   0 for global options.  */
-  Elf32_Word info;		/* Kind-specific information.  */
-} Elf_Options;
-
-/* Values for `kind' field in Elf_Options.  */
-
-#define ODK_NULL	0	/* Undefined.  */
-#define ODK_REGINFO	1	/* Register usage information.  */
-#define ODK_EXCEPTIONS	2	/* Exception processing options.  */
-#define ODK_PAD		3	/* Section padding options.  */
-#define ODK_HWPATCH	4	/* Hardware workarounds performed */
-#define ODK_FILL	5	/* record the fill value used by the linker. */
-#define ODK_TAGS	6	/* reserve space for desktop tools to write. */
-#define ODK_HWAND	7	/* HW workarounds.  'AND' bits when merging. */
-#define ODK_HWOR	8	/* HW workarounds.  'OR' bits when merging.  */
-
-/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries.  */
-
-#define OEX_FPU_MIN	0x1f	/* FPE's which MUST be enabled.  */
-#define OEX_FPU_MAX	0x1f00	/* FPE's which MAY be enabled.  */
-#define OEX_PAGE0	0x10000	/* page zero must be mapped.  */
-#define OEX_SMM		0x20000	/* Force sequential memory mode?  */
-#define OEX_FPDBUG	0x40000	/* Force floating point debug mode?  */
-#define OEX_PRECISEFP	OEX_FPDBUG
-#define OEX_DISMISS	0x80000	/* Dismiss invalid address faults?  */
-
-#define OEX_FPU_INVAL	0x10
-#define OEX_FPU_DIV0	0x08
-#define OEX_FPU_OFLO	0x04
-#define OEX_FPU_UFLO	0x02
-#define OEX_FPU_INEX	0x01
-
-/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry.  */
-
-#define OHW_R4KEOP	0x1	/* R4000 end-of-page patch.  */
-#define OHW_R8KPFETCH	0x2	/* may need R8000 prefetch patch.  */
-#define OHW_R5KEOP	0x4	/* R5000 end-of-page patch.  */
-#define OHW_R5KCVTL	0x8	/* R5000 cvt.[ds].l bug.  clean=1.  */
-
-#define OPAD_PREFIX	0x1
-#define OPAD_POSTFIX	0x2
-#define OPAD_SYMBOL	0x4
-
-/* Entry found in `.options' section.  */
-
-typedef struct
-{
-  Elf32_Word hwp_flags1;	/* Extra flags.  */
-  Elf32_Word hwp_flags2;	/* Extra flags.  */
-} Elf_Options_Hw;
-
-/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries.  */
-
-#define OHWA0_R4KEOP_CHECKED	0x00000001
-#define OHWA1_R4KEOP_CLEAN	0x00000002
-
-/* MIPS relocs.  */
-
-#define R_MIPS_NONE		0	/* No reloc */
-#define R_MIPS_16		1	/* Direct 16 bit */
-#define R_MIPS_32		2	/* Direct 32 bit */
-#define R_MIPS_REL32		3	/* PC relative 32 bit */
-#define R_MIPS_26		4	/* Direct 26 bit shifted */
-#define R_MIPS_HI16		5	/* High 16 bit */
-#define R_MIPS_LO16		6	/* Low 16 bit */
-#define R_MIPS_GPREL16		7	/* GP relative 16 bit */
-#define R_MIPS_LITERAL		8	/* 16 bit literal entry */
-#define R_MIPS_GOT16		9	/* 16 bit GOT entry */
-#define R_MIPS_PC16		10	/* PC relative 16 bit */
-#define R_MIPS_CALL16		11	/* 16 bit GOT entry for function */
-#define R_MIPS_GPREL32		12	/* GP relative 32 bit */
-
-#define R_MIPS_SHIFT5		16
-#define R_MIPS_SHIFT6		17
-#define R_MIPS_64		18
-#define R_MIPS_GOT_DISP		19
-#define R_MIPS_GOT_PAGE		20
-#define R_MIPS_GOT_OFST		21
-#define R_MIPS_GOT_HI16		22
-#define R_MIPS_GOT_LO16		23
-#define R_MIPS_SUB		24
-#define R_MIPS_INSERT_A		25
-#define R_MIPS_INSERT_B		26
-#define R_MIPS_DELETE		27
-#define R_MIPS_HIGHER		28
-#define R_MIPS_HIGHEST		29
-#define R_MIPS_CALL_HI16	30
-#define R_MIPS_CALL_LO16	31
-#define R_MIPS_SCN_DISP		32
-#define R_MIPS_REL16		33
-#define R_MIPS_ADD_IMMEDIATE	34
-#define R_MIPS_PJUMP		35
-#define R_MIPS_RELGOT		36
-#define R_MIPS_JALR		37
-#define R_MIPS_TLS_DTPMOD32	38	/* Module number 32 bit */
-#define R_MIPS_TLS_DTPREL32	39	/* Module-relative offset 32 bit */
-#define R_MIPS_TLS_DTPMOD64	40	/* Module number 64 bit */
-#define R_MIPS_TLS_DTPREL64	41	/* Module-relative offset 64 bit */
-#define R_MIPS_TLS_GD		42	/* 16 bit GOT offset for GD */
-#define R_MIPS_TLS_LDM		43	/* 16 bit GOT offset for LDM */
-#define R_MIPS_TLS_DTPREL_HI16	44	/* Module-relative offset, high 16 bits */
-#define R_MIPS_TLS_DTPREL_LO16	45	/* Module-relative offset, low 16 bits */
-#define R_MIPS_TLS_GOTTPREL	46	/* 16 bit GOT offset for IE */
-#define R_MIPS_TLS_TPREL32	47	/* TP-relative offset, 32 bit */
-#define R_MIPS_TLS_TPREL64	48	/* TP-relative offset, 64 bit */
-#define R_MIPS_TLS_TPREL_HI16	49	/* TP-relative offset, high 16 bits */
-#define R_MIPS_TLS_TPREL_LO16	50	/* TP-relative offset, low 16 bits */
-#define R_MIPS_GLOB_DAT		51
-#define R_MIPS_COPY		126
-#define R_MIPS_JUMP_SLOT        127
-/* Keep this the last entry.  */
-#define R_MIPS_NUM		128
-
-/* Legal values for p_type field of Elf32_Phdr.  */
-
-#define PT_MIPS_REGINFO	  0x70000000	/* Register usage information. */
-#define PT_MIPS_RTPROC	  0x70000001	/* Runtime procedure table. */
-#define PT_MIPS_OPTIONS	  0x70000002
-#define PT_MIPS_ABIFLAGS  0x70000003	/* FP mode requirement. */
-
-/* Special program header types.  */
-
-#define PF_MIPS_LOCAL	0x10000000
-
-/* Legal values for d_tag field of Elf32_Dyn.  */
-
-#define DT_MIPS_RLD_VERSION  0x70000001	/* Runtime linker interface version */
-#define DT_MIPS_TIME_STAMP   0x70000002	/* Timestamp */
-#define DT_MIPS_ICHECKSUM    0x70000003	/* Checksum */
-#define DT_MIPS_IVERSION     0x70000004	/* Version string (string tbl index) */
-#define DT_MIPS_FLAGS	     0x70000005	/* Flags */
-#define DT_MIPS_BASE_ADDRESS 0x70000006	/* Base address */
-#define DT_MIPS_MSYM	     0x70000007
-#define DT_MIPS_CONFLICT     0x70000008	/* Address of CONFLICT section */
-#define DT_MIPS_LIBLIST	     0x70000009	/* Address of LIBLIST section */
-#define DT_MIPS_LOCAL_GOTNO  0x7000000a	/* Number of local GOT entries */
-#define DT_MIPS_CONFLICTNO   0x7000000b	/* Number of CONFLICT entries */
-#define DT_MIPS_LIBLISTNO    0x70000010	/* Number of LIBLIST entries */
-#define DT_MIPS_SYMTABNO     0x70000011	/* Number of DYNSYM entries */
-#define DT_MIPS_UNREFEXTNO   0x70000012	/* First external DYNSYM */
-#define DT_MIPS_GOTSYM	     0x70000013	/* First GOT entry in DYNSYM */
-#define DT_MIPS_HIPAGENO     0x70000014	/* Number of GOT page table entries */
-#define DT_MIPS_RLD_MAP	     0x70000016	/* Address of run time loader map.  */
-#define DT_MIPS_DELTA_CLASS  0x70000017	/* Delta C++ class definition.  */
-#define DT_MIPS_DELTA_CLASS_NO    0x70000018 /* Number of entries in
-						DT_MIPS_DELTA_CLASS.  */
-#define DT_MIPS_DELTA_INSTANCE    0x70000019 /* Delta C++ class instances.  */
-#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in
-						DT_MIPS_DELTA_INSTANCE.  */
-#define DT_MIPS_DELTA_RELOC  0x7000001b /* Delta relocations.  */
-#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in
-					     DT_MIPS_DELTA_RELOC.  */
-#define DT_MIPS_DELTA_SYM    0x7000001d /* Delta symbols that Delta
-					   relocations refer to.  */
-#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in
-					   DT_MIPS_DELTA_SYM.  */
-#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the
-					     class declaration.  */
-#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in
-						DT_MIPS_DELTA_CLASSSYM.  */
-#define DT_MIPS_CXX_FLAGS    0x70000022 /* Flags indicating for C++ flavor.  */
-#define DT_MIPS_PIXIE_INIT   0x70000023
-#define DT_MIPS_SYMBOL_LIB   0x70000024
-#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
-#define DT_MIPS_LOCAL_GOTIDX 0x70000026
-#define DT_MIPS_HIDDEN_GOTIDX 0x70000027
-#define DT_MIPS_PROTECTED_GOTIDX 0x70000028
-#define DT_MIPS_OPTIONS	     0x70000029 /* Address of .options.  */
-#define DT_MIPS_INTERFACE    0x7000002a /* Address of .interface.  */
-#define DT_MIPS_DYNSTR_ALIGN 0x7000002b
-#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */
-#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve
-						    function stored in GOT.  */
-#define DT_MIPS_PERF_SUFFIX  0x7000002e /* Default suffix of dso to be added
-					   by rld on dlopen() calls.  */
-#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
-#define DT_MIPS_GP_VALUE     0x70000030 /* GP value for aux GOTs.  */
-#define DT_MIPS_AUX_DYNAMIC  0x70000031 /* Address of aux .dynamic.  */
-/* The address of .got.plt in an executable using the new non-PIC ABI.  */
-#define DT_MIPS_PLTGOT	     0x70000032
-/* The base of the PLT in an executable using the new non-PIC ABI if that
-   PLT is writable.  For a non-writable PLT, this is omitted or has a zero
-   value.  */
-#define DT_MIPS_RWPLT        0x70000034
-/* An alternative description of the classic MIPS RLD_MAP that is usable
-   in a PIE as it stores a relative offset from the address of the tag
-   rather than an absolute address.  */
-#define DT_MIPS_RLD_MAP_REL  0x70000035
-#define DT_MIPS_NUM	     0x36
-
-/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry.  */
-
-#define RHF_NONE		   0		/* No flags */
-#define RHF_QUICKSTART		   (1 << 0)	/* Use quickstart */
-#define RHF_NOTPOT		   (1 << 1)	/* Hash size not power of 2 */
-#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2)	/* Ignore LD_LIBRARY_PATH */
-#define RHF_NO_MOVE		   (1 << 3)
-#define RHF_SGI_ONLY		   (1 << 4)
-#define RHF_GUARANTEE_INIT	   (1 << 5)
-#define RHF_DELTA_C_PLUS_PLUS	   (1 << 6)
-#define RHF_GUARANTEE_START_INIT   (1 << 7)
-#define RHF_PIXIE		   (1 << 8)
-#define RHF_DEFAULT_DELAY_LOAD	   (1 << 9)
-#define RHF_REQUICKSTART	   (1 << 10)
-#define RHF_REQUICKSTARTED	   (1 << 11)
-#define RHF_CORD		   (1 << 12)
-#define RHF_NO_UNRES_UNDEF	   (1 << 13)
-#define RHF_RLD_ORDER_SAFE	   (1 << 14)
-
-/* Entries found in sections of type SHT_MIPS_LIBLIST.  */
-
-typedef struct
-{
-  Elf32_Word l_name;		/* Name (string table index) */
-  Elf32_Word l_time_stamp;	/* Timestamp */
-  Elf32_Word l_checksum;	/* Checksum */
-  Elf32_Word l_version;		/* Interface version */
-  Elf32_Word l_flags;		/* Flags */
-} Elf32_Lib;
-
-typedef struct
-{
-  Elf64_Word l_name;		/* Name (string table index) */
-  Elf64_Word l_time_stamp;	/* Timestamp */
-  Elf64_Word l_checksum;	/* Checksum */
-  Elf64_Word l_version;		/* Interface version */
-  Elf64_Word l_flags;		/* Flags */
-} Elf64_Lib;
-
-
-/* Legal values for l_flags.  */
-
-#define LL_NONE		  0
-#define LL_EXACT_MATCH	  (1 << 0)	/* Require exact match */
-#define LL_IGNORE_INT_VER (1 << 1)	/* Ignore interface version */
-#define LL_REQUIRE_MINOR  (1 << 2)
-#define LL_EXPORTS	  (1 << 3)
-#define LL_DELAY_LOAD	  (1 << 4)
-#define LL_DELTA	  (1 << 5)
-
-/* Entries found in sections of type SHT_MIPS_CONFLICT.  */
-
-typedef Elf32_Addr Elf32_Conflict;
-
-typedef struct
-{
-  /* Version of flags structure.  */
-  Elf32_Half version;
-  /* The level of the ISA: 1-5, 32, 64.  */
-  unsigned char isa_level;
-  /* The revision of ISA: 0 for MIPS V and below, 1-n otherwise.  */
-  unsigned char isa_rev;
-  /* The size of general purpose registers.  */
-  unsigned char gpr_size;
-  /* The size of co-processor 1 registers.  */
-  unsigned char cpr1_size;
-  /* The size of co-processor 2 registers.  */
-  unsigned char cpr2_size;
-  /* The floating-point ABI.  */
-  unsigned char fp_abi;
-  /* Processor-specific extension.  */
-  Elf32_Word isa_ext;
-  /* Mask of ASEs used.  */
-  Elf32_Word ases;
-  /* Mask of general flags.  */
-  Elf32_Word flags1;
-  Elf32_Word flags2;
-} Elf_MIPS_ABIFlags_v0;
-
-/* Values for the register size bytes of an abi flags structure.  */
-
-#define MIPS_AFL_REG_NONE	0x00	 /* No registers.  */
-#define MIPS_AFL_REG_32		0x01	 /* 32-bit registers.  */
-#define MIPS_AFL_REG_64		0x02	 /* 64-bit registers.  */
-#define MIPS_AFL_REG_128	0x03	 /* 128-bit registers.  */
-
-/* Masks for the ases word of an ABI flags structure.  */
-
-#define MIPS_AFL_ASE_DSP	0x00000001 /* DSP ASE.  */
-#define MIPS_AFL_ASE_DSPR2	0x00000002 /* DSP R2 ASE.  */
-#define MIPS_AFL_ASE_EVA	0x00000004 /* Enhanced VA Scheme.  */
-#define MIPS_AFL_ASE_MCU	0x00000008 /* MCU (MicroController) ASE.  */
-#define MIPS_AFL_ASE_MDMX	0x00000010 /* MDMX ASE.  */
-#define MIPS_AFL_ASE_MIPS3D	0x00000020 /* MIPS-3D ASE.  */
-#define MIPS_AFL_ASE_MT		0x00000040 /* MT ASE.  */
-#define MIPS_AFL_ASE_SMARTMIPS	0x00000080 /* SmartMIPS ASE.  */
-#define MIPS_AFL_ASE_VIRT	0x00000100 /* VZ ASE.  */
-#define MIPS_AFL_ASE_MSA	0x00000200 /* MSA ASE.  */
-#define MIPS_AFL_ASE_MIPS16	0x00000400 /* MIPS16 ASE.  */
-#define MIPS_AFL_ASE_MICROMIPS	0x00000800 /* MICROMIPS ASE.  */
-#define MIPS_AFL_ASE_XPA	0x00001000 /* XPA ASE.  */
-#define MIPS_AFL_ASE_MASK	0x00001fff /* All ASEs.  */
-
-/* Values for the isa_ext word of an ABI flags structure.  */
-
-#define MIPS_AFL_EXT_XLR	  1   /* RMI Xlr instruction.  */
-#define MIPS_AFL_EXT_OCTEON2	  2   /* Cavium Networks Octeon2.  */
-#define MIPS_AFL_EXT_OCTEONP	  3   /* Cavium Networks OcteonP.  */
-#define MIPS_AFL_EXT_LOONGSON_3A  4   /* Loongson 3A.  */
-#define MIPS_AFL_EXT_OCTEON	  5   /* Cavium Networks Octeon.  */
-#define MIPS_AFL_EXT_5900	  6   /* MIPS R5900 instruction.  */
-#define MIPS_AFL_EXT_4650	  7   /* MIPS R4650 instruction.  */
-#define MIPS_AFL_EXT_4010	  8   /* LSI R4010 instruction.  */
-#define MIPS_AFL_EXT_4100	  9   /* NEC VR4100 instruction.  */
-#define MIPS_AFL_EXT_3900	  10  /* Toshiba R3900 instruction.  */
-#define MIPS_AFL_EXT_10000	  11  /* MIPS R10000 instruction.  */
-#define MIPS_AFL_EXT_SB1	  12  /* Broadcom SB-1 instruction.  */
-#define MIPS_AFL_EXT_4111	  13  /* NEC VR4111/VR4181 instruction.  */
-#define MIPS_AFL_EXT_4120	  14  /* NEC VR4120 instruction.  */
-#define MIPS_AFL_EXT_5400	  15  /* NEC VR5400 instruction.  */
-#define MIPS_AFL_EXT_5500	  16  /* NEC VR5500 instruction.  */
-#define MIPS_AFL_EXT_LOONGSON_2E  17  /* ST Microelectronics Loongson 2E.  */
-#define MIPS_AFL_EXT_LOONGSON_2F  18  /* ST Microelectronics Loongson 2F.  */
-
-/* Masks for the flags1 word of an ABI flags structure.  */
-#define MIPS_AFL_FLAGS1_ODDSPREG  1  /* Uses odd single-precision registers.  */
-
-/* Object attribute values.  */
-enum
-{
-  /* Not tagged or not using any ABIs affected by the differences.  */
-  Val_GNU_MIPS_ABI_FP_ANY = 0,
-  /* Using hard-float -mdouble-float.  */
-  Val_GNU_MIPS_ABI_FP_DOUBLE = 1,
-  /* Using hard-float -msingle-float.  */
-  Val_GNU_MIPS_ABI_FP_SINGLE = 2,
-  /* Using soft-float.  */
-  Val_GNU_MIPS_ABI_FP_SOFT = 3,
-  /* Using -mips32r2 -mfp64.  */
-  Val_GNU_MIPS_ABI_FP_OLD_64 = 4,
-  /* Using -mfpxx.  */
-  Val_GNU_MIPS_ABI_FP_XX = 5,
-  /* Using -mips32r2 -mfp64.  */
-  Val_GNU_MIPS_ABI_FP_64 = 6,
-  /* Using -mips32r2 -mfp64 -mno-odd-spreg.  */
-  Val_GNU_MIPS_ABI_FP_64A = 7,
-  /* Maximum allocated FP ABI value.  */
-  Val_GNU_MIPS_ABI_FP_MAX = 7
-};
-
-/* HPPA specific definitions.  */
-
-/* Legal values for e_flags field of Elf32_Ehdr.  */
-
-#define EF_PARISC_TRAPNIL	0x00010000 /* Trap nil pointer dereference.  */
-#define EF_PARISC_EXT		0x00020000 /* Program uses arch. extensions. */
-#define EF_PARISC_LSB		0x00040000 /* Program expects little endian. */
-#define EF_PARISC_WIDE		0x00080000 /* Program expects wide mode.  */
-#define EF_PARISC_NO_KABP	0x00100000 /* No kernel assisted branch
-					      prediction.  */
-#define EF_PARISC_LAZYSWAP	0x00400000 /* Allow lazy swapping.  */
-#define EF_PARISC_ARCH		0x0000ffff /* Architecture version.  */
-
-/* Defined values for `e_flags & EF_PARISC_ARCH' are:  */
-
-#define EFA_PARISC_1_0		    0x020b /* PA-RISC 1.0 big-endian.  */
-#define EFA_PARISC_1_1		    0x0210 /* PA-RISC 1.1 big-endian.  */
-#define EFA_PARISC_2_0		    0x0214 /* PA-RISC 2.0 big-endian.  */
-
-/* Additional section indeces.  */
-
-#define SHN_PARISC_ANSI_COMMON	0xff00	   /* Section for tenatively declared
-					      symbols in ANSI C.  */
-#define SHN_PARISC_HUGE_COMMON	0xff01	   /* Common blocks in huge model.  */
-
-/* Legal values for sh_type field of Elf32_Shdr.  */
-
-#define SHT_PARISC_EXT		0x70000000 /* Contains product specific ext. */
-#define SHT_PARISC_UNWIND	0x70000001 /* Unwind information.  */
-#define SHT_PARISC_DOC		0x70000002 /* Debug info for optimized code. */
-
-/* Legal values for sh_flags field of Elf32_Shdr.  */
-
-#define SHF_PARISC_SHORT	0x20000000 /* Section with short addressing. */
-#define SHF_PARISC_HUGE		0x40000000 /* Section far from gp.  */
-#define SHF_PARISC_SBP		0x80000000 /* Static branch prediction code. */
-
-/* Legal values for ST_TYPE subfield of st_info (symbol type).  */
-
-#define STT_PARISC_MILLICODE	13	/* Millicode function entry point.  */
-
-#define STT_HP_OPAQUE		(STT_LOOS + 0x1)
-#define STT_HP_STUB		(STT_LOOS + 0x2)
-
-/* HPPA relocs.  */
-
-#define R_PARISC_NONE		0	/* No reloc.  */
-#define R_PARISC_DIR32		1	/* Direct 32-bit reference.  */
-#define R_PARISC_DIR21L		2	/* Left 21 bits of eff. address.  */
-#define R_PARISC_DIR17R		3	/* Right 17 bits of eff. address.  */
-#define R_PARISC_DIR17F		4	/* 17 bits of eff. address.  */
-#define R_PARISC_DIR14R		6	/* Right 14 bits of eff. address.  */
-#define R_PARISC_PCREL32	9	/* 32-bit rel. address.  */
-#define R_PARISC_PCREL21L	10	/* Left 21 bits of rel. address.  */
-#define R_PARISC_PCREL17R	11	/* Right 17 bits of rel. address.  */
-#define R_PARISC_PCREL17F	12	/* 17 bits of rel. address.  */
-#define R_PARISC_PCREL14R	14	/* Right 14 bits of rel. address.  */
-#define R_PARISC_DPREL21L	18	/* Left 21 bits of rel. address.  */
-#define R_PARISC_DPREL14R	22	/* Right 14 bits of rel. address.  */
-#define R_PARISC_GPREL21L	26	/* GP-relative, left 21 bits.  */
-#define R_PARISC_GPREL14R	30	/* GP-relative, right 14 bits.  */
-#define R_PARISC_LTOFF21L	34	/* LT-relative, left 21 bits.  */
-#define R_PARISC_LTOFF14R	38	/* LT-relative, right 14 bits.  */
-#define R_PARISC_SECREL32	41	/* 32 bits section rel. address.  */
-#define R_PARISC_SEGBASE	48	/* No relocation, set segment base.  */
-#define R_PARISC_SEGREL32	49	/* 32 bits segment rel. address.  */
-#define R_PARISC_PLTOFF21L	50	/* PLT rel. address, left 21 bits.  */
-#define R_PARISC_PLTOFF14R	54	/* PLT rel. address, right 14 bits.  */
-#define R_PARISC_LTOFF_FPTR32	57	/* 32 bits LT-rel. function pointer. */
-#define R_PARISC_LTOFF_FPTR21L	58	/* LT-rel. fct ptr, left 21 bits. */
-#define R_PARISC_LTOFF_FPTR14R	62	/* LT-rel. fct ptr, right 14 bits. */
-#define R_PARISC_FPTR64		64	/* 64 bits function address.  */
-#define R_PARISC_PLABEL32	65	/* 32 bits function address.  */
-#define R_PARISC_PLABEL21L	66	/* Left 21 bits of fdesc address.  */
-#define R_PARISC_PLABEL14R	70	/* Right 14 bits of fdesc address.  */
-#define R_PARISC_PCREL64	72	/* 64 bits PC-rel. address.  */
-#define R_PARISC_PCREL22F	74	/* 22 bits PC-rel. address.  */
-#define R_PARISC_PCREL14WR	75	/* PC-rel. address, right 14 bits.  */
-#define R_PARISC_PCREL14DR	76	/* PC rel. address, right 14 bits.  */
-#define R_PARISC_PCREL16F	77	/* 16 bits PC-rel. address.  */
-#define R_PARISC_PCREL16WF	78	/* 16 bits PC-rel. address.  */
-#define R_PARISC_PCREL16DF	79	/* 16 bits PC-rel. address.  */
-#define R_PARISC_DIR64		80	/* 64 bits of eff. address.  */
-#define R_PARISC_DIR14WR	83	/* 14 bits of eff. address.  */
-#define R_PARISC_DIR14DR	84	/* 14 bits of eff. address.  */
-#define R_PARISC_DIR16F		85	/* 16 bits of eff. address.  */
-#define R_PARISC_DIR16WF	86	/* 16 bits of eff. address.  */
-#define R_PARISC_DIR16DF	87	/* 16 bits of eff. address.  */
-#define R_PARISC_GPREL64	88	/* 64 bits of GP-rel. address.  */
-#define R_PARISC_GPREL14WR	91	/* GP-rel. address, right 14 bits.  */
-#define R_PARISC_GPREL14DR	92	/* GP-rel. address, right 14 bits.  */
-#define R_PARISC_GPREL16F	93	/* 16 bits GP-rel. address.  */
-#define R_PARISC_GPREL16WF	94	/* 16 bits GP-rel. address.  */
-#define R_PARISC_GPREL16DF	95	/* 16 bits GP-rel. address.  */
-#define R_PARISC_LTOFF64	96	/* 64 bits LT-rel. address.  */
-#define R_PARISC_LTOFF14WR	99	/* LT-rel. address, right 14 bits.  */
-#define R_PARISC_LTOFF14DR	100	/* LT-rel. address, right 14 bits.  */
-#define R_PARISC_LTOFF16F	101	/* 16 bits LT-rel. address.  */
-#define R_PARISC_LTOFF16WF	102	/* 16 bits LT-rel. address.  */
-#define R_PARISC_LTOFF16DF	103	/* 16 bits LT-rel. address.  */
-#define R_PARISC_SECREL64	104	/* 64 bits section rel. address.  */
-#define R_PARISC_SEGREL64	112	/* 64 bits segment rel. address.  */
-#define R_PARISC_PLTOFF14WR	115	/* PLT-rel. address, right 14 bits.  */
-#define R_PARISC_PLTOFF14DR	116	/* PLT-rel. address, right 14 bits.  */
-#define R_PARISC_PLTOFF16F	117	/* 16 bits LT-rel. address.  */
-#define R_PARISC_PLTOFF16WF	118	/* 16 bits PLT-rel. address.  */
-#define R_PARISC_PLTOFF16DF	119	/* 16 bits PLT-rel. address.  */
-#define R_PARISC_LTOFF_FPTR64	120	/* 64 bits LT-rel. function ptr.  */
-#define R_PARISC_LTOFF_FPTR14WR	123	/* LT-rel. fct. ptr., right 14 bits. */
-#define R_PARISC_LTOFF_FPTR14DR	124	/* LT-rel. fct. ptr., right 14 bits. */
-#define R_PARISC_LTOFF_FPTR16F	125	/* 16 bits LT-rel. function ptr.  */
-#define R_PARISC_LTOFF_FPTR16WF	126	/* 16 bits LT-rel. function ptr.  */
-#define R_PARISC_LTOFF_FPTR16DF	127	/* 16 bits LT-rel. function ptr.  */
-#define R_PARISC_LORESERVE	128
-#define R_PARISC_COPY		128	/* Copy relocation.  */
-#define R_PARISC_IPLT		129	/* Dynamic reloc, imported PLT */
-#define R_PARISC_EPLT		130	/* Dynamic reloc, exported PLT */
-#define R_PARISC_TPREL32	153	/* 32 bits TP-rel. address.  */
-#define R_PARISC_TPREL21L	154	/* TP-rel. address, left 21 bits.  */
-#define R_PARISC_TPREL14R	158	/* TP-rel. address, right 14 bits.  */
-#define R_PARISC_LTOFF_TP21L	162	/* LT-TP-rel. address, left 21 bits. */
-#define R_PARISC_LTOFF_TP14R	166	/* LT-TP-rel. address, right 14 bits.*/
-#define R_PARISC_LTOFF_TP14F	167	/* 14 bits LT-TP-rel. address.  */
-#define R_PARISC_TPREL64	216	/* 64 bits TP-rel. address.  */
-#define R_PARISC_TPREL14WR	219	/* TP-rel. address, right 14 bits.  */
-#define R_PARISC_TPREL14DR	220	/* TP-rel. address, right 14 bits.  */
-#define R_PARISC_TPREL16F	221	/* 16 bits TP-rel. address.  */
-#define R_PARISC_TPREL16WF	222	/* 16 bits TP-rel. address.  */
-#define R_PARISC_TPREL16DF	223	/* 16 bits TP-rel. address.  */
-#define R_PARISC_LTOFF_TP64	224	/* 64 bits LT-TP-rel. address.  */
-#define R_PARISC_LTOFF_TP14WR	227	/* LT-TP-rel. address, right 14 bits.*/
-#define R_PARISC_LTOFF_TP14DR	228	/* LT-TP-rel. address, right 14 bits.*/
-#define R_PARISC_LTOFF_TP16F	229	/* 16 bits LT-TP-rel. address.  */
-#define R_PARISC_LTOFF_TP16WF	230	/* 16 bits LT-TP-rel. address.  */
-#define R_PARISC_LTOFF_TP16DF	231	/* 16 bits LT-TP-rel. address.  */
-#define R_PARISC_GNU_VTENTRY	232
-#define R_PARISC_GNU_VTINHERIT	233
-#define R_PARISC_TLS_GD21L	234	/* GD 21-bit left.  */
-#define R_PARISC_TLS_GD14R	235	/* GD 14-bit right.  */
-#define R_PARISC_TLS_GDCALL	236	/* GD call to __t_g_a.  */
-#define R_PARISC_TLS_LDM21L	237	/* LD module 21-bit left.  */
-#define R_PARISC_TLS_LDM14R	238	/* LD module 14-bit right.  */
-#define R_PARISC_TLS_LDMCALL	239	/* LD module call to __t_g_a.  */
-#define R_PARISC_TLS_LDO21L	240	/* LD offset 21-bit left.  */
-#define R_PARISC_TLS_LDO14R	241	/* LD offset 14-bit right.  */
-#define R_PARISC_TLS_DTPMOD32	242	/* DTP module 32-bit.  */
-#define R_PARISC_TLS_DTPMOD64	243	/* DTP module 64-bit.  */
-#define R_PARISC_TLS_DTPOFF32	244	/* DTP offset 32-bit.  */
-#define R_PARISC_TLS_DTPOFF64	245	/* DTP offset 32-bit.  */
-#define R_PARISC_TLS_LE21L	R_PARISC_TPREL21L
-#define R_PARISC_TLS_LE14R	R_PARISC_TPREL14R
-#define R_PARISC_TLS_IE21L	R_PARISC_LTOFF_TP21L
-#define R_PARISC_TLS_IE14R	R_PARISC_LTOFF_TP14R
-#define R_PARISC_TLS_TPREL32	R_PARISC_TPREL32
-#define R_PARISC_TLS_TPREL64	R_PARISC_TPREL64
-#define R_PARISC_HIRESERVE	255
-
-/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr.  */
-
-#define PT_HP_TLS		(PT_LOOS + 0x0)
-#define PT_HP_CORE_NONE		(PT_LOOS + 0x1)
-#define PT_HP_CORE_VERSION	(PT_LOOS + 0x2)
-#define PT_HP_CORE_KERNEL	(PT_LOOS + 0x3)
-#define PT_HP_CORE_COMM		(PT_LOOS + 0x4)
-#define PT_HP_CORE_PROC		(PT_LOOS + 0x5)
-#define PT_HP_CORE_LOADABLE	(PT_LOOS + 0x6)
-#define PT_HP_CORE_STACK	(PT_LOOS + 0x7)
-#define PT_HP_CORE_SHM		(PT_LOOS + 0x8)
-#define PT_HP_CORE_MMF		(PT_LOOS + 0x9)
-#define PT_HP_PARALLEL		(PT_LOOS + 0x10)
-#define PT_HP_FASTBIND		(PT_LOOS + 0x11)
-#define PT_HP_OPT_ANNOT		(PT_LOOS + 0x12)
-#define PT_HP_HSL_ANNOT		(PT_LOOS + 0x13)
-#define PT_HP_STACK		(PT_LOOS + 0x14)
-
-#define PT_PARISC_ARCHEXT	0x70000000
-#define PT_PARISC_UNWIND	0x70000001
-
-/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr.  */
-
-#define PF_PARISC_SBP		0x08000000
-
-#define PF_HP_PAGE_SIZE		0x00100000
-#define PF_HP_FAR_SHARED	0x00200000
-#define PF_HP_NEAR_SHARED	0x00400000
-#define PF_HP_CODE		0x01000000
-#define PF_HP_MODIFY		0x02000000
-#define PF_HP_LAZYSWAP		0x04000000
-#define PF_HP_SBP		0x08000000
-
-
-/* Alpha specific definitions.  */
-
-/* Legal values for e_flags field of Elf64_Ehdr.  */
-
-#define EF_ALPHA_32BIT		1	/* All addresses must be < 2GB.  */
-#define EF_ALPHA_CANRELAX	2	/* Relocations for relaxing exist.  */
-
-/* Legal values for sh_type field of Elf64_Shdr.  */
-
-/* These two are primerily concerned with ECOFF debugging info.  */
-#define SHT_ALPHA_DEBUG		0x70000001
-#define SHT_ALPHA_REGINFO	0x70000002
-
-/* Legal values for sh_flags field of Elf64_Shdr.  */
-
-#define SHF_ALPHA_GPREL		0x10000000
-
-/* Legal values for st_other field of Elf64_Sym.  */
-#define STO_ALPHA_NOPV		0x80	/* No PV required.  */
-#define STO_ALPHA_STD_GPLOAD	0x88	/* PV only used for initial ldgp.  */
-
-/* Alpha relocs.  */
-
-#define R_ALPHA_NONE		0	/* No reloc */
-#define R_ALPHA_REFLONG		1	/* Direct 32 bit */
-#define R_ALPHA_REFQUAD		2	/* Direct 64 bit */
-#define R_ALPHA_GPREL32		3	/* GP relative 32 bit */
-#define R_ALPHA_LITERAL		4	/* GP relative 16 bit w/optimization */
-#define R_ALPHA_LITUSE		5	/* Optimization hint for LITERAL */
-#define R_ALPHA_GPDISP		6	/* Add displacement to GP */
-#define R_ALPHA_BRADDR		7	/* PC+4 relative 23 bit shifted */
-#define R_ALPHA_HINT		8	/* PC+4 relative 16 bit shifted */
-#define R_ALPHA_SREL16		9	/* PC relative 16 bit */
-#define R_ALPHA_SREL32		10	/* PC relative 32 bit */
-#define R_ALPHA_SREL64		11	/* PC relative 64 bit */
-#define R_ALPHA_GPRELHIGH	17	/* GP relative 32 bit, high 16 bits */
-#define R_ALPHA_GPRELLOW	18	/* GP relative 32 bit, low 16 bits */
-#define R_ALPHA_GPREL16		19	/* GP relative 16 bit */
-#define R_ALPHA_COPY		24	/* Copy symbol at runtime */
-#define R_ALPHA_GLOB_DAT	25	/* Create GOT entry */
-#define R_ALPHA_JMP_SLOT	26	/* Create PLT entry */
-#define R_ALPHA_RELATIVE	27	/* Adjust by program base */
-#define R_ALPHA_TLS_GD_HI	28
-#define R_ALPHA_TLSGD		29
-#define R_ALPHA_TLS_LDM		30
-#define R_ALPHA_DTPMOD64	31
-#define R_ALPHA_GOTDTPREL	32
-#define R_ALPHA_DTPREL64	33
-#define R_ALPHA_DTPRELHI	34
-#define R_ALPHA_DTPRELLO	35
-#define R_ALPHA_DTPREL16	36
-#define R_ALPHA_GOTTPREL	37
-#define R_ALPHA_TPREL64		38
-#define R_ALPHA_TPRELHI		39
-#define R_ALPHA_TPRELLO		40
-#define R_ALPHA_TPREL16		41
-/* Keep this the last entry.  */
-#define R_ALPHA_NUM		46
-
-/* Magic values of the LITUSE relocation addend.  */
-#define LITUSE_ALPHA_ADDR	0
-#define LITUSE_ALPHA_BASE	1
-#define LITUSE_ALPHA_BYTOFF	2
-#define LITUSE_ALPHA_JSR	3
-#define LITUSE_ALPHA_TLS_GD	4
-#define LITUSE_ALPHA_TLS_LDM	5
-
-/* Legal values for d_tag of Elf64_Dyn.  */
-#define DT_ALPHA_PLTRO		(DT_LOPROC + 0)
-#define DT_ALPHA_NUM		1
-
-/* PowerPC specific declarations */
-
-/* Values for Elf32/64_Ehdr.e_flags.  */
-#define EF_PPC_EMB		0x80000000	/* PowerPC embedded flag */
-
-/* Cygnus local bits below */
-#define EF_PPC_RELOCATABLE	0x00010000	/* PowerPC -mrelocatable flag*/
-#define EF_PPC_RELOCATABLE_LIB	0x00008000	/* PowerPC -mrelocatable-lib
-						   flag */
-
-/* PowerPC relocations defined by the ABIs */
-#define R_PPC_NONE		0
-#define R_PPC_ADDR32		1	/* 32bit absolute address */
-#define R_PPC_ADDR24		2	/* 26bit address, 2 bits ignored.  */
-#define R_PPC_ADDR16		3	/* 16bit absolute address */
-#define R_PPC_ADDR16_LO		4	/* lower 16bit of absolute address */
-#define R_PPC_ADDR16_HI		5	/* high 16bit of absolute address */
-#define R_PPC_ADDR16_HA		6	/* adjusted high 16bit */
-#define R_PPC_ADDR14		7	/* 16bit address, 2 bits ignored */
-#define R_PPC_ADDR14_BRTAKEN	8
-#define R_PPC_ADDR14_BRNTAKEN	9
-#define R_PPC_REL24		10	/* PC relative 26 bit */
-#define R_PPC_REL14		11	/* PC relative 16 bit */
-#define R_PPC_REL14_BRTAKEN	12
-#define R_PPC_REL14_BRNTAKEN	13
-#define R_PPC_GOT16		14
-#define R_PPC_GOT16_LO		15
-#define R_PPC_GOT16_HI		16
-#define R_PPC_GOT16_HA		17
-#define R_PPC_PLTREL24		18
-#define R_PPC_COPY		19
-#define R_PPC_GLOB_DAT		20
-#define R_PPC_JMP_SLOT		21
-#define R_PPC_RELATIVE		22
-#define R_PPC_LOCAL24PC		23
-#define R_PPC_UADDR32		24
-#define R_PPC_UADDR16		25
-#define R_PPC_REL32		26
-#define R_PPC_PLT32		27
-#define R_PPC_PLTREL32		28
-#define R_PPC_PLT16_LO		29
-#define R_PPC_PLT16_HI		30
-#define R_PPC_PLT16_HA		31
-#define R_PPC_SDAREL16		32
-#define R_PPC_SECTOFF		33
-#define R_PPC_SECTOFF_LO	34
-#define R_PPC_SECTOFF_HI	35
-#define R_PPC_SECTOFF_HA	36
-
-/* PowerPC relocations defined for the TLS access ABI.  */
-#define R_PPC_TLS		67 /* none	(sym+add)@tls */
-#define R_PPC_DTPMOD32		68 /* word32	(sym+add)@dtpmod */
-#define R_PPC_TPREL16		69 /* half16*	(sym+add)@tprel */
-#define R_PPC_TPREL16_LO	70 /* half16	(sym+add)@tprel@l */
-#define R_PPC_TPREL16_HI	71 /* half16	(sym+add)@tprel@h */
-#define R_PPC_TPREL16_HA	72 /* half16	(sym+add)@tprel@ha */
-#define R_PPC_TPREL32		73 /* word32	(sym+add)@tprel */
-#define R_PPC_DTPREL16		74 /* half16*	(sym+add)@dtprel */
-#define R_PPC_DTPREL16_LO	75 /* half16	(sym+add)@dtprel@l */
-#define R_PPC_DTPREL16_HI	76 /* half16	(sym+add)@dtprel@h */
-#define R_PPC_DTPREL16_HA	77 /* half16	(sym+add)@dtprel@ha */
-#define R_PPC_DTPREL32		78 /* word32	(sym+add)@dtprel */
-#define R_PPC_GOT_TLSGD16	79 /* half16*	(sym+add)@got@tlsgd */
-#define R_PPC_GOT_TLSGD16_LO	80 /* half16	(sym+add)@got@tlsgd@l */
-#define R_PPC_GOT_TLSGD16_HI	81 /* half16	(sym+add)@got@tlsgd@h */
-#define R_PPC_GOT_TLSGD16_HA	82 /* half16	(sym+add)@got@tlsgd@ha */
-#define R_PPC_GOT_TLSLD16	83 /* half16*	(sym+add)@got@tlsld */
-#define R_PPC_GOT_TLSLD16_LO	84 /* half16	(sym+add)@got@tlsld@l */
-#define R_PPC_GOT_TLSLD16_HI	85 /* half16	(sym+add)@got@tlsld@h */
-#define R_PPC_GOT_TLSLD16_HA	86 /* half16	(sym+add)@got@tlsld@ha */
-#define R_PPC_GOT_TPREL16	87 /* half16*	(sym+add)@got@tprel */
-#define R_PPC_GOT_TPREL16_LO	88 /* half16	(sym+add)@got@tprel@l */
-#define R_PPC_GOT_TPREL16_HI	89 /* half16	(sym+add)@got@tprel@h */
-#define R_PPC_GOT_TPREL16_HA	90 /* half16	(sym+add)@got@tprel@ha */
-#define R_PPC_GOT_DTPREL16	91 /* half16*	(sym+add)@got@dtprel */
-#define R_PPC_GOT_DTPREL16_LO	92 /* half16*	(sym+add)@got@dtprel@l */
-#define R_PPC_GOT_DTPREL16_HI	93 /* half16*	(sym+add)@got@dtprel@h */
-#define R_PPC_GOT_DTPREL16_HA	94 /* half16*	(sym+add)@got@dtprel@ha */
-#define R_PPC_TLSGD		95 /* none	(sym+add)@tlsgd */
-#define R_PPC_TLSLD		96 /* none	(sym+add)@tlsld */
-
-/* The remaining relocs are from the Embedded ELF ABI, and are not
-   in the SVR4 ELF ABI.  */
-#define R_PPC_EMB_NADDR32	101
-#define R_PPC_EMB_NADDR16	102
-#define R_PPC_EMB_NADDR16_LO	103
-#define R_PPC_EMB_NADDR16_HI	104
-#define R_PPC_EMB_NADDR16_HA	105
-#define R_PPC_EMB_SDAI16	106
-#define R_PPC_EMB_SDA2I16	107
-#define R_PPC_EMB_SDA2REL	108
-#define R_PPC_EMB_SDA21		109	/* 16 bit offset in SDA */
-#define R_PPC_EMB_MRKREF	110
-#define R_PPC_EMB_RELSEC16	111
-#define R_PPC_EMB_RELST_LO	112
-#define R_PPC_EMB_RELST_HI	113
-#define R_PPC_EMB_RELST_HA	114
-#define R_PPC_EMB_BIT_FLD	115
-#define R_PPC_EMB_RELSDA	116	/* 16 bit relative offset in SDA */
-
-/* Diab tool relocations.  */
-#define R_PPC_DIAB_SDA21_LO	180	/* like EMB_SDA21, but lower 16 bit */
-#define R_PPC_DIAB_SDA21_HI	181	/* like EMB_SDA21, but high 16 bit */
-#define R_PPC_DIAB_SDA21_HA	182	/* like EMB_SDA21, adjusted high 16 */
-#define R_PPC_DIAB_RELSDA_LO	183	/* like EMB_RELSDA, but lower 16 bit */
-#define R_PPC_DIAB_RELSDA_HI	184	/* like EMB_RELSDA, but high 16 bit */
-#define R_PPC_DIAB_RELSDA_HA	185	/* like EMB_RELSDA, adjusted high 16 */
-
-/* GNU extension to support local ifunc.  */
-#define R_PPC_IRELATIVE		248
-
-/* GNU relocs used in PIC code sequences.  */
-#define R_PPC_REL16		249	/* half16   (sym+add-.) */
-#define R_PPC_REL16_LO		250	/* half16   (sym+add-.)@l */
-#define R_PPC_REL16_HI		251	/* half16   (sym+add-.)@h */
-#define R_PPC_REL16_HA		252	/* half16   (sym+add-.)@ha */
-
-/* This is a phony reloc to handle any old fashioned TOC16 references
-   that may still be in object files.  */
-#define R_PPC_TOC16		255
-
-/* PowerPC specific values for the Dyn d_tag field.  */
-#define DT_PPC_GOT		(DT_LOPROC + 0)
-#define DT_PPC_OPT		(DT_LOPROC + 1)
-#define DT_PPC_NUM		2
-
-/* PowerPC specific values for the DT_PPC_OPT Dyn entry.  */
-#define PPC_OPT_TLS		1
-
-/* PowerPC64 relocations defined by the ABIs */
-#define R_PPC64_NONE		R_PPC_NONE
-#define R_PPC64_ADDR32		R_PPC_ADDR32 /* 32bit absolute address */
-#define R_PPC64_ADDR24		R_PPC_ADDR24 /* 26bit address, word aligned */
-#define R_PPC64_ADDR16		R_PPC_ADDR16 /* 16bit absolute address */
-#define R_PPC64_ADDR16_LO	R_PPC_ADDR16_LO	/* lower 16bits of address */
-#define R_PPC64_ADDR16_HI	R_PPC_ADDR16_HI	/* high 16bits of address. */
-#define R_PPC64_ADDR16_HA	R_PPC_ADDR16_HA /* adjusted high 16bits.  */
-#define R_PPC64_ADDR14		R_PPC_ADDR14 /* 16bit address, word aligned */
-#define R_PPC64_ADDR14_BRTAKEN	R_PPC_ADDR14_BRTAKEN
-#define R_PPC64_ADDR14_BRNTAKEN	R_PPC_ADDR14_BRNTAKEN
-#define R_PPC64_REL24		R_PPC_REL24 /* PC-rel. 26 bit, word aligned */
-#define R_PPC64_REL14		R_PPC_REL14 /* PC relative 16 bit */
-#define R_PPC64_REL14_BRTAKEN	R_PPC_REL14_BRTAKEN
-#define R_PPC64_REL14_BRNTAKEN	R_PPC_REL14_BRNTAKEN
-#define R_PPC64_GOT16		R_PPC_GOT16
-#define R_PPC64_GOT16_LO	R_PPC_GOT16_LO
-#define R_PPC64_GOT16_HI	R_PPC_GOT16_HI
-#define R_PPC64_GOT16_HA	R_PPC_GOT16_HA
-
-#define R_PPC64_COPY		R_PPC_COPY
-#define R_PPC64_GLOB_DAT	R_PPC_GLOB_DAT
-#define R_PPC64_JMP_SLOT	R_PPC_JMP_SLOT
-#define R_PPC64_RELATIVE	R_PPC_RELATIVE
-
-#define R_PPC64_UADDR32		R_PPC_UADDR32
-#define R_PPC64_UADDR16		R_PPC_UADDR16
-#define R_PPC64_REL32		R_PPC_REL32
-#define R_PPC64_PLT32		R_PPC_PLT32
-#define R_PPC64_PLTREL32	R_PPC_PLTREL32
-#define R_PPC64_PLT16_LO	R_PPC_PLT16_LO
-#define R_PPC64_PLT16_HI	R_PPC_PLT16_HI
-#define R_PPC64_PLT16_HA	R_PPC_PLT16_HA
-
-#define R_PPC64_SECTOFF		R_PPC_SECTOFF
-#define R_PPC64_SECTOFF_LO	R_PPC_SECTOFF_LO
-#define R_PPC64_SECTOFF_HI	R_PPC_SECTOFF_HI
-#define R_PPC64_SECTOFF_HA	R_PPC_SECTOFF_HA
-#define R_PPC64_ADDR30		37 /* word30 (S + A - P) >> 2 */
-#define R_PPC64_ADDR64		38 /* doubleword64 S + A */
-#define R_PPC64_ADDR16_HIGHER	39 /* half16 #higher(S + A) */
-#define R_PPC64_ADDR16_HIGHERA	40 /* half16 #highera(S + A) */
-#define R_PPC64_ADDR16_HIGHEST	41 /* half16 #highest(S + A) */
-#define R_PPC64_ADDR16_HIGHESTA	42 /* half16 #highesta(S + A) */
-#define R_PPC64_UADDR64		43 /* doubleword64 S + A */
-#define R_PPC64_REL64		44 /* doubleword64 S + A - P */
-#define R_PPC64_PLT64		45 /* doubleword64 L + A */
-#define R_PPC64_PLTREL64	46 /* doubleword64 L + A - P */
-#define R_PPC64_TOC16		47 /* half16* S + A - .TOC */
-#define R_PPC64_TOC16_LO	48 /* half16 #lo(S + A - .TOC.) */
-#define R_PPC64_TOC16_HI	49 /* half16 #hi(S + A - .TOC.) */
-#define R_PPC64_TOC16_HA	50 /* half16 #ha(S + A - .TOC.) */
-#define R_PPC64_TOC		51 /* doubleword64 .TOC */
-#define R_PPC64_PLTGOT16	52 /* half16* M + A */
-#define R_PPC64_PLTGOT16_LO	53 /* half16 #lo(M + A) */
-#define R_PPC64_PLTGOT16_HI	54 /* half16 #hi(M + A) */
-#define R_PPC64_PLTGOT16_HA	55 /* half16 #ha(M + A) */
-
-#define R_PPC64_ADDR16_DS	56 /* half16ds* (S + A) >> 2 */
-#define R_PPC64_ADDR16_LO_DS	57 /* half16ds  #lo(S + A) >> 2 */
-#define R_PPC64_GOT16_DS	58 /* half16ds* (G + A) >> 2 */
-#define R_PPC64_GOT16_LO_DS	59 /* half16ds  #lo(G + A) >> 2 */
-#define R_PPC64_PLT16_LO_DS	60 /* half16ds  #lo(L + A) >> 2 */
-#define R_PPC64_SECTOFF_DS	61 /* half16ds* (R + A) >> 2 */
-#define R_PPC64_SECTOFF_LO_DS	62 /* half16ds  #lo(R + A) >> 2 */
-#define R_PPC64_TOC16_DS	63 /* half16ds* (S + A - .TOC.) >> 2 */
-#define R_PPC64_TOC16_LO_DS	64 /* half16ds  #lo(S + A - .TOC.) >> 2 */
-#define R_PPC64_PLTGOT16_DS	65 /* half16ds* (M + A) >> 2 */
-#define R_PPC64_PLTGOT16_LO_DS	66 /* half16ds  #lo(M + A) >> 2 */
-
-/* PowerPC64 relocations defined for the TLS access ABI.  */
-#define R_PPC64_TLS		67 /* none	(sym+add)@tls */
-#define R_PPC64_DTPMOD64	68 /* doubleword64 (sym+add)@dtpmod */
-#define R_PPC64_TPREL16		69 /* half16*	(sym+add)@tprel */
-#define R_PPC64_TPREL16_LO	70 /* half16	(sym+add)@tprel@l */
-#define R_PPC64_TPREL16_HI	71 /* half16	(sym+add)@tprel@h */
-#define R_PPC64_TPREL16_HA	72 /* half16	(sym+add)@tprel@ha */
-#define R_PPC64_TPREL64		73 /* doubleword64 (sym+add)@tprel */
-#define R_PPC64_DTPREL16	74 /* half16*	(sym+add)@dtprel */
-#define R_PPC64_DTPREL16_LO	75 /* half16	(sym+add)@dtprel@l */
-#define R_PPC64_DTPREL16_HI	76 /* half16	(sym+add)@dtprel@h */
-#define R_PPC64_DTPREL16_HA	77 /* half16	(sym+add)@dtprel@ha */
-#define R_PPC64_DTPREL64	78 /* doubleword64 (sym+add)@dtprel */
-#define R_PPC64_GOT_TLSGD16	79 /* half16*	(sym+add)@got@tlsgd */
-#define R_PPC64_GOT_TLSGD16_LO	80 /* half16	(sym+add)@got@tlsgd@l */
-#define R_PPC64_GOT_TLSGD16_HI	81 /* half16	(sym+add)@got@tlsgd@h */
-#define R_PPC64_GOT_TLSGD16_HA	82 /* half16	(sym+add)@got@tlsgd@ha */
-#define R_PPC64_GOT_TLSLD16	83 /* half16*	(sym+add)@got@tlsld */
-#define R_PPC64_GOT_TLSLD16_LO	84 /* half16	(sym+add)@got@tlsld@l */
-#define R_PPC64_GOT_TLSLD16_HI	85 /* half16	(sym+add)@got@tlsld@h */
-#define R_PPC64_GOT_TLSLD16_HA	86 /* half16	(sym+add)@got@tlsld@ha */
-#define R_PPC64_GOT_TPREL16_DS	87 /* half16ds*	(sym+add)@got@tprel */
-#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */
-#define R_PPC64_GOT_TPREL16_HI	89 /* half16	(sym+add)@got@tprel@h */
-#define R_PPC64_GOT_TPREL16_HA	90 /* half16	(sym+add)@got@tprel@ha */
-#define R_PPC64_GOT_DTPREL16_DS	91 /* half16ds*	(sym+add)@got@dtprel */
-#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */
-#define R_PPC64_GOT_DTPREL16_HI	93 /* half16	(sym+add)@got@dtprel@h */
-#define R_PPC64_GOT_DTPREL16_HA	94 /* half16	(sym+add)@got@dtprel@ha */
-#define R_PPC64_TPREL16_DS	95 /* half16ds*	(sym+add)@tprel */
-#define R_PPC64_TPREL16_LO_DS	96 /* half16ds	(sym+add)@tprel@l */
-#define R_PPC64_TPREL16_HIGHER	97 /* half16	(sym+add)@tprel@higher */
-#define R_PPC64_TPREL16_HIGHERA	98 /* half16	(sym+add)@tprel@highera */
-#define R_PPC64_TPREL16_HIGHEST	99 /* half16	(sym+add)@tprel@highest */
-#define R_PPC64_TPREL16_HIGHESTA 100 /* half16	(sym+add)@tprel@highesta */
-#define R_PPC64_DTPREL16_DS	101 /* half16ds* (sym+add)@dtprel */
-#define R_PPC64_DTPREL16_LO_DS	102 /* half16ds	(sym+add)@dtprel@l */
-#define R_PPC64_DTPREL16_HIGHER	103 /* half16	(sym+add)@dtprel@higher */
-#define R_PPC64_DTPREL16_HIGHERA 104 /* half16	(sym+add)@dtprel@highera */
-#define R_PPC64_DTPREL16_HIGHEST 105 /* half16	(sym+add)@dtprel@highest */
-#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16	(sym+add)@dtprel@highesta */
-#define R_PPC64_TLSGD		107 /* none	(sym+add)@tlsgd */
-#define R_PPC64_TLSLD		108 /* none	(sym+add)@tlsld */
-#define R_PPC64_TOCSAVE		109 /* none */
-
-/* Added when HA and HI relocs were changed to report overflows.  */
-#define R_PPC64_ADDR16_HIGH	110
-#define R_PPC64_ADDR16_HIGHA	111
-#define R_PPC64_TPREL16_HIGH	112
-#define R_PPC64_TPREL16_HIGHA	113
-#define R_PPC64_DTPREL16_HIGH	114
-#define R_PPC64_DTPREL16_HIGHA	115
-
-/* GNU extension to support local ifunc.  */
-#define R_PPC64_JMP_IREL	247
-#define R_PPC64_IRELATIVE	248
-#define R_PPC64_REL16		249	/* half16   (sym+add-.) */
-#define R_PPC64_REL16_LO	250	/* half16   (sym+add-.)@l */
-#define R_PPC64_REL16_HI	251	/* half16   (sym+add-.)@h */
-#define R_PPC64_REL16_HA	252	/* half16   (sym+add-.)@ha */
-
-/* e_flags bits specifying ABI.
-   1 for original function descriptor using ABI,
-   2 for revised ABI without function descriptors,
-   0 for unspecified or not using any features affected by the differences.  */
-#define EF_PPC64_ABI	3
-
-/* PowerPC64 specific values for the Dyn d_tag field.  */
-#define DT_PPC64_GLINK  (DT_LOPROC + 0)
-#define DT_PPC64_OPD	(DT_LOPROC + 1)
-#define DT_PPC64_OPDSZ	(DT_LOPROC + 2)
-#define DT_PPC64_OPT	(DT_LOPROC + 3)
-#define DT_PPC64_NUM    4
-
-/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry.  */
-#define PPC64_OPT_TLS		1
-#define PPC64_OPT_MULTI_TOC	2
-
-/* PowerPC64 specific values for the Elf64_Sym st_other field.  */
-#define STO_PPC64_LOCAL_BIT	5
-#define STO_PPC64_LOCAL_MASK	(7 << STO_PPC64_LOCAL_BIT)
-#define PPC64_LOCAL_ENTRY_OFFSET(other)				\
- (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2)
-
-
-/* ARM specific declarations */
-
-/* Processor specific flags for the ELF header e_flags field.  */
-#define EF_ARM_RELEXEC		0x01
-#define EF_ARM_HASENTRY		0x02
-#define EF_ARM_INTERWORK	0x04
-#define EF_ARM_APCS_26		0x08
-#define EF_ARM_APCS_FLOAT	0x10
-#define EF_ARM_PIC		0x20
-#define EF_ARM_ALIGN8		0x40 /* 8-bit structure alignment is in use */
-#define EF_ARM_NEW_ABI		0x80
-#define EF_ARM_OLD_ABI		0x100
-#define EF_ARM_SOFT_FLOAT	0x200
-#define EF_ARM_VFP_FLOAT	0x400
-#define EF_ARM_MAVERICK_FLOAT	0x800
-
-#define EF_ARM_ABI_FLOAT_SOFT	0x200   /* NB conflicts with EF_ARM_SOFT_FLOAT */
-#define EF_ARM_ABI_FLOAT_HARD	0x400   /* NB conflicts with EF_ARM_VFP_FLOAT */
-
-
-/* Other constants defined in the ARM ELF spec. version B-01.  */
-/* NB. These conflict with values defined above.  */
-#define EF_ARM_SYMSARESORTED	0x04
-#define EF_ARM_DYNSYMSUSESEGIDX	0x08
-#define EF_ARM_MAPSYMSFIRST	0x10
-#define EF_ARM_EABIMASK		0XFF000000
-
-/* Constants defined in AAELF.  */
-#define EF_ARM_BE8	    0x00800000
-#define EF_ARM_LE8	    0x00400000
-
-#define EF_ARM_EABI_VERSION(flags)	((flags) & EF_ARM_EABIMASK)
-#define EF_ARM_EABI_UNKNOWN	0x00000000
-#define EF_ARM_EABI_VER1	0x01000000
-#define EF_ARM_EABI_VER2	0x02000000
-#define EF_ARM_EABI_VER3	0x03000000
-#define EF_ARM_EABI_VER4	0x04000000
-#define EF_ARM_EABI_VER5	0x05000000
-
-/* Additional symbol types for Thumb.  */
-#define STT_ARM_TFUNC		STT_LOPROC /* A Thumb function.  */
-#define STT_ARM_16BIT		STT_HIPROC /* A Thumb label.  */
-
-/* ARM-specific values for sh_flags */
-#define SHF_ARM_ENTRYSECT	0x10000000 /* Section contains an entry point */
-#define SHF_ARM_COMDEF		0x80000000 /* Section may be multiply defined
-					      in the input to a link step.  */
-
-/* ARM-specific program header flags */
-#define PF_ARM_SB		0x10000000 /* Segment contains the location
-					      addressed by the static base. */
-#define PF_ARM_PI		0x20000000 /* Position-independent segment.  */
-#define PF_ARM_ABS		0x40000000 /* Absolute segment.  */
-
-/* Processor specific values for the Phdr p_type field.  */
-#define PT_ARM_EXIDX		(PT_LOPROC + 1)	/* ARM unwind segment.  */
-
-/* Processor specific values for the Shdr sh_type field.  */
-#define SHT_ARM_EXIDX		(SHT_LOPROC + 1) /* ARM unwind section.  */
-#define SHT_ARM_PREEMPTMAP	(SHT_LOPROC + 2) /* Preemption details.  */
-#define SHT_ARM_ATTRIBUTES	(SHT_LOPROC + 3) /* ARM attributes section.  */
-
-
-/* AArch64 relocs.  */
-
-#define R_AARCH64_NONE            0	/* No relocation.  */
-
-/* ILP32 AArch64 relocs.  */
-#define R_AARCH64_P32_ABS32		  1	/* Direct 32 bit.  */
-#define R_AARCH64_P32_COPY		180	/* Copy symbol at runtime.  */
-#define R_AARCH64_P32_GLOB_DAT		181	/* Create GOT entry.  */
-#define R_AARCH64_P32_JUMP_SLOT		182	/* Create PLT entry.  */
-#define R_AARCH64_P32_RELATIVE		183	/* Adjust by program base.  */
-#define R_AARCH64_P32_TLS_DTPMOD	184	/* Module number, 32 bit.  */
-#define R_AARCH64_P32_TLS_DTPREL	185	/* Module-relative offset, 32 bit.  */
-#define R_AARCH64_P32_TLS_TPREL		186	/* TP-relative offset, 32 bit.  */
-#define R_AARCH64_P32_TLSDESC		187	/* TLS Descriptor.  */
-#define R_AARCH64_P32_IRELATIVE		188	/* STT_GNU_IFUNC relocation. */
-
-/* LP64 AArch64 relocs.  */
-#define R_AARCH64_ABS64         257	/* Direct 64 bit. */
-#define R_AARCH64_ABS32         258	/* Direct 32 bit.  */
-#define R_AARCH64_ABS16		259	/* Direct 16-bit.  */
-#define R_AARCH64_PREL64	260	/* PC-relative 64-bit.	*/
-#define R_AARCH64_PREL32	261	/* PC-relative 32-bit.	*/
-#define R_AARCH64_PREL16	262	/* PC-relative 16-bit.	*/
-#define R_AARCH64_MOVW_UABS_G0	263	/* Dir. MOVZ imm. from bits 15:0.  */
-#define R_AARCH64_MOVW_UABS_G0_NC 264	/* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_UABS_G1	265	/* Dir. MOVZ imm. from bits 31:16.  */
-#define R_AARCH64_MOVW_UABS_G1_NC 266	/* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_UABS_G2	267	/* Dir. MOVZ imm. from bits 47:32.  */
-#define R_AARCH64_MOVW_UABS_G2_NC 268	/* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_UABS_G3	269	/* Dir. MOV{K,Z} imm. from 63:48.  */
-#define R_AARCH64_MOVW_SABS_G0	270	/* Dir. MOV{N,Z} imm. from 15:0.  */
-#define R_AARCH64_MOVW_SABS_G1	271	/* Dir. MOV{N,Z} imm. from 31:16.  */
-#define R_AARCH64_MOVW_SABS_G2	272	/* Dir. MOV{N,Z} imm. from 47:32.  */
-#define R_AARCH64_LD_PREL_LO19	273	/* PC-rel. LD imm. from bits 20:2.  */
-#define R_AARCH64_ADR_PREL_LO21	274	/* PC-rel. ADR imm. from bits 20:0.  */
-#define R_AARCH64_ADR_PREL_PG_HI21 275	/* Page-rel. ADRP imm. from 32:12.  */
-#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Likewise; no overflow check.  */
-#define R_AARCH64_ADD_ABS_LO12_NC 277	/* Dir. ADD imm. from bits 11:0.  */
-#define R_AARCH64_LDST8_ABS_LO12_NC 278	/* Likewise for LD/ST; no check. */
-#define R_AARCH64_TSTBR14	279	/* PC-rel. TBZ/TBNZ imm. from 15:2.  */
-#define R_AARCH64_CONDBR19	280	/* PC-rel. cond. br. imm. from 20:2. */
-#define R_AARCH64_JUMP26	282	/* PC-rel. B imm. from bits 27:2.  */
-#define R_AARCH64_CALL26	283	/* Likewise for CALL.  */
-#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* Dir. ADD imm. from bits 11:1.  */
-#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* Likewise for bits 11:2.  */
-#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* Likewise for bits 11:3.  */
-#define R_AARCH64_MOVW_PREL_G0	287	/* PC-rel. MOV{N,Z} imm. from 15:0.  */
-#define R_AARCH64_MOVW_PREL_G0_NC 288	/* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_PREL_G1	289	/* PC-rel. MOV{N,Z} imm. from 31:16. */
-#define R_AARCH64_MOVW_PREL_G1_NC 290	/* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_PREL_G2	291	/* PC-rel. MOV{N,Z} imm. from 47:32. */
-#define R_AARCH64_MOVW_PREL_G2_NC 292	/* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_PREL_G3	293	/* PC-rel. MOV{N,Z} imm. from 63:48. */
-#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* Dir. ADD imm. from bits 11:4.  */
-#define R_AARCH64_MOVW_GOTOFF_G0 300	/* GOT-rel. off. MOV{N,Z} imm. 15:0. */
-#define R_AARCH64_MOVW_GOTOFF_G0_NC 301	/* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_GOTOFF_G1 302	/* GOT-rel. o. MOV{N,Z} imm. 31:16.  */
-#define R_AARCH64_MOVW_GOTOFF_G1_NC 303	/* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_GOTOFF_G2 304	/* GOT-rel. o. MOV{N,Z} imm. 47:32.  */
-#define R_AARCH64_MOVW_GOTOFF_G2_NC 305	/* Likewise for MOVK; no check.  */
-#define R_AARCH64_MOVW_GOTOFF_G3 306	/* GOT-rel. o. MOV{N,Z} imm. 63:48.  */
-#define R_AARCH64_GOTREL64	307	/* GOT-relative 64-bit.  */
-#define R_AARCH64_GOTREL32	308	/* GOT-relative 32-bit.  */
-#define R_AARCH64_GOT_LD_PREL19	309	/* PC-rel. GOT off. load imm. 20:2.  */
-#define R_AARCH64_LD64_GOTOFF_LO15 310	/* GOT-rel. off. LD/ST imm. 14:3.  */
-#define R_AARCH64_ADR_GOT_PAGE	311	/* P-page-rel. GOT off. ADRP 32:12.  */
-#define R_AARCH64_LD64_GOT_LO12_NC 312	/* Dir. GOT off. LD/ST imm. 11:3.  */
-#define R_AARCH64_LD64_GOTPAGE_LO15 313	/* GOT-page-rel. GOT off. LD/ST 14:3 */
-#define R_AARCH64_TLSGD_ADR_PREL21 512	/* PC-relative ADR imm. 20:0.  */
-#define R_AARCH64_TLSGD_ADR_PAGE21 513	/* page-rel. ADRP imm. 32:12.  */
-#define R_AARCH64_TLSGD_ADD_LO12_NC 514	/* direct ADD imm. from 11:0.  */
-#define R_AARCH64_TLSGD_MOVW_G1	515	/* GOT-rel. MOV{N,Z} 31:16.  */
-#define R_AARCH64_TLSGD_MOVW_G0_NC 516	/* GOT-rel. MOVK imm. 15:0.  */
-#define R_AARCH64_TLSLD_ADR_PREL21 517	/* Like 512; local dynamic model.  */
-#define R_AARCH64_TLSLD_ADR_PAGE21 518	/* Like 513; local dynamic model.  */
-#define R_AARCH64_TLSLD_ADD_LO12_NC 519	/* Like 514; local dynamic model.  */
-#define R_AARCH64_TLSLD_MOVW_G1	520	/* Like 515; local dynamic model.  */
-#define R_AARCH64_TLSLD_MOVW_G0_NC 521	/* Like 516; local dynamic model.  */
-#define R_AARCH64_TLSLD_LD_PREL19 522	/* TLS PC-rel. load imm. 20:2.  */
-#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* TLS DTP-rel. MOV{N,Z} 47:32.  */
-#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* TLS DTP-rel. MOV{N,Z} 31:16.  */
-#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* Likewise; MOVK; no check.  */
-#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* TLS DTP-rel. MOV{N,Z} 15:0.  */
-#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* Likewise; MOVK; no check.  */
-#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTP-rel. ADD imm. from 23:12. */
-#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTP-rel. ADD imm. from 11:0.  */
-#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* Likewise; no ovfl. check.  */
-#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTP-rel. LD/ST imm. 11:0.  */
-#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* Likewise; no check.  */
-#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTP-rel. LD/ST imm. 11:1.  */
-#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* Likewise; no check.  */
-#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTP-rel. LD/ST imm. 11:2.  */
-#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* Likewise; no check.  */
-#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTP-rel. LD/ST imm. 11:3.  */
-#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* Likewise; no check.  */
-#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* GOT-rel. MOV{N,Z} 31:16.  */
-#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* GOT-rel. MOVK 15:0.  */
-#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page-rel. ADRP 32:12.  */
-#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* Direct LD off. 11:3.  */
-#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* PC-rel. load imm. 20:2.  */
-#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TLS TP-rel. MOV{N,Z} 47:32.  */
-#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TLS TP-rel. MOV{N,Z} 31:16.  */
-#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* Likewise; MOVK; no check.  */
-#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TLS TP-rel. MOV{N,Z} 15:0.  */
-#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* Likewise; MOVK; no check.  */
-#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TP-rel. ADD imm. 23:12.  */
-#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TP-rel. ADD imm. 11:0.  */
-#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* Likewise; no ovfl. check.  */
-#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TP-rel. LD/ST off. 11:0.  */
-#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* Likewise; no ovfl. check. */
-#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TP-rel. LD/ST off. 11:1.  */
-#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* Likewise; no check.  */
-#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TP-rel. LD/ST off. 11:2.  */
-#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* Likewise; no check.  */
-#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TP-rel. LD/ST off. 11:3.  */
-#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* Likewise; no check.  */
-#define R_AARCH64_TLSDESC_LD_PREL19 560	/* PC-rel. load immediate 20:2.  */
-#define R_AARCH64_TLSDESC_ADR_PREL21 561 /* PC-rel. ADR immediate 20:0.  */
-#define R_AARCH64_TLSDESC_ADR_PAGE21 562 /* Page-rel. ADRP imm. 32:12.  */
-#define R_AARCH64_TLSDESC_LD64_LO12 563	/* Direct LD off. from 11:3.  */
-#define R_AARCH64_TLSDESC_ADD_LO12 564	/* Direct ADD imm. from 11:0.  */
-#define R_AARCH64_TLSDESC_OFF_G1 565	/* GOT-rel. MOV{N,Z} imm. 31:16.  */
-#define R_AARCH64_TLSDESC_OFF_G0_NC 566	/* GOT-rel. MOVK imm. 15:0; no ck.  */
-#define R_AARCH64_TLSDESC_LDR	567	/* Relax LDR.  */
-#define R_AARCH64_TLSDESC_ADD	568	/* Relax ADD.  */
-#define R_AARCH64_TLSDESC_CALL	569	/* Relax BLR.  */
-#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 /* TP-rel. LD/ST off. 11:4.  */
-#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 /* Likewise; no check.  */
-#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTP-rel. LD/ST imm. 11:4. */
-#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 /* Likewise; no check.  */
-#define R_AARCH64_COPY         1024	/* Copy symbol at runtime.  */
-#define R_AARCH64_GLOB_DAT     1025	/* Create GOT entry.  */
-#define R_AARCH64_JUMP_SLOT    1026	/* Create PLT entry.  */
-#define R_AARCH64_RELATIVE     1027	/* Adjust by program base.  */
-#define R_AARCH64_TLS_DTPMOD   1028	/* Module number, 64 bit.  */
-#define R_AARCH64_TLS_DTPREL   1029	/* Module-relative offset, 64 bit.  */
-#define R_AARCH64_TLS_TPREL    1030	/* TP-relative offset, 64 bit.  */
-#define R_AARCH64_TLSDESC      1031	/* TLS Descriptor.  */
-#define R_AARCH64_IRELATIVE	1032	/* STT_GNU_IFUNC relocation.  */
-
-/* ARM relocs.  */
-
-#define R_ARM_NONE		0	/* No reloc */
-#define R_ARM_PC24		1	/* Deprecated PC relative 26
-					   bit branch.  */
-#define R_ARM_ABS32		2	/* Direct 32 bit  */
-#define R_ARM_REL32		3	/* PC relative 32 bit */
-#define R_ARM_PC13		4
-#define R_ARM_ABS16		5	/* Direct 16 bit */
-#define R_ARM_ABS12		6	/* Direct 12 bit */
-#define R_ARM_THM_ABS5		7	/* Direct & 0x7C (LDR, STR).  */
-#define R_ARM_ABS8		8	/* Direct 8 bit */
-#define R_ARM_SBREL32		9
-#define R_ARM_THM_PC22		10	/* PC relative 24 bit (Thumb32 BL).  */
-#define R_ARM_THM_PC8		11	/* PC relative & 0x3FC
-					   (Thumb16 LDR, ADD, ADR).  */
-#define R_ARM_AMP_VCALL9	12
-#define R_ARM_SWI24		13	/* Obsolete static relocation.  */
-#define R_ARM_TLS_DESC		13      /* Dynamic relocation.  */
-#define R_ARM_THM_SWI8		14	/* Reserved.  */
-#define R_ARM_XPC25		15	/* Reserved.  */
-#define R_ARM_THM_XPC22		16	/* Reserved.  */
-#define R_ARM_TLS_DTPMOD32	17	/* ID of module containing symbol */
-#define R_ARM_TLS_DTPOFF32	18	/* Offset in TLS block */
-#define R_ARM_TLS_TPOFF32	19	/* Offset in static TLS block */
-#define R_ARM_COPY		20	/* Copy symbol at runtime */
-#define R_ARM_GLOB_DAT		21	/* Create GOT entry */
-#define R_ARM_JUMP_SLOT		22	/* Create PLT entry */
-#define R_ARM_RELATIVE		23	/* Adjust by program base */
-#define R_ARM_GOTOFF		24	/* 32 bit offset to GOT */
-#define R_ARM_GOTPC		25	/* 32 bit PC relative offset to GOT */
-#define R_ARM_GOT32		26	/* 32 bit GOT entry */
-#define R_ARM_PLT32		27	/* Deprecated, 32 bit PLT address.  */
-#define R_ARM_CALL		28	/* PC relative 24 bit (BL, BLX).  */
-#define R_ARM_JUMP24		29	/* PC relative 24 bit
-					   (B, BL<cond>).  */
-#define R_ARM_THM_JUMP24	30	/* PC relative 24 bit (Thumb32 B.W).  */
-#define R_ARM_BASE_ABS		31	/* Adjust by program base.  */
-#define R_ARM_ALU_PCREL_7_0	32	/* Obsolete.  */
-#define R_ARM_ALU_PCREL_15_8	33	/* Obsolete.  */
-#define R_ARM_ALU_PCREL_23_15	34	/* Obsolete.  */
-#define R_ARM_LDR_SBREL_11_0	35	/* Deprecated, prog. base relative.  */
-#define R_ARM_ALU_SBREL_19_12	36	/* Deprecated, prog. base relative.  */
-#define R_ARM_ALU_SBREL_27_20	37	/* Deprecated, prog. base relative.  */
-#define R_ARM_TARGET1		38
-#define R_ARM_SBREL31		39	/* Program base relative.  */
-#define R_ARM_V4BX		40
-#define R_ARM_TARGET2		41
-#define R_ARM_PREL31		42	/* 32 bit PC relative.  */
-#define R_ARM_MOVW_ABS_NC	43	/* Direct 16-bit (MOVW).  */
-#define R_ARM_MOVT_ABS		44	/* Direct high 16-bit (MOVT).  */
-#define R_ARM_MOVW_PREL_NC	45	/* PC relative 16-bit (MOVW).  */
-#define R_ARM_MOVT_PREL		46	/* PC relative (MOVT).  */
-#define R_ARM_THM_MOVW_ABS_NC	47	/* Direct 16 bit (Thumb32 MOVW).  */
-#define R_ARM_THM_MOVT_ABS	48	/* Direct high 16 bit
-					   (Thumb32 MOVT).  */
-#define R_ARM_THM_MOVW_PREL_NC	49	/* PC relative 16 bit
-					   (Thumb32 MOVW).  */
-#define R_ARM_THM_MOVT_PREL	50	/* PC relative high 16 bit
-					   (Thumb32 MOVT).  */
-#define R_ARM_THM_JUMP19	51	/* PC relative 20 bit
-					   (Thumb32 B<cond>.W).  */
-#define R_ARM_THM_JUMP6		52	/* PC relative X & 0x7E
-					   (Thumb16 CBZ, CBNZ).  */
-#define R_ARM_THM_ALU_PREL_11_0	53	/* PC relative 12 bit
-					   (Thumb32 ADR.W).  */
-#define R_ARM_THM_PC12		54	/* PC relative 12 bit
-					   (Thumb32 LDR{D,SB,H,SH}).  */
-#define R_ARM_ABS32_NOI		55	/* Direct 32-bit.  */
-#define R_ARM_REL32_NOI		56	/* PC relative 32-bit.  */
-#define R_ARM_ALU_PC_G0_NC	57	/* PC relative (ADD, SUB).  */
-#define R_ARM_ALU_PC_G0		58	/* PC relative (ADD, SUB).  */
-#define R_ARM_ALU_PC_G1_NC	59	/* PC relative (ADD, SUB).  */
-#define R_ARM_ALU_PC_G1		60	/* PC relative (ADD, SUB).  */
-#define R_ARM_ALU_PC_G2		61	/* PC relative (ADD, SUB).  */
-#define R_ARM_LDR_PC_G1		62	/* PC relative (LDR,STR,LDRB,STRB).  */
-#define R_ARM_LDR_PC_G2		63	/* PC relative (LDR,STR,LDRB,STRB).  */
-#define R_ARM_LDRS_PC_G0	64	/* PC relative (STR{D,H},
-					   LDR{D,SB,H,SH}).  */
-#define R_ARM_LDRS_PC_G1	65	/* PC relative (STR{D,H},
-					   LDR{D,SB,H,SH}).  */
-#define R_ARM_LDRS_PC_G2	66	/* PC relative (STR{D,H},
-					   LDR{D,SB,H,SH}).  */
-#define R_ARM_LDC_PC_G0		67	/* PC relative (LDC, STC).  */
-#define R_ARM_LDC_PC_G1		68	/* PC relative (LDC, STC).  */
-#define R_ARM_LDC_PC_G2		69	/* PC relative (LDC, STC).  */
-#define R_ARM_ALU_SB_G0_NC	70	/* Program base relative (ADD,SUB).  */
-#define R_ARM_ALU_SB_G0		71	/* Program base relative (ADD,SUB).  */
-#define R_ARM_ALU_SB_G1_NC	72	/* Program base relative (ADD,SUB).  */
-#define R_ARM_ALU_SB_G1		73	/* Program base relative (ADD,SUB).  */
-#define R_ARM_ALU_SB_G2		74	/* Program base relative (ADD,SUB).  */
-#define R_ARM_LDR_SB_G0		75	/* Program base relative (LDR,
-					   STR, LDRB, STRB).  */
-#define R_ARM_LDR_SB_G1		76	/* Program base relative
-					   (LDR, STR, LDRB, STRB).  */
-#define R_ARM_LDR_SB_G2		77	/* Program base relative
-					   (LDR, STR, LDRB, STRB).  */
-#define R_ARM_LDRS_SB_G0	78	/* Program base relative
-					   (LDR, STR, LDRB, STRB).  */
-#define R_ARM_LDRS_SB_G1	79	/* Program base relative
-					   (LDR, STR, LDRB, STRB).  */
-#define R_ARM_LDRS_SB_G2	80	/* Program base relative
-					   (LDR, STR, LDRB, STRB).  */
-#define R_ARM_LDC_SB_G0		81	/* Program base relative (LDC,STC).  */
-#define R_ARM_LDC_SB_G1		82	/* Program base relative (LDC,STC).  */
-#define R_ARM_LDC_SB_G2		83	/* Program base relative (LDC,STC).  */
-#define R_ARM_MOVW_BREL_NC	84	/* Program base relative 16
-					   bit (MOVW).  */
-#define R_ARM_MOVT_BREL		85	/* Program base relative high
-					   16 bit (MOVT).  */
-#define R_ARM_MOVW_BREL		86	/* Program base relative 16
-					   bit (MOVW).  */
-#define R_ARM_THM_MOVW_BREL_NC	87	/* Program base relative 16
-					   bit (Thumb32 MOVW).  */
-#define R_ARM_THM_MOVT_BREL	88	/* Program base relative high
-					   16 bit (Thumb32 MOVT).  */
-#define R_ARM_THM_MOVW_BREL	89	/* Program base relative 16
-					   bit (Thumb32 MOVW).  */
-#define R_ARM_TLS_GOTDESC	90
-#define R_ARM_TLS_CALL		91
-#define R_ARM_TLS_DESCSEQ	92	/* TLS relaxation.  */
-#define R_ARM_THM_TLS_CALL	93
-#define R_ARM_PLT32_ABS		94
-#define R_ARM_GOT_ABS		95	/* GOT entry.  */
-#define R_ARM_GOT_PREL		96	/* PC relative GOT entry.  */
-#define R_ARM_GOT_BREL12	97	/* GOT entry relative to GOT
-					   origin (LDR).  */
-#define R_ARM_GOTOFF12		98	/* 12 bit, GOT entry relative
-					   to GOT origin (LDR, STR).  */
-#define R_ARM_GOTRELAX		99
-#define R_ARM_GNU_VTENTRY	100
-#define R_ARM_GNU_VTINHERIT	101
-#define R_ARM_THM_PC11		102	/* PC relative & 0xFFE (Thumb16 B).  */
-#define R_ARM_THM_PC9		103	/* PC relative & 0x1FE
-					   (Thumb16 B/B<cond>).  */
-#define R_ARM_TLS_GD32		104	/* PC-rel 32 bit for global dynamic
-					   thread local data */
-#define R_ARM_TLS_LDM32		105	/* PC-rel 32 bit for local dynamic
-					   thread local data */
-#define R_ARM_TLS_LDO32		106	/* 32 bit offset relative to TLS
-					   block */
-#define R_ARM_TLS_IE32		107	/* PC-rel 32 bit for GOT entry of
-					   static TLS block offset */
-#define R_ARM_TLS_LE32		108	/* 32 bit offset relative to static
-					   TLS block */
-#define R_ARM_TLS_LDO12		109	/* 12 bit relative to TLS
-					   block (LDR, STR).  */
-#define R_ARM_TLS_LE12		110	/* 12 bit relative to static
-					   TLS block (LDR, STR).  */
-#define R_ARM_TLS_IE12GP	111	/* 12 bit GOT entry relative
-					   to GOT origin (LDR).  */
-#define R_ARM_ME_TOO		128	/* Obsolete.  */
-#define R_ARM_THM_TLS_DESCSEQ	129
-#define R_ARM_THM_TLS_DESCSEQ16	129
-#define R_ARM_THM_TLS_DESCSEQ32	130
-#define R_ARM_THM_GOT_BREL12	131	/* GOT entry relative to GOT
-					   origin, 12 bit (Thumb32 LDR).  */
-#define R_ARM_IRELATIVE		160
-#define R_ARM_RXPC25		249
-#define R_ARM_RSBREL32		250
-#define R_ARM_THM_RPC22		251
-#define R_ARM_RREL32		252
-#define R_ARM_RABS22		253
-#define R_ARM_RPC24		254
-#define R_ARM_RBASE		255
-/* Keep this the last entry.  */
-#define R_ARM_NUM		256
-
-/* IA-64 specific declarations.  */
-
-/* Processor specific flags for the Ehdr e_flags field.  */
-#define EF_IA_64_MASKOS		0x0000000f	/* os-specific flags */
-#define EF_IA_64_ABI64		0x00000010	/* 64-bit ABI */
-#define EF_IA_64_ARCH		0xff000000	/* arch. version mask */
-
-/* Processor specific values for the Phdr p_type field.  */
-#define PT_IA_64_ARCHEXT	(PT_LOPROC + 0)	/* arch extension bits */
-#define PT_IA_64_UNWIND		(PT_LOPROC + 1)	/* ia64 unwind bits */
-#define PT_IA_64_HP_OPT_ANOT	(PT_LOOS + 0x12)
-#define PT_IA_64_HP_HSL_ANOT	(PT_LOOS + 0x13)
-#define PT_IA_64_HP_STACK	(PT_LOOS + 0x14)
-
-/* Processor specific flags for the Phdr p_flags field.  */
-#define PF_IA_64_NORECOV	0x80000000	/* spec insns w/o recovery */
-
-/* Processor specific values for the Shdr sh_type field.  */
-#define SHT_IA_64_EXT		(SHT_LOPROC + 0) /* extension bits */
-#define SHT_IA_64_UNWIND	(SHT_LOPROC + 1) /* unwind bits */
-
-/* Processor specific flags for the Shdr sh_flags field.  */
-#define SHF_IA_64_SHORT		0x10000000	/* section near gp */
-#define SHF_IA_64_NORECOV	0x20000000	/* spec insns w/o recovery */
-
-/* Processor specific values for the Dyn d_tag field.  */
-#define DT_IA_64_PLT_RESERVE	(DT_LOPROC + 0)
-#define DT_IA_64_NUM		1
-
-/* IA-64 relocations.  */
-#define R_IA64_NONE		0x00	/* none */
-#define R_IA64_IMM14		0x21	/* symbol + addend, add imm14 */
-#define R_IA64_IMM22		0x22	/* symbol + addend, add imm22 */
-#define R_IA64_IMM64		0x23	/* symbol + addend, mov imm64 */
-#define R_IA64_DIR32MSB		0x24	/* symbol + addend, data4 MSB */
-#define R_IA64_DIR32LSB		0x25	/* symbol + addend, data4 LSB */
-#define R_IA64_DIR64MSB		0x26	/* symbol + addend, data8 MSB */
-#define R_IA64_DIR64LSB		0x27	/* symbol + addend, data8 LSB */
-#define R_IA64_GPREL22		0x2a	/* @gprel(sym + add), add imm22 */
-#define R_IA64_GPREL64I		0x2b	/* @gprel(sym + add), mov imm64 */
-#define R_IA64_GPREL32MSB	0x2c	/* @gprel(sym + add), data4 MSB */
-#define R_IA64_GPREL32LSB	0x2d	/* @gprel(sym + add), data4 LSB */
-#define R_IA64_GPREL64MSB	0x2e	/* @gprel(sym + add), data8 MSB */
-#define R_IA64_GPREL64LSB	0x2f	/* @gprel(sym + add), data8 LSB */
-#define R_IA64_LTOFF22		0x32	/* @ltoff(sym + add), add imm22 */
-#define R_IA64_LTOFF64I		0x33	/* @ltoff(sym + add), mov imm64 */
-#define R_IA64_PLTOFF22		0x3a	/* @pltoff(sym + add), add imm22 */
-#define R_IA64_PLTOFF64I	0x3b	/* @pltoff(sym + add), mov imm64 */
-#define R_IA64_PLTOFF64MSB	0x3e	/* @pltoff(sym + add), data8 MSB */
-#define R_IA64_PLTOFF64LSB	0x3f	/* @pltoff(sym + add), data8 LSB */
-#define R_IA64_FPTR64I		0x43	/* @fptr(sym + add), mov imm64 */
-#define R_IA64_FPTR32MSB	0x44	/* @fptr(sym + add), data4 MSB */
-#define R_IA64_FPTR32LSB	0x45	/* @fptr(sym + add), data4 LSB */
-#define R_IA64_FPTR64MSB	0x46	/* @fptr(sym + add), data8 MSB */
-#define R_IA64_FPTR64LSB	0x47	/* @fptr(sym + add), data8 LSB */
-#define R_IA64_PCREL60B		0x48	/* @pcrel(sym + add), brl */
-#define R_IA64_PCREL21B		0x49	/* @pcrel(sym + add), ptb, call */
-#define R_IA64_PCREL21M		0x4a	/* @pcrel(sym + add), chk.s */
-#define R_IA64_PCREL21F		0x4b	/* @pcrel(sym + add), fchkf */
-#define R_IA64_PCREL32MSB	0x4c	/* @pcrel(sym + add), data4 MSB */
-#define R_IA64_PCREL32LSB	0x4d	/* @pcrel(sym + add), data4 LSB */
-#define R_IA64_PCREL64MSB	0x4e	/* @pcrel(sym + add), data8 MSB */
-#define R_IA64_PCREL64LSB	0x4f	/* @pcrel(sym + add), data8 LSB */
-#define R_IA64_LTOFF_FPTR22	0x52	/* @ltoff(@fptr(s+a)), imm22 */
-#define R_IA64_LTOFF_FPTR64I	0x53	/* @ltoff(@fptr(s+a)), imm64 */
-#define R_IA64_LTOFF_FPTR32MSB	0x54	/* @ltoff(@fptr(s+a)), data4 MSB */
-#define R_IA64_LTOFF_FPTR32LSB	0x55	/* @ltoff(@fptr(s+a)), data4 LSB */
-#define R_IA64_LTOFF_FPTR64MSB	0x56	/* @ltoff(@fptr(s+a)), data8 MSB */
-#define R_IA64_LTOFF_FPTR64LSB	0x57	/* @ltoff(@fptr(s+a)), data8 LSB */
-#define R_IA64_SEGREL32MSB	0x5c	/* @segrel(sym + add), data4 MSB */
-#define R_IA64_SEGREL32LSB	0x5d	/* @segrel(sym + add), data4 LSB */
-#define R_IA64_SEGREL64MSB	0x5e	/* @segrel(sym + add), data8 MSB */
-#define R_IA64_SEGREL64LSB	0x5f	/* @segrel(sym + add), data8 LSB */
-#define R_IA64_SECREL32MSB	0x64	/* @secrel(sym + add), data4 MSB */
-#define R_IA64_SECREL32LSB	0x65	/* @secrel(sym + add), data4 LSB */
-#define R_IA64_SECREL64MSB	0x66	/* @secrel(sym + add), data8 MSB */
-#define R_IA64_SECREL64LSB	0x67	/* @secrel(sym + add), data8 LSB */
-#define R_IA64_REL32MSB		0x6c	/* data 4 + REL */
-#define R_IA64_REL32LSB		0x6d	/* data 4 + REL */
-#define R_IA64_REL64MSB		0x6e	/* data 8 + REL */
-#define R_IA64_REL64LSB		0x6f	/* data 8 + REL */
-#define R_IA64_LTV32MSB		0x74	/* symbol + addend, data4 MSB */
-#define R_IA64_LTV32LSB		0x75	/* symbol + addend, data4 LSB */
-#define R_IA64_LTV64MSB		0x76	/* symbol + addend, data8 MSB */
-#define R_IA64_LTV64LSB		0x77	/* symbol + addend, data8 LSB */
-#define R_IA64_PCREL21BI	0x79	/* @pcrel(sym + add), 21bit inst */
-#define R_IA64_PCREL22		0x7a	/* @pcrel(sym + add), 22bit inst */
-#define R_IA64_PCREL64I		0x7b	/* @pcrel(sym + add), 64bit inst */
-#define R_IA64_IPLTMSB		0x80	/* dynamic reloc, imported PLT, MSB */
-#define R_IA64_IPLTLSB		0x81	/* dynamic reloc, imported PLT, LSB */
-#define R_IA64_COPY		0x84	/* copy relocation */
-#define R_IA64_SUB		0x85	/* Addend and symbol difference */
-#define R_IA64_LTOFF22X		0x86	/* LTOFF22, relaxable.  */
-#define R_IA64_LDXMOV		0x87	/* Use of LTOFF22X.  */
-#define R_IA64_TPREL14		0x91	/* @tprel(sym + add), imm14 */
-#define R_IA64_TPREL22		0x92	/* @tprel(sym + add), imm22 */
-#define R_IA64_TPREL64I		0x93	/* @tprel(sym + add), imm64 */
-#define R_IA64_TPREL64MSB	0x96	/* @tprel(sym + add), data8 MSB */
-#define R_IA64_TPREL64LSB	0x97	/* @tprel(sym + add), data8 LSB */
-#define R_IA64_LTOFF_TPREL22	0x9a	/* @ltoff(@tprel(s+a)), imm2 */
-#define R_IA64_DTPMOD64MSB	0xa6	/* @dtpmod(sym + add), data8 MSB */
-#define R_IA64_DTPMOD64LSB	0xa7	/* @dtpmod(sym + add), data8 LSB */
-#define R_IA64_LTOFF_DTPMOD22	0xaa	/* @ltoff(@dtpmod(sym + add)), imm22 */
-#define R_IA64_DTPREL14		0xb1	/* @dtprel(sym + add), imm14 */
-#define R_IA64_DTPREL22		0xb2	/* @dtprel(sym + add), imm22 */
-#define R_IA64_DTPREL64I	0xb3	/* @dtprel(sym + add), imm64 */
-#define R_IA64_DTPREL32MSB	0xb4	/* @dtprel(sym + add), data4 MSB */
-#define R_IA64_DTPREL32LSB	0xb5	/* @dtprel(sym + add), data4 LSB */
-#define R_IA64_DTPREL64MSB	0xb6	/* @dtprel(sym + add), data8 MSB */
-#define R_IA64_DTPREL64LSB	0xb7	/* @dtprel(sym + add), data8 LSB */
-#define R_IA64_LTOFF_DTPREL22	0xba	/* @ltoff(@dtprel(s+a)), imm22 */
-
-/* SH specific declarations */
-
-/* Processor specific flags for the ELF header e_flags field.  */
-#define EF_SH_MACH_MASK		0x1f
-#define EF_SH_UNKNOWN		0x0
-#define EF_SH1			0x1
-#define EF_SH2			0x2
-#define EF_SH3			0x3
-#define EF_SH_DSP		0x4
-#define EF_SH3_DSP		0x5
-#define EF_SH4AL_DSP		0x6
-#define EF_SH3E			0x8
-#define EF_SH4			0x9
-#define EF_SH2E			0xb
-#define EF_SH4A			0xc
-#define EF_SH2A			0xd
-#define EF_SH4_NOFPU		0x10
-#define EF_SH4A_NOFPU		0x11
-#define EF_SH4_NOMMU_NOFPU	0x12
-#define EF_SH2A_NOFPU		0x13
-#define EF_SH3_NOMMU		0x14
-#define EF_SH2A_SH4_NOFPU	0x15
-#define EF_SH2A_SH3_NOFPU	0x16
-#define EF_SH2A_SH4		0x17
-#define EF_SH2A_SH3E		0x18
-
-/* SH relocs.  */
-#define	R_SH_NONE		0
-#define	R_SH_DIR32		1
-#define	R_SH_REL32		2
-#define	R_SH_DIR8WPN		3
-#define	R_SH_IND12W		4
-#define	R_SH_DIR8WPL		5
-#define	R_SH_DIR8WPZ		6
-#define	R_SH_DIR8BP		7
-#define	R_SH_DIR8W		8
-#define	R_SH_DIR8L		9
-#define	R_SH_SWITCH16		25
-#define	R_SH_SWITCH32		26
-#define	R_SH_USES		27
-#define	R_SH_COUNT		28
-#define	R_SH_ALIGN		29
-#define	R_SH_CODE		30
-#define	R_SH_DATA		31
-#define	R_SH_LABEL		32
-#define	R_SH_SWITCH8		33
-#define	R_SH_GNU_VTINHERIT	34
-#define	R_SH_GNU_VTENTRY	35
-#define	R_SH_TLS_GD_32		144
-#define	R_SH_TLS_LD_32		145
-#define	R_SH_TLS_LDO_32		146
-#define	R_SH_TLS_IE_32		147
-#define	R_SH_TLS_LE_32		148
-#define	R_SH_TLS_DTPMOD32	149
-#define	R_SH_TLS_DTPOFF32	150
-#define	R_SH_TLS_TPOFF32	151
-#define	R_SH_GOT32		160
-#define	R_SH_PLT32		161
-#define	R_SH_COPY		162
-#define	R_SH_GLOB_DAT		163
-#define	R_SH_JMP_SLOT		164
-#define	R_SH_RELATIVE		165
-#define	R_SH_GOTOFF		166
-#define	R_SH_GOTPC		167
-/* Keep this the last entry.  */
-#define	R_SH_NUM		256
-
-/* S/390 specific definitions.  */
-
-/* Valid values for the e_flags field.  */
-
-#define EF_S390_HIGH_GPRS    0x00000001  /* High GPRs kernel facility needed.  */
-
-/* Additional s390 relocs */
-
-#define R_390_NONE		0	/* No reloc.  */
-#define R_390_8			1	/* Direct 8 bit.  */
-#define R_390_12		2	/* Direct 12 bit.  */
-#define R_390_16		3	/* Direct 16 bit.  */
-#define R_390_32		4	/* Direct 32 bit.  */
-#define R_390_PC32		5	/* PC relative 32 bit.	*/
-#define R_390_GOT12		6	/* 12 bit GOT offset.  */
-#define R_390_GOT32		7	/* 32 bit GOT offset.  */
-#define R_390_PLT32		8	/* 32 bit PC relative PLT address.  */
-#define R_390_COPY		9	/* Copy symbol at runtime.  */
-#define R_390_GLOB_DAT		10	/* Create GOT entry.  */
-#define R_390_JMP_SLOT		11	/* Create PLT entry.  */
-#define R_390_RELATIVE		12	/* Adjust by program base.  */
-#define R_390_GOTOFF32		13	/* 32 bit offset to GOT.	 */
-#define R_390_GOTPC		14	/* 32 bit PC relative offset to GOT.  */
-#define R_390_GOT16		15	/* 16 bit GOT offset.  */
-#define R_390_PC16		16	/* PC relative 16 bit.	*/
-#define R_390_PC16DBL		17	/* PC relative 16 bit shifted by 1.  */
-#define R_390_PLT16DBL		18	/* 16 bit PC rel. PLT shifted by 1.  */
-#define R_390_PC32DBL		19	/* PC relative 32 bit shifted by 1.  */
-#define R_390_PLT32DBL		20	/* 32 bit PC rel. PLT shifted by 1.  */
-#define R_390_GOTPCDBL		21	/* 32 bit PC rel. GOT shifted by 1.  */
-#define R_390_64		22	/* Direct 64 bit.  */
-#define R_390_PC64		23	/* PC relative 64 bit.	*/
-#define R_390_GOT64		24	/* 64 bit GOT offset.  */
-#define R_390_PLT64		25	/* 64 bit PC relative PLT address.  */
-#define R_390_GOTENT		26	/* 32 bit PC rel. to GOT entry >> 1. */
-#define R_390_GOTOFF16		27	/* 16 bit offset to GOT. */
-#define R_390_GOTOFF64		28	/* 64 bit offset to GOT. */
-#define R_390_GOTPLT12		29	/* 12 bit offset to jump slot.	*/
-#define R_390_GOTPLT16		30	/* 16 bit offset to jump slot.	*/
-#define R_390_GOTPLT32		31	/* 32 bit offset to jump slot.	*/
-#define R_390_GOTPLT64		32	/* 64 bit offset to jump slot.	*/
-#define R_390_GOTPLTENT		33	/* 32 bit rel. offset to jump slot.  */
-#define R_390_PLTOFF16		34	/* 16 bit offset from GOT to PLT. */
-#define R_390_PLTOFF32		35	/* 32 bit offset from GOT to PLT. */
-#define R_390_PLTOFF64		36	/* 16 bit offset from GOT to PLT. */
-#define R_390_TLS_LOAD		37	/* Tag for load insn in TLS code.  */
-#define R_390_TLS_GDCALL	38	/* Tag for function call in general
-					   dynamic TLS code. */
-#define R_390_TLS_LDCALL	39	/* Tag for function call in local
-					   dynamic TLS code. */
-#define R_390_TLS_GD32		40	/* Direct 32 bit for general dynamic
-					   thread local data.  */
-#define R_390_TLS_GD64		41	/* Direct 64 bit for general dynamic
-					  thread local data.  */
-#define R_390_TLS_GOTIE12	42	/* 12 bit GOT offset for static TLS
-					   block offset.  */
-#define R_390_TLS_GOTIE32	43	/* 32 bit GOT offset for static TLS
-					   block offset.  */
-#define R_390_TLS_GOTIE64	44	/* 64 bit GOT offset for static TLS
-					   block offset. */
-#define R_390_TLS_LDM32		45	/* Direct 32 bit for local dynamic
-					   thread local data in LE code.  */
-#define R_390_TLS_LDM64		46	/* Direct 64 bit for local dynamic
-					   thread local data in LE code.  */
-#define R_390_TLS_IE32		47	/* 32 bit address of GOT entry for
-					   negated static TLS block offset.  */
-#define R_390_TLS_IE64		48	/* 64 bit address of GOT entry for
-					   negated static TLS block offset.  */
-#define R_390_TLS_IEENT		49	/* 32 bit rel. offset to GOT entry for
-					   negated static TLS block offset.  */
-#define R_390_TLS_LE32		50	/* 32 bit negated offset relative to
-					   static TLS block.  */
-#define R_390_TLS_LE64		51	/* 64 bit negated offset relative to
-					   static TLS block.  */
-#define R_390_TLS_LDO32		52	/* 32 bit offset relative to TLS
-					   block.  */
-#define R_390_TLS_LDO64		53	/* 64 bit offset relative to TLS
-					   block.  */
-#define R_390_TLS_DTPMOD	54	/* ID of module containing symbol.  */
-#define R_390_TLS_DTPOFF	55	/* Offset in TLS block.	 */
-#define R_390_TLS_TPOFF		56	/* Negated offset in static TLS
-					   block.  */
-#define R_390_20		57	/* Direct 20 bit.  */
-#define R_390_GOT20		58	/* 20 bit GOT offset.  */
-#define R_390_GOTPLT20		59	/* 20 bit offset to jump slot.  */
-#define R_390_TLS_GOTIE20	60	/* 20 bit GOT offset for static TLS
-					   block offset.  */
-#define R_390_IRELATIVE         61      /* STT_GNU_IFUNC relocation.  */
-/* Keep this the last entry.  */
-#define R_390_NUM		62
-
-
-/* CRIS relocations.  */
-#define R_CRIS_NONE		0
-#define R_CRIS_8		1
-#define R_CRIS_16		2
-#define R_CRIS_32		3
-#define R_CRIS_8_PCREL		4
-#define R_CRIS_16_PCREL		5
-#define R_CRIS_32_PCREL		6
-#define R_CRIS_GNU_VTINHERIT	7
-#define R_CRIS_GNU_VTENTRY	8
-#define R_CRIS_COPY		9
-#define R_CRIS_GLOB_DAT		10
-#define R_CRIS_JUMP_SLOT	11
-#define R_CRIS_RELATIVE		12
-#define R_CRIS_16_GOT		13
-#define R_CRIS_32_GOT		14
-#define R_CRIS_16_GOTPLT	15
-#define R_CRIS_32_GOTPLT	16
-#define R_CRIS_32_GOTREL	17
-#define R_CRIS_32_PLT_GOTREL	18
-#define R_CRIS_32_PLT_PCREL	19
-
-#define R_CRIS_NUM		20
-
-
-/* AMD x86-64 relocations.  */
-#define R_X86_64_NONE		0	/* No reloc */
-#define R_X86_64_64		1	/* Direct 64 bit  */
-#define R_X86_64_PC32		2	/* PC relative 32 bit signed */
-#define R_X86_64_GOT32		3	/* 32 bit GOT entry */
-#define R_X86_64_PLT32		4	/* 32 bit PLT address */
-#define R_X86_64_COPY		5	/* Copy symbol at runtime */
-#define R_X86_64_GLOB_DAT	6	/* Create GOT entry */
-#define R_X86_64_JUMP_SLOT	7	/* Create PLT entry */
-#define R_X86_64_RELATIVE	8	/* Adjust by program base */
-#define R_X86_64_GOTPCREL	9	/* 32 bit signed PC relative
-					   offset to GOT */
-#define R_X86_64_32		10	/* Direct 32 bit zero extended */
-#define R_X86_64_32S		11	/* Direct 32 bit sign extended */
-#define R_X86_64_16		12	/* Direct 16 bit zero extended */
-#define R_X86_64_PC16		13	/* 16 bit sign extended pc relative */
-#define R_X86_64_8		14	/* Direct 8 bit sign extended  */
-#define R_X86_64_PC8		15	/* 8 bit sign extended pc relative */
-#define R_X86_64_DTPMOD64	16	/* ID of module containing symbol */
-#define R_X86_64_DTPOFF64	17	/* Offset in module's TLS block */
-#define R_X86_64_TPOFF64	18	/* Offset in initial TLS block */
-#define R_X86_64_TLSGD		19	/* 32 bit signed PC relative offset
-					   to two GOT entries for GD symbol */
-#define R_X86_64_TLSLD		20	/* 32 bit signed PC relative offset
-					   to two GOT entries for LD symbol */
-#define R_X86_64_DTPOFF32	21	/* Offset in TLS block */
-#define R_X86_64_GOTTPOFF	22	/* 32 bit signed PC relative offset
-					   to GOT entry for IE symbol */
-#define R_X86_64_TPOFF32	23	/* Offset in initial TLS block */
-#define R_X86_64_PC64		24	/* PC relative 64 bit */
-#define R_X86_64_GOTOFF64	25	/* 64 bit offset to GOT */
-#define R_X86_64_GOTPC32	26	/* 32 bit signed pc relative
-					   offset to GOT */
-#define R_X86_64_GOT64		27	/* 64-bit GOT entry offset */
-#define R_X86_64_GOTPCREL64	28	/* 64-bit PC relative offset
-					   to GOT entry */
-#define R_X86_64_GOTPC64	29	/* 64-bit PC relative offset to GOT */
-#define R_X86_64_GOTPLT64	30 	/* like GOT64, says PLT entry needed */
-#define R_X86_64_PLTOFF64	31	/* 64-bit GOT relative offset
-					   to PLT entry */
-#define R_X86_64_SIZE32		32	/* Size of symbol plus 32-bit addend */
-#define R_X86_64_SIZE64		33	/* Size of symbol plus 64-bit addend */
-#define R_X86_64_GOTPC32_TLSDESC 34	/* GOT offset for TLS descriptor.  */
-#define R_X86_64_TLSDESC_CALL   35	/* Marker for call through TLS
-					   descriptor.  */
-#define R_X86_64_TLSDESC        36	/* TLS descriptor.  */
-#define R_X86_64_IRELATIVE	37	/* Adjust indirectly by program base */
-#define R_X86_64_RELATIVE64	38	/* 64-bit adjust by program base */
-					/* 39 Reserved was R_X86_64_PC32_BND */
-					/* 40 Reserved was R_X86_64_PLT32_BND */
-#define R_X86_64_GOTPCRELX	41	/* Load from 32 bit signed pc relative
-					   offset to GOT entry without REX
-					   prefix, relaxable.  */
-#define R_X86_64_REX_GOTPCRELX	42	/* Load from 32 bit signed pc relative
-					   offset to GOT entry with REX prefix,
-					   relaxable.  */
-#define R_X86_64_NUM		43
-
-
-/* AM33 relocations.  */
-#define R_MN10300_NONE		0	/* No reloc.  */
-#define R_MN10300_32		1	/* Direct 32 bit.  */
-#define R_MN10300_16		2	/* Direct 16 bit.  */
-#define R_MN10300_8		3	/* Direct 8 bit.  */
-#define R_MN10300_PCREL32	4	/* PC-relative 32-bit.  */
-#define R_MN10300_PCREL16	5	/* PC-relative 16-bit signed.  */
-#define R_MN10300_PCREL8	6	/* PC-relative 8-bit signed.  */
-#define R_MN10300_GNU_VTINHERIT	7	/* Ancient C++ vtable garbage... */
-#define R_MN10300_GNU_VTENTRY	8	/* ... collection annotation.  */
-#define R_MN10300_24		9	/* Direct 24 bit.  */
-#define R_MN10300_GOTPC32	10	/* 32-bit PCrel offset to GOT.  */
-#define R_MN10300_GOTPC16	11	/* 16-bit PCrel offset to GOT.  */
-#define R_MN10300_GOTOFF32	12	/* 32-bit offset from GOT.  */
-#define R_MN10300_GOTOFF24	13	/* 24-bit offset from GOT.  */
-#define R_MN10300_GOTOFF16	14	/* 16-bit offset from GOT.  */
-#define R_MN10300_PLT32		15	/* 32-bit PCrel to PLT entry.  */
-#define R_MN10300_PLT16		16	/* 16-bit PCrel to PLT entry.  */
-#define R_MN10300_GOT32		17	/* 32-bit offset to GOT entry.  */
-#define R_MN10300_GOT24		18	/* 24-bit offset to GOT entry.  */
-#define R_MN10300_GOT16		19	/* 16-bit offset to GOT entry.  */
-#define R_MN10300_COPY		20	/* Copy symbol at runtime.  */
-#define R_MN10300_GLOB_DAT	21	/* Create GOT entry.  */
-#define R_MN10300_JMP_SLOT	22	/* Create PLT entry.  */
-#define R_MN10300_RELATIVE	23	/* Adjust by program base.  */
-#define R_MN10300_TLS_GD	24	/* 32-bit offset for global dynamic.  */
-#define R_MN10300_TLS_LD	25	/* 32-bit offset for local dynamic.  */
-#define R_MN10300_TLS_LDO	26	/* Module-relative offset.  */
-#define R_MN10300_TLS_GOTIE	27	/* GOT offset for static TLS block
-					   offset.  */
-#define R_MN10300_TLS_IE	28	/* GOT address for static TLS block
-					   offset.  */
-#define R_MN10300_TLS_LE	29	/* Offset relative to static TLS
-					   block.  */
-#define R_MN10300_TLS_DTPMOD	30	/* ID of module containing symbol.  */
-#define R_MN10300_TLS_DTPOFF	31	/* Offset in module TLS block.  */
-#define R_MN10300_TLS_TPOFF	32	/* Offset in static TLS block.  */
-#define R_MN10300_SYM_DIFF	33	/* Adjustment for next reloc as needed
-					   by linker relaxation.  */
-#define R_MN10300_ALIGN		34	/* Alignment requirement for linker
-					   relaxation.  */
-#define R_MN10300_NUM		35
-
-
-/* M32R relocs.  */
-#define R_M32R_NONE		0	/* No reloc. */
-#define R_M32R_16		1	/* Direct 16 bit. */
-#define R_M32R_32		2	/* Direct 32 bit. */
-#define R_M32R_24		3	/* Direct 24 bit. */
-#define R_M32R_10_PCREL		4	/* PC relative 10 bit shifted. */
-#define R_M32R_18_PCREL		5	/* PC relative 18 bit shifted. */
-#define R_M32R_26_PCREL		6	/* PC relative 26 bit shifted. */
-#define R_M32R_HI16_ULO		7	/* High 16 bit with unsigned low. */
-#define R_M32R_HI16_SLO		8	/* High 16 bit with signed low. */
-#define R_M32R_LO16		9	/* Low 16 bit. */
-#define R_M32R_SDA16		10	/* 16 bit offset in SDA. */
-#define R_M32R_GNU_VTINHERIT	11
-#define R_M32R_GNU_VTENTRY	12
-/* M32R relocs use SHT_RELA.  */
-#define R_M32R_16_RELA		33	/* Direct 16 bit. */
-#define R_M32R_32_RELA		34	/* Direct 32 bit. */
-#define R_M32R_24_RELA		35	/* Direct 24 bit. */
-#define R_M32R_10_PCREL_RELA	36	/* PC relative 10 bit shifted. */
-#define R_M32R_18_PCREL_RELA	37	/* PC relative 18 bit shifted. */
-#define R_M32R_26_PCREL_RELA	38	/* PC relative 26 bit shifted. */
-#define R_M32R_HI16_ULO_RELA	39	/* High 16 bit with unsigned low */
-#define R_M32R_HI16_SLO_RELA	40	/* High 16 bit with signed low */
-#define R_M32R_LO16_RELA	41	/* Low 16 bit */
-#define R_M32R_SDA16_RELA	42	/* 16 bit offset in SDA */
-#define R_M32R_RELA_GNU_VTINHERIT	43
-#define R_M32R_RELA_GNU_VTENTRY	44
-#define R_M32R_REL32		45	/* PC relative 32 bit.  */
-
-#define R_M32R_GOT24		48	/* 24 bit GOT entry */
-#define R_M32R_26_PLTREL	49	/* 26 bit PC relative to PLT shifted */
-#define R_M32R_COPY		50	/* Copy symbol at runtime */
-#define R_M32R_GLOB_DAT		51	/* Create GOT entry */
-#define R_M32R_JMP_SLOT		52	/* Create PLT entry */
-#define R_M32R_RELATIVE		53	/* Adjust by program base */
-#define R_M32R_GOTOFF		54	/* 24 bit offset to GOT */
-#define R_M32R_GOTPC24		55	/* 24 bit PC relative offset to GOT */
-#define R_M32R_GOT16_HI_ULO	56	/* High 16 bit GOT entry with unsigned
-					   low */
-#define R_M32R_GOT16_HI_SLO	57	/* High 16 bit GOT entry with signed
-					   low */
-#define R_M32R_GOT16_LO		58	/* Low 16 bit GOT entry */
-#define R_M32R_GOTPC_HI_ULO	59	/* High 16 bit PC relative offset to
-					   GOT with unsigned low */
-#define R_M32R_GOTPC_HI_SLO	60	/* High 16 bit PC relative offset to
-					   GOT with signed low */
-#define R_M32R_GOTPC_LO		61	/* Low 16 bit PC relative offset to
-					   GOT */
-#define R_M32R_GOTOFF_HI_ULO	62	/* High 16 bit offset to GOT
-					   with unsigned low */
-#define R_M32R_GOTOFF_HI_SLO	63	/* High 16 bit offset to GOT
-					   with signed low */
-#define R_M32R_GOTOFF_LO	64	/* Low 16 bit offset to GOT */
-#define R_M32R_NUM		256	/* Keep this the last entry. */
-
-/* MicroBlaze relocations */
-#define R_MICROBLAZE_NONE		0	/* No reloc. */
-#define R_MICROBLAZE_32 		1	/* Direct 32 bit. */
-#define R_MICROBLAZE_32_PCREL		2	/* PC relative 32 bit. */
-#define R_MICROBLAZE_64_PCREL		3	/* PC relative 64 bit. */
-#define R_MICROBLAZE_32_PCREL_LO	4	/* Low 16 bits of PCREL32. */
-#define R_MICROBLAZE_64 		5	/* Direct 64 bit. */
-#define R_MICROBLAZE_32_LO		6	/* Low 16 bit. */
-#define R_MICROBLAZE_SRO32		7	/* Read-only small data area. */
-#define R_MICROBLAZE_SRW32		8	/* Read-write small data area. */
-#define R_MICROBLAZE_64_NONE		9	/* No reloc. */
-#define R_MICROBLAZE_32_SYM_OP_SYM	10	/* Symbol Op Symbol relocation. */
-#define R_MICROBLAZE_GNU_VTINHERIT	11	/* GNU C++ vtable hierarchy. */
-#define R_MICROBLAZE_GNU_VTENTRY	12	/* GNU C++ vtable member usage. */
-#define R_MICROBLAZE_GOTPC_64		13	/* PC-relative GOT offset.  */
-#define R_MICROBLAZE_GOT_64		14	/* GOT entry offset.  */
-#define R_MICROBLAZE_PLT_64		15	/* PLT offset (PC-relative).  */
-#define R_MICROBLAZE_REL		16	/* Adjust by program base.  */
-#define R_MICROBLAZE_JUMP_SLOT		17	/* Create PLT entry.  */
-#define R_MICROBLAZE_GLOB_DAT		18	/* Create GOT entry.  */
-#define R_MICROBLAZE_GOTOFF_64		19	/* 64 bit offset to GOT. */
-#define R_MICROBLAZE_GOTOFF_32		20	/* 32 bit offset to GOT. */
-#define R_MICROBLAZE_COPY		21	/* Runtime copy.  */
-#define R_MICROBLAZE_TLS		22	/* TLS Reloc. */
-#define R_MICROBLAZE_TLSGD		23	/* TLS General Dynamic. */
-#define R_MICROBLAZE_TLSLD		24	/* TLS Local Dynamic. */
-#define R_MICROBLAZE_TLSDTPMOD32	25	/* TLS Module ID. */
-#define R_MICROBLAZE_TLSDTPREL32	26	/* TLS Offset Within TLS Block. */
-#define R_MICROBLAZE_TLSDTPREL64	27	/* TLS Offset Within TLS Block. */
-#define R_MICROBLAZE_TLSGOTTPREL32	28	/* TLS Offset From Thread Pointer. */
-#define R_MICROBLAZE_TLSTPREL32 	29	/* TLS Offset From Thread Pointer. */
-
-/* Legal values for d_tag (dynamic entry type).  */
-#define DT_NIOS2_GP             0x70000002 /* Address of _gp.  */
-
-/* Nios II relocations.  */
-#define R_NIOS2_NONE		0	/* No reloc.  */
-#define R_NIOS2_S16		1	/* Direct signed 16 bit.  */
-#define R_NIOS2_U16		2	/* Direct unsigned 16 bit.  */
-#define R_NIOS2_PCREL16		3	/* PC relative 16 bit.  */
-#define R_NIOS2_CALL26		4	/* Direct call.  */
-#define R_NIOS2_IMM5		5	/* 5 bit constant expression.  */
-#define R_NIOS2_CACHE_OPX	6	/* 5 bit expression, shift 22.  */
-#define R_NIOS2_IMM6		7	/* 6 bit constant expression.  */
-#define R_NIOS2_IMM8		8	/* 8 bit constant expression.  */
-#define R_NIOS2_HI16		9	/* High 16 bit.  */
-#define R_NIOS2_LO16		10	/* Low 16 bit.  */
-#define R_NIOS2_HIADJ16		11	/* High 16 bit, adjusted.  */
-#define R_NIOS2_BFD_RELOC_32	12	/* 32 bit symbol value + addend.  */
-#define R_NIOS2_BFD_RELOC_16	13	/* 16 bit symbol value + addend.  */
-#define R_NIOS2_BFD_RELOC_8	14	/* 8 bit symbol value + addend.  */
-#define R_NIOS2_GPREL		15	/* 16 bit GP pointer offset.  */
-#define R_NIOS2_GNU_VTINHERIT	16	/* GNU C++ vtable hierarchy.  */
-#define R_NIOS2_GNU_VTENTRY	17	/* GNU C++ vtable member usage.  */
-#define R_NIOS2_UJMP		18	/* Unconditional branch.  */
-#define R_NIOS2_CJMP		19	/* Conditional branch.  */
-#define R_NIOS2_CALLR		20	/* Indirect call through register.  */
-#define R_NIOS2_ALIGN		21	/* Alignment requirement for
-					   linker relaxation.  */
-#define R_NIOS2_GOT16		22	/* 16 bit GOT entry.  */
-#define R_NIOS2_CALL16		23	/* 16 bit GOT entry for function.  */
-#define R_NIOS2_GOTOFF_LO	24	/* %lo of offset to GOT pointer.  */
-#define R_NIOS2_GOTOFF_HA	25	/* %hiadj of offset to GOT pointer.  */
-#define R_NIOS2_PCREL_LO	26	/* %lo of PC relative offset.  */
-#define R_NIOS2_PCREL_HA	27	/* %hiadj of PC relative offset.  */
-#define R_NIOS2_TLS_GD16	28	/* 16 bit GOT offset for TLS GD.  */
-#define R_NIOS2_TLS_LDM16	29	/* 16 bit GOT offset for TLS LDM.  */
-#define R_NIOS2_TLS_LDO16	30	/* 16 bit module relative offset.  */
-#define R_NIOS2_TLS_IE16	31	/* 16 bit GOT offset for TLS IE.  */
-#define R_NIOS2_TLS_LE16	32	/* 16 bit LE TP-relative offset.  */
-#define R_NIOS2_TLS_DTPMOD	33	/* Module number.  */
-#define R_NIOS2_TLS_DTPREL	34	/* Module-relative offset.  */
-#define R_NIOS2_TLS_TPREL	35	/* TP-relative offset.  */
-#define R_NIOS2_COPY		36	/* Copy symbol at runtime.  */
-#define R_NIOS2_GLOB_DAT	37	/* Create GOT entry.  */
-#define R_NIOS2_JUMP_SLOT	38	/* Create PLT entry.  */
-#define R_NIOS2_RELATIVE	39	/* Adjust by program base.  */
-#define R_NIOS2_GOTOFF		40	/* 16 bit offset to GOT pointer.  */
-#define R_NIOS2_CALL26_NOAT	41	/* Direct call in .noat section.  */
-#define R_NIOS2_GOT_LO		42	/* %lo() of GOT entry.  */
-#define R_NIOS2_GOT_HA		43	/* %hiadj() of GOT entry.  */
-#define R_NIOS2_CALL_LO		44	/* %lo() of function GOT entry.  */
-#define R_NIOS2_CALL_HA		45	/* %hiadj() of function GOT entry.  */
-
-/* TILEPro relocations.  */
-#define R_TILEPRO_NONE		0	/* No reloc */
-#define R_TILEPRO_32		1	/* Direct 32 bit */
-#define R_TILEPRO_16		2	/* Direct 16 bit */
-#define R_TILEPRO_8		3	/* Direct 8 bit */
-#define R_TILEPRO_32_PCREL	4	/* PC relative 32 bit */
-#define R_TILEPRO_16_PCREL	5	/* PC relative 16 bit */
-#define R_TILEPRO_8_PCREL	6	/* PC relative 8 bit */
-#define R_TILEPRO_LO16		7	/* Low 16 bit */
-#define R_TILEPRO_HI16		8	/* High 16 bit */
-#define R_TILEPRO_HA16		9	/* High 16 bit, adjusted */
-#define R_TILEPRO_COPY		10	/* Copy relocation */
-#define R_TILEPRO_GLOB_DAT	11	/* Create GOT entry */
-#define R_TILEPRO_JMP_SLOT	12	/* Create PLT entry */
-#define R_TILEPRO_RELATIVE	13	/* Adjust by program base */
-#define R_TILEPRO_BROFF_X1	14	/* X1 pipe branch offset */
-#define R_TILEPRO_JOFFLONG_X1	15	/* X1 pipe jump offset */
-#define R_TILEPRO_JOFFLONG_X1_PLT 16	/* X1 pipe jump offset to PLT */
-#define R_TILEPRO_IMM8_X0	17	/* X0 pipe 8-bit */
-#define R_TILEPRO_IMM8_Y0	18	/* Y0 pipe 8-bit */
-#define R_TILEPRO_IMM8_X1	19	/* X1 pipe 8-bit */
-#define R_TILEPRO_IMM8_Y1	20	/* Y1 pipe 8-bit */
-#define R_TILEPRO_MT_IMM15_X1	21	/* X1 pipe mtspr */
-#define R_TILEPRO_MF_IMM15_X1	22	/* X1 pipe mfspr */
-#define R_TILEPRO_IMM16_X0	23	/* X0 pipe 16-bit */
-#define R_TILEPRO_IMM16_X1	24	/* X1 pipe 16-bit */
-#define R_TILEPRO_IMM16_X0_LO	25	/* X0 pipe low 16-bit */
-#define R_TILEPRO_IMM16_X1_LO	26	/* X1 pipe low 16-bit */
-#define R_TILEPRO_IMM16_X0_HI	27	/* X0 pipe high 16-bit */
-#define R_TILEPRO_IMM16_X1_HI	28	/* X1 pipe high 16-bit */
-#define R_TILEPRO_IMM16_X0_HA	29	/* X0 pipe high 16-bit, adjusted */
-#define R_TILEPRO_IMM16_X1_HA	30	/* X1 pipe high 16-bit, adjusted */
-#define R_TILEPRO_IMM16_X0_PCREL 31	/* X0 pipe PC relative 16 bit */
-#define R_TILEPRO_IMM16_X1_PCREL 32	/* X1 pipe PC relative 16 bit */
-#define R_TILEPRO_IMM16_X0_LO_PCREL 33	/* X0 pipe PC relative low 16 bit */
-#define R_TILEPRO_IMM16_X1_LO_PCREL 34	/* X1 pipe PC relative low 16 bit */
-#define R_TILEPRO_IMM16_X0_HI_PCREL 35	/* X0 pipe PC relative high 16 bit */
-#define R_TILEPRO_IMM16_X1_HI_PCREL 36	/* X1 pipe PC relative high 16 bit */
-#define R_TILEPRO_IMM16_X0_HA_PCREL 37	/* X0 pipe PC relative ha() 16 bit */
-#define R_TILEPRO_IMM16_X1_HA_PCREL 38	/* X1 pipe PC relative ha() 16 bit */
-#define R_TILEPRO_IMM16_X0_GOT	39	/* X0 pipe 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X1_GOT	40	/* X1 pipe 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X0_GOT_LO 41	/* X0 pipe low 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X1_GOT_LO 42	/* X1 pipe low 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X0_GOT_HI 43	/* X0 pipe high 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X1_GOT_HI 44	/* X1 pipe high 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X0_GOT_HA 45	/* X0 pipe ha() 16-bit GOT offset */
-#define R_TILEPRO_IMM16_X1_GOT_HA 46	/* X1 pipe ha() 16-bit GOT offset */
-#define R_TILEPRO_MMSTART_X0	47	/* X0 pipe mm "start" */
-#define R_TILEPRO_MMEND_X0	48	/* X0 pipe mm "end" */
-#define R_TILEPRO_MMSTART_X1	49	/* X1 pipe mm "start" */
-#define R_TILEPRO_MMEND_X1	50	/* X1 pipe mm "end" */
-#define R_TILEPRO_SHAMT_X0	51	/* X0 pipe shift amount */
-#define R_TILEPRO_SHAMT_X1	52	/* X1 pipe shift amount */
-#define R_TILEPRO_SHAMT_Y0	53	/* Y0 pipe shift amount */
-#define R_TILEPRO_SHAMT_Y1	54	/* Y1 pipe shift amount */
-#define R_TILEPRO_DEST_IMM8_X1	55	/* X1 pipe destination 8-bit */
-/* Relocs 56-59 are currently not defined.  */
-#define R_TILEPRO_TLS_GD_CALL	60	/* "jal" for TLS GD */
-#define R_TILEPRO_IMM8_X0_TLS_GD_ADD 61	/* X0 pipe "addi" for TLS GD */
-#define R_TILEPRO_IMM8_X1_TLS_GD_ADD 62	/* X1 pipe "addi" for TLS GD */
-#define R_TILEPRO_IMM8_Y0_TLS_GD_ADD 63	/* Y0 pipe "addi" for TLS GD */
-#define R_TILEPRO_IMM8_Y1_TLS_GD_ADD 64	/* Y1 pipe "addi" for TLS GD */
-#define R_TILEPRO_TLS_IE_LOAD	65	/* "lw_tls" for TLS IE */
-#define R_TILEPRO_IMM16_X0_TLS_GD 66	/* X0 pipe 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X1_TLS_GD 67	/* X1 pipe 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68	/* X0 pipe low 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69	/* X1 pipe low 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70	/* X0 pipe high 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71	/* X1 pipe high 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72	/* X0 pipe ha() 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73	/* X1 pipe ha() 16-bit TLS GD offset */
-#define R_TILEPRO_IMM16_X0_TLS_IE 74	/* X0 pipe 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X1_TLS_IE 75	/* X1 pipe 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76	/* X0 pipe low 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77	/* X1 pipe low 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78	/* X0 pipe high 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79	/* X1 pipe high 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80	/* X0 pipe ha() 16-bit TLS IE offset */
-#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81	/* X1 pipe ha() 16-bit TLS IE offset */
-#define R_TILEPRO_TLS_DTPMOD32	82	/* ID of module containing symbol */
-#define R_TILEPRO_TLS_DTPOFF32	83	/* Offset in TLS block */
-#define R_TILEPRO_TLS_TPOFF32	84	/* Offset in static TLS block */
-#define R_TILEPRO_IMM16_X0_TLS_LE 85	/* X0 pipe 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X1_TLS_LE 86	/* X1 pipe 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X0_TLS_LE_LO 87	/* X0 pipe low 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X1_TLS_LE_LO 88	/* X1 pipe low 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X0_TLS_LE_HI 89	/* X0 pipe high 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X1_TLS_LE_HI 90	/* X1 pipe high 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X0_TLS_LE_HA 91	/* X0 pipe ha() 16-bit TLS LE offset */
-#define R_TILEPRO_IMM16_X1_TLS_LE_HA 92	/* X1 pipe ha() 16-bit TLS LE offset */
-
-#define R_TILEPRO_GNU_VTINHERIT	128	/* GNU C++ vtable hierarchy */
-#define R_TILEPRO_GNU_VTENTRY	129	/* GNU C++ vtable member usage */
-
-#define R_TILEPRO_NUM		130
-
-
-/* TILE-Gx relocations.  */
-#define R_TILEGX_NONE		0	/* No reloc */
-#define R_TILEGX_64		1	/* Direct 64 bit */
-#define R_TILEGX_32		2	/* Direct 32 bit */
-#define R_TILEGX_16		3	/* Direct 16 bit */
-#define R_TILEGX_8		4	/* Direct 8 bit */
-#define R_TILEGX_64_PCREL	5	/* PC relative 64 bit */
-#define R_TILEGX_32_PCREL	6	/* PC relative 32 bit */
-#define R_TILEGX_16_PCREL	7	/* PC relative 16 bit */
-#define R_TILEGX_8_PCREL	8	/* PC relative 8 bit */
-#define R_TILEGX_HW0		9	/* hword 0 16-bit */
-#define R_TILEGX_HW1		10	/* hword 1 16-bit */
-#define R_TILEGX_HW2		11	/* hword 2 16-bit */
-#define R_TILEGX_HW3		12	/* hword 3 16-bit */
-#define R_TILEGX_HW0_LAST	13	/* last hword 0 16-bit */
-#define R_TILEGX_HW1_LAST	14	/* last hword 1 16-bit */
-#define R_TILEGX_HW2_LAST	15	/* last hword 2 16-bit */
-#define R_TILEGX_COPY		16	/* Copy relocation */
-#define R_TILEGX_GLOB_DAT	17	/* Create GOT entry */
-#define R_TILEGX_JMP_SLOT	18	/* Create PLT entry */
-#define R_TILEGX_RELATIVE	19	/* Adjust by program base */
-#define R_TILEGX_BROFF_X1	20	/* X1 pipe branch offset */
-#define R_TILEGX_JUMPOFF_X1	21	/* X1 pipe jump offset */
-#define R_TILEGX_JUMPOFF_X1_PLT	22	/* X1 pipe jump offset to PLT */
-#define R_TILEGX_IMM8_X0	23	/* X0 pipe 8-bit */
-#define R_TILEGX_IMM8_Y0	24	/* Y0 pipe 8-bit */
-#define R_TILEGX_IMM8_X1	25	/* X1 pipe 8-bit */
-#define R_TILEGX_IMM8_Y1	26	/* Y1 pipe 8-bit */
-#define R_TILEGX_DEST_IMM8_X1	27	/* X1 pipe destination 8-bit */
-#define R_TILEGX_MT_IMM14_X1	28	/* X1 pipe mtspr */
-#define R_TILEGX_MF_IMM14_X1	29	/* X1 pipe mfspr */
-#define R_TILEGX_MMSTART_X0	30	/* X0 pipe mm "start" */
-#define R_TILEGX_MMEND_X0	31	/* X0 pipe mm "end" */
-#define R_TILEGX_SHAMT_X0	32	/* X0 pipe shift amount */
-#define R_TILEGX_SHAMT_X1	33	/* X1 pipe shift amount */
-#define R_TILEGX_SHAMT_Y0	34	/* Y0 pipe shift amount */
-#define R_TILEGX_SHAMT_Y1	35	/* Y1 pipe shift amount */
-#define R_TILEGX_IMM16_X0_HW0	36	/* X0 pipe hword 0 */
-#define R_TILEGX_IMM16_X1_HW0	37	/* X1 pipe hword 0 */
-#define R_TILEGX_IMM16_X0_HW1	38	/* X0 pipe hword 1 */
-#define R_TILEGX_IMM16_X1_HW1	39	/* X1 pipe hword 1 */
-#define R_TILEGX_IMM16_X0_HW2	40	/* X0 pipe hword 2 */
-#define R_TILEGX_IMM16_X1_HW2	41	/* X1 pipe hword 2 */
-#define R_TILEGX_IMM16_X0_HW3	42	/* X0 pipe hword 3 */
-#define R_TILEGX_IMM16_X1_HW3	43	/* X1 pipe hword 3 */
-#define R_TILEGX_IMM16_X0_HW0_LAST 44	/* X0 pipe last hword 0 */
-#define R_TILEGX_IMM16_X1_HW0_LAST 45	/* X1 pipe last hword 0 */
-#define R_TILEGX_IMM16_X0_HW1_LAST 46	/* X0 pipe last hword 1 */
-#define R_TILEGX_IMM16_X1_HW1_LAST 47	/* X1 pipe last hword 1 */
-#define R_TILEGX_IMM16_X0_HW2_LAST 48	/* X0 pipe last hword 2 */
-#define R_TILEGX_IMM16_X1_HW2_LAST 49	/* X1 pipe last hword 2 */
-#define R_TILEGX_IMM16_X0_HW0_PCREL 50	/* X0 pipe PC relative hword 0 */
-#define R_TILEGX_IMM16_X1_HW0_PCREL 51	/* X1 pipe PC relative hword 0 */
-#define R_TILEGX_IMM16_X0_HW1_PCREL 52	/* X0 pipe PC relative hword 1 */
-#define R_TILEGX_IMM16_X1_HW1_PCREL 53	/* X1 pipe PC relative hword 1 */
-#define R_TILEGX_IMM16_X0_HW2_PCREL 54	/* X0 pipe PC relative hword 2 */
-#define R_TILEGX_IMM16_X1_HW2_PCREL 55	/* X1 pipe PC relative hword 2 */
-#define R_TILEGX_IMM16_X0_HW3_PCREL 56	/* X0 pipe PC relative hword 3 */
-#define R_TILEGX_IMM16_X1_HW3_PCREL 57	/* X1 pipe PC relative hword 3 */
-#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL 58 /* X0 pipe PC-rel last hword 0 */
-#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL 59 /* X1 pipe PC-rel last hword 0 */
-#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL 60 /* X0 pipe PC-rel last hword 1 */
-#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL 61 /* X1 pipe PC-rel last hword 1 */
-#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL 62 /* X0 pipe PC-rel last hword 2 */
-#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */
-#define R_TILEGX_IMM16_X0_HW0_GOT 64	/* X0 pipe hword 0 GOT offset */
-#define R_TILEGX_IMM16_X1_HW0_GOT 65	/* X1 pipe hword 0 GOT offset */
-#define R_TILEGX_IMM16_X0_HW0_PLT_PCREL 66 /* X0 pipe PC-rel PLT hword 0 */
-#define R_TILEGX_IMM16_X1_HW0_PLT_PCREL 67 /* X1 pipe PC-rel PLT hword 0 */
-#define R_TILEGX_IMM16_X0_HW1_PLT_PCREL 68 /* X0 pipe PC-rel PLT hword 1 */
-#define R_TILEGX_IMM16_X1_HW1_PLT_PCREL 69 /* X1 pipe PC-rel PLT hword 1 */
-#define R_TILEGX_IMM16_X0_HW2_PLT_PCREL 70 /* X0 pipe PC-rel PLT hword 2 */
-#define R_TILEGX_IMM16_X1_HW2_PLT_PCREL 71 /* X1 pipe PC-rel PLT hword 2 */
-#define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */
-#define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */
-#define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */
-#define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */
-#define R_TILEGX_IMM16_X0_HW3_PLT_PCREL 76 /* X0 pipe PC-rel PLT hword 3 */
-#define R_TILEGX_IMM16_X1_HW3_PLT_PCREL 77 /* X1 pipe PC-rel PLT hword 3 */
-#define R_TILEGX_IMM16_X0_HW0_TLS_GD 78	/* X0 pipe hword 0 TLS GD offset */
-#define R_TILEGX_IMM16_X1_HW0_TLS_GD 79	/* X1 pipe hword 0 TLS GD offset */
-#define R_TILEGX_IMM16_X0_HW0_TLS_LE 80	/* X0 pipe hword 0 TLS LE offset */
-#define R_TILEGX_IMM16_X1_HW0_TLS_LE 81	/* X1 pipe hword 0 TLS LE offset */
-#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE 82 /* X0 pipe last hword 0 LE off */
-#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE 83 /* X1 pipe last hword 0 LE off */
-#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE 84 /* X0 pipe last hword 1 LE off */
-#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE 85 /* X1 pipe last hword 1 LE off */
-#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD 86 /* X0 pipe last hword 0 GD off */
-#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD 87 /* X1 pipe last hword 0 GD off */
-#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD 88 /* X0 pipe last hword 1 GD off */
-#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD 89 /* X1 pipe last hword 1 GD off */
-/* Relocs 90-91 are currently not defined.  */
-#define R_TILEGX_IMM16_X0_HW0_TLS_IE 92	/* X0 pipe hword 0 TLS IE offset */
-#define R_TILEGX_IMM16_X1_HW0_TLS_IE 93	/* X1 pipe hword 0 TLS IE offset */
-#define R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL 94 /* X0 pipe PC-rel PLT last hword 0 */
-#define R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL 95 /* X1 pipe PC-rel PLT last hword 0 */
-#define R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL 96 /* X0 pipe PC-rel PLT last hword 1 */
-#define R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL 97 /* X1 pipe PC-rel PLT last hword 1 */
-#define R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL 98 /* X0 pipe PC-rel PLT last hword 2 */
-#define R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL 99 /* X1 pipe PC-rel PLT last hword 2 */
-#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */
-#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */
-#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */
-#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE 103 /* X1 pipe last hword 1 IE off */
-/* Relocs 104-105 are currently not defined.  */
-#define R_TILEGX_TLS_DTPMOD64	106	/* 64-bit ID of symbol's module */
-#define R_TILEGX_TLS_DTPOFF64	107	/* 64-bit offset in TLS block */
-#define R_TILEGX_TLS_TPOFF64	108	/* 64-bit offset in static TLS block */
-#define R_TILEGX_TLS_DTPMOD32	109	/* 32-bit ID of symbol's module */
-#define R_TILEGX_TLS_DTPOFF32	110	/* 32-bit offset in TLS block */
-#define R_TILEGX_TLS_TPOFF32	111	/* 32-bit offset in static TLS block */
-#define R_TILEGX_TLS_GD_CALL	112	/* "jal" for TLS GD */
-#define R_TILEGX_IMM8_X0_TLS_GD_ADD 113	/* X0 pipe "addi" for TLS GD */
-#define R_TILEGX_IMM8_X1_TLS_GD_ADD 114	/* X1 pipe "addi" for TLS GD */
-#define R_TILEGX_IMM8_Y0_TLS_GD_ADD 115	/* Y0 pipe "addi" for TLS GD */
-#define R_TILEGX_IMM8_Y1_TLS_GD_ADD 116	/* Y1 pipe "addi" for TLS GD */
-#define R_TILEGX_TLS_IE_LOAD	117	/* "ld_tls" for TLS IE */
-#define R_TILEGX_IMM8_X0_TLS_ADD 118	/* X0 pipe "addi" for TLS GD/IE */
-#define R_TILEGX_IMM8_X1_TLS_ADD 119	/* X1 pipe "addi" for TLS GD/IE */
-#define R_TILEGX_IMM8_Y0_TLS_ADD 120	/* Y0 pipe "addi" for TLS GD/IE */
-#define R_TILEGX_IMM8_Y1_TLS_ADD 121	/* Y1 pipe "addi" for TLS GD/IE */
-
-#define R_TILEGX_GNU_VTINHERIT	128	/* GNU C++ vtable hierarchy */
-#define R_TILEGX_GNU_VTENTRY	129	/* GNU C++ vtable member usage */
-
-#define R_TILEGX_NUM		130
-
-/* BPF specific declarations.  */
-
-#define R_BPF_NONE		0	/* No reloc */
-#define R_BPF_MAP_FD		1	/* Map fd to pointer */
-
-/* Imagination Meta specific relocations. */
-
-#define R_METAG_HIADDR16	0
-#define R_METAG_LOADDR16	1
-#define R_METAG_ADDR32		2	/* 32bit absolute address */
-#define R_METAG_NONE		3	/* No reloc */
-#define R_METAG_RELBRANCH	4
-#define R_METAG_GETSETOFF	5
-
-/* Backward compatability */
-#define R_METAG_REG32OP1	6
-#define R_METAG_REG32OP2	7
-#define R_METAG_REG32OP3	8
-#define R_METAG_REG16OP1	9
-#define R_METAG_REG16OP2	10
-#define R_METAG_REG16OP3	11
-#define R_METAG_REG32OP4	12
-
-#define R_METAG_HIOG		13
-#define R_METAG_LOOG		14
-
-#define R_METAG_REL8		15
-#define R_METAG_REL16		16
-
-/* GNU */
-#define R_METAG_GNU_VTINHERIT	30
-#define R_METAG_GNU_VTENTRY	31
-
-/* PIC relocations */
-#define R_METAG_HI16_GOTOFF	32
-#define R_METAG_LO16_GOTOFF	33
-#define R_METAG_GETSET_GOTOFF	34
-#define R_METAG_GETSET_GOT	35
-#define R_METAG_HI16_GOTPC	36
-#define R_METAG_LO16_GOTPC	37
-#define R_METAG_HI16_PLT	38
-#define R_METAG_LO16_PLT	39
-#define R_METAG_RELBRANCH_PLT	40
-#define R_METAG_GOTOFF		41
-#define R_METAG_PLT		42
-#define R_METAG_COPY		43
-#define R_METAG_JMP_SLOT	44
-#define R_METAG_RELATIVE	45
-#define R_METAG_GLOB_DAT	46
-
-/* TLS relocations */
-#define R_METAG_TLS_GD		47
-#define R_METAG_TLS_LDM		48
-#define R_METAG_TLS_LDO_HI16	49
-#define R_METAG_TLS_LDO_LO16	50
-#define R_METAG_TLS_LDO		51
-#define R_METAG_TLS_IE		52
-#define R_METAG_TLS_IENONPIC	53
-#define R_METAG_TLS_IENONPIC_HI16 54
-#define R_METAG_TLS_IENONPIC_LO16 55
-#define R_METAG_TLS_TPOFF	56
-#define R_METAG_TLS_DTPMOD	57
-#define R_METAG_TLS_DTPOFF	58
-#define R_METAG_TLS_LE		59
-#define R_METAG_TLS_LE_HI16	60
-#define R_METAG_TLS_LE_LO16	61
-
-__END_DECLS
-
-#endif	/* elf.h */
diff --git a/elf/enbl-secure.c b/elf/enbl-secure.c
deleted file mode 100644
index c0723774d9..0000000000
--- a/elf/enbl-secure.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Define and initialize the `__libc_enable_secure' flag.  Generic version.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This file is used in the static libc.  For the shared library,
-   dl-sysdep.c defines and initializes __libc_enable_secure.  */
-
-#include <unistd.h>
-#include <libc-internal.h>
-
-/* If nonzero __libc_enable_secure is already set.  */
-int __libc_enable_secure_decided;
-/* Safest assumption, if somehow the initializer isn't run.  */
-int __libc_enable_secure = 1;
-
-void
-__libc_init_secure (void)
-{
-  if (__libc_enable_secure_decided == 0)
-    __libc_enable_secure = (__geteuid () != __getuid ()
-			    || __getegid () != __getgid ());
-}
diff --git a/elf/failobj.c b/elf/failobj.c
deleted file mode 100644
index 500606382e..0000000000
--- a/elf/failobj.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* This function is supposed to not exist.  */
-extern int xyzzy (int);
-
-extern int foo (int);
-
-int
-foo (int a)
-{
-  return xyzzy (a);
-}
diff --git a/elf/filter.c b/elf/filter.c
deleted file mode 100644
index 46aa15ba16..0000000000
--- a/elf/filter.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <mcheck.h>
-#include <stdio.h>
-#include <string.h>
-
-extern const char *foo (void);
-
-int
-main (void)
-{
-  const char *s;
-
-  mtrace ();
-
-  s = foo ();
-
-  printf ("called `foo' from `%s'\n", s);
-
-  return strcmp (s, "filtmod2.c");
-}
diff --git a/elf/filtmod1.c b/elf/filtmod1.c
deleted file mode 100644
index 1d9b19481d..0000000000
--- a/elf/filtmod1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern const char *foo (void);
-
-const char *
-foo (void)
-{
-  return __FILE__;
-}
diff --git a/elf/filtmod2.c b/elf/filtmod2.c
deleted file mode 100644
index 1d9b19481d..0000000000
--- a/elf/filtmod2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern const char *foo (void);
-
-const char *
-foo (void)
-{
-  return __FILE__;
-}
diff --git a/elf/firstobj.c b/elf/firstobj.c
deleted file mode 100644
index 2e6033eab6..0000000000
--- a/elf/firstobj.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <errno.h>
-
-extern int foo (void);
-
-int
-foo (void)
-{
-  errno = 0;
-  return 0;
-}
diff --git a/elf/gen-trusted-dirs.awk b/elf/gen-trusted-dirs.awk
deleted file mode 100644
index 59f10a4856..0000000000
--- a/elf/gen-trusted-dirs.awk
+++ /dev/null
@@ -1,37 +0,0 @@
-BEGIN {
-  FS = " ";
-}
-
-{
-  for (i = 1; i <= NF; ++i) {
-    s[cnt++] = $i"/";
-  }
-}
-
-END {
-  printf ("#define SYSTEM_DIRS \\\n");
-
-  printf ("  \"%s\"", s[0]);
-
-  for (i = 1; i < cnt; ++i) {
-    printf (" \"\\0\" \"%s\"", s[i]);
-  }
-
-  printf ("\n\n");
-
-  printf ("#define SYSTEM_DIRS_LEN \\\n");
-
-  printf ("  %d", length (s[0]));
-  m = length (s[0]);
-
-  for (i = 1; i < cnt; ++i) {
-    printf (", %d", length(s[i]));
-    if (length(s[i]) > m) {
-      m = length(s[i]);
-    }
-  }
-
-  printf ("\n\n");
-
-  printf ("#define SYSTEM_DIRS_MAX_LEN\t%d\n", m);
-}
diff --git a/elf/genrtldtbl.awk b/elf/genrtldtbl.awk
deleted file mode 100644
index 0e2a374901..0000000000
--- a/elf/genrtldtbl.awk
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/awk
-BEGIN {
-  FS=":";
-  count=0;
-}
-{
-  for (i = 1; i <= NF; ++i) {
-    gsub (/\/*$/, "", $i);
-    dir[count++] = $i;
-  }
-}
-END {
-  for (i = 0; i < count; ++i) {
-    printf ("static struct r_search_path_elem rtld_search_dir%d =\n", i+1);
-    printf ("  { \"%s/\", %d, unknown, 0, nonexisting, NULL, NULL, ",
-	    dir[i], length (dir[i]) + 1);
-    if (i== 0)
-      printf ("NULL };\n");
-    else
-      printf ("&rtld_search_dir%d };\n", i);
-  }
-  printf ("\nstatic struct r_search_path_elem *rtld_search_dirs[] =\n{\n");
-  for (i = 0; i < count; ++i) {
-    printf ("  &rtld_search_dir%d,\n", i + 1);
-  }
-  printf ("  NULL\n};\n\n");
-  printf ("static struct r_search_path_elem *all_dirs = &rtld_search_dir%d;\n",
-	  count);
-}
diff --git a/elf/get-dynamic-info.h b/elf/get-dynamic-info.h
deleted file mode 100644
index 7525c3a5b2..0000000000
--- a/elf/get-dynamic-info.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/* Read the dynamic section at DYN and fill in INFO with indices DT_*.
-   Copyright (C) 2012-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This file is included multiple times and therefore lacks a header
-   file inclusion guard.  */
-
-#include <assert.h>
-#include <libc-diag.h>
-
-#ifndef RESOLVE_MAP
-static
-#else
-auto
-#endif
-inline void __attribute__ ((unused, always_inline))
-elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp)
-{
-  ElfW(Dyn) *dyn = l->l_ld;
-  ElfW(Dyn) **info;
-#if __ELF_NATIVE_CLASS == 32
-  typedef Elf32_Word d_tag_utype;
-#elif __ELF_NATIVE_CLASS == 64
-  typedef Elf64_Xword d_tag_utype;
-#endif
-
-#ifndef RTLD_BOOTSTRAP
-  if (dyn == NULL)
-    return;
-#endif
-
-  info = l->l_info;
-
-  while (dyn->d_tag != DT_NULL)
-    {
-      if ((d_tag_utype) dyn->d_tag < DT_NUM)
-	info[dyn->d_tag] = dyn;
-      else if (dyn->d_tag >= DT_LOPROC &&
-	       dyn->d_tag < DT_LOPROC + DT_THISPROCNUM)
-	{
-	  /* This does not violate the array bounds of l->l_info, but
-	     gcc 4.6 on sparc somehow does not see this.  */
-	  DIAG_PUSH_NEEDS_COMMENT;
-	  DIAG_IGNORE_NEEDS_COMMENT (4.6,
-				     "-Warray-bounds");
-	  info[dyn->d_tag - DT_LOPROC + DT_NUM] = dyn;
-	  DIAG_POP_NEEDS_COMMENT;
-	}
-      else if ((d_tag_utype) DT_VERSIONTAGIDX (dyn->d_tag) < DT_VERSIONTAGNUM)
-	info[VERSYMIDX (dyn->d_tag)] = dyn;
-      else if ((d_tag_utype) DT_EXTRATAGIDX (dyn->d_tag) < DT_EXTRANUM)
-	info[DT_EXTRATAGIDX (dyn->d_tag) + DT_NUM + DT_THISPROCNUM
-	     + DT_VERSIONTAGNUM] = dyn;
-      else if ((d_tag_utype) DT_VALTAGIDX (dyn->d_tag) < DT_VALNUM)
-	info[DT_VALTAGIDX (dyn->d_tag) + DT_NUM + DT_THISPROCNUM
-	     + DT_VERSIONTAGNUM + DT_EXTRANUM] = dyn;
-      else if ((d_tag_utype) DT_ADDRTAGIDX (dyn->d_tag) < DT_ADDRNUM)
-	info[DT_ADDRTAGIDX (dyn->d_tag) + DT_NUM + DT_THISPROCNUM
-	     + DT_VERSIONTAGNUM + DT_EXTRANUM + DT_VALNUM] = dyn;
-      ++dyn;
-    }
-
-#define DL_RO_DYN_TEMP_CNT	8
-
-#ifndef DL_RO_DYN_SECTION
-  /* Don't adjust .dynamic unnecessarily.  */
-  if (l->l_addr != 0)
-    {
-      ElfW(Addr) l_addr = l->l_addr;
-      int cnt = 0;
-
-# define ADJUST_DYN_INFO(tag) \
-      do								      \
-	if (info[tag] != NULL)						      \
-	  {								      \
-	    if (temp)							      \
-	      {								      \
-		temp[cnt].d_tag = info[tag]->d_tag;			      \
-		temp[cnt].d_un.d_ptr = info[tag]->d_un.d_ptr + l_addr;	      \
-		info[tag] = temp + cnt++;				      \
-	      }								      \
-	    else							      \
-	      info[tag]->d_un.d_ptr += l_addr;				      \
-	  }								      \
-      while (0)
-
-      ADJUST_DYN_INFO (DT_HASH);
-      ADJUST_DYN_INFO (DT_PLTGOT);
-      ADJUST_DYN_INFO (DT_STRTAB);
-      ADJUST_DYN_INFO (DT_SYMTAB);
-# if ! ELF_MACHINE_NO_RELA
-      ADJUST_DYN_INFO (DT_RELA);
-# endif
-# if ! ELF_MACHINE_NO_REL
-      ADJUST_DYN_INFO (DT_REL);
-# endif
-      ADJUST_DYN_INFO (DT_JMPREL);
-      ADJUST_DYN_INFO (VERSYMIDX (DT_VERSYM));
-      ADJUST_DYN_INFO (DT_ADDRTAGIDX (DT_GNU_HASH) + DT_NUM + DT_THISPROCNUM
-		       + DT_VERSIONTAGNUM + DT_EXTRANUM + DT_VALNUM);
-# undef ADJUST_DYN_INFO
-      assert (cnt <= DL_RO_DYN_TEMP_CNT);
-    }
-#endif
-  if (info[DT_PLTREL] != NULL)
-    {
-#if ELF_MACHINE_NO_RELA
-      assert (info[DT_PLTREL]->d_un.d_val == DT_REL);
-#elif ELF_MACHINE_NO_REL
-      assert (info[DT_PLTREL]->d_un.d_val == DT_RELA);
-#else
-      assert (info[DT_PLTREL]->d_un.d_val == DT_REL
-	      || info[DT_PLTREL]->d_un.d_val == DT_RELA);
-#endif
-    }
-#if ! ELF_MACHINE_NO_RELA
-  if (info[DT_RELA] != NULL)
-    assert (info[DT_RELAENT]->d_un.d_val == sizeof (ElfW(Rela)));
-# endif
-# if ! ELF_MACHINE_NO_REL
-  if (info[DT_REL] != NULL)
-    assert (info[DT_RELENT]->d_un.d_val == sizeof (ElfW(Rel)));
-#endif
-#ifdef RTLD_BOOTSTRAP
-  /* Only the bind now flags are allowed.  */
-  assert (info[VERSYMIDX (DT_FLAGS_1)] == NULL
-	  || (info[VERSYMIDX (DT_FLAGS_1)]->d_un.d_val & ~DF_1_NOW) == 0);
-  assert (info[DT_FLAGS] == NULL
-	  || (info[DT_FLAGS]->d_un.d_val & ~DF_BIND_NOW) == 0);
-  /* Flags must not be set for ld.so.  */
-  assert (info[DT_RUNPATH] == NULL);
-  assert (info[DT_RPATH] == NULL);
-#else
-  if (info[DT_FLAGS] != NULL)
-    {
-      /* Flags are used.  Translate to the old form where available.
-	 Since these l_info entries are only tested for NULL pointers it
-	 is ok if they point to the DT_FLAGS entry.  */
-      l->l_flags = info[DT_FLAGS]->d_un.d_val;
-
-      if (l->l_flags & DF_SYMBOLIC)
-	info[DT_SYMBOLIC] = info[DT_FLAGS];
-      if (l->l_flags & DF_TEXTREL)
-	info[DT_TEXTREL] = info[DT_FLAGS];
-      if (l->l_flags & DF_BIND_NOW)
-	info[DT_BIND_NOW] = info[DT_FLAGS];
-    }
-  if (info[VERSYMIDX (DT_FLAGS_1)] != NULL)
-    {
-      l->l_flags_1 = info[VERSYMIDX (DT_FLAGS_1)]->d_un.d_val;
-
-      /* Only DT_1_SUPPORTED_MASK bits are supported, and we would like
-	 to assert this, but we can't. Users have been setting
-	 unsupported DF_1_* flags for a long time and glibc has ignored
-	 them. Therefore to avoid breaking existing applications the
-	 best we can do is add a warning during debugging with the
-	 intent of notifying the user of the problem.  */
-      if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0)
-	  && l->l_flags_1 & ~DT_1_SUPPORTED_MASK)
-	_dl_debug_printf ("\nWARNING: Unsupported flag value(s) of 0x%x in DT_FLAGS_1.\n",
-			  l->l_flags_1 & ~DT_1_SUPPORTED_MASK);
-
-      if (l->l_flags_1 & DF_1_NOW)
-	info[DT_BIND_NOW] = info[VERSYMIDX (DT_FLAGS_1)];
-    }
-  if (info[DT_RUNPATH] != NULL)
-    /* If both RUNPATH and RPATH are given, the latter is ignored.  */
-    info[DT_RPATH] = NULL;
-#endif
-}
diff --git a/elf/global.c b/elf/global.c
deleted file mode 100644
index c675858b64..0000000000
--- a/elf/global.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern int test (void);
-
-int
-main (void)
-{
-  return test ();
-}
diff --git a/elf/globalmod1.c b/elf/globalmod1.c
deleted file mode 100644
index 3f80822269..0000000000
--- a/elf/globalmod1.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-extern int test (void);
-
-int
-test (void)
-{
-  (void) dlopen ("reldepmod4.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (dlsym (RTLD_DEFAULT, "call_me") != NULL)
-    {
-      puts ("found \"call_me\"");
-      return 0;
-    }
-  puts ("didn't find \"call_me\"");
-  return 1;
-}
diff --git a/elf/ifuncdep1.c b/elf/ifuncdep1.c
deleted file mode 100644
index 77d663dcec..0000000000
--- a/elf/ifuncdep1.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols without -fPIC.  */
-
-#include "ifuncmod1.c"
diff --git a/elf/ifuncdep1pic.c b/elf/ifuncdep1pic.c
deleted file mode 100644
index b6381e4868..0000000000
--- a/elf/ifuncdep1pic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC.  */
-
-#include "ifuncmod1.c"
diff --git a/elf/ifuncdep2.c b/elf/ifuncdep2.c
deleted file mode 100644
index d87d61d5be..0000000000
--- a/elf/ifuncdep2.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Test 3 STT_GNU_IFUNC symbols.  */
-
-#include "ifunc-sel.h"
-
-int global = -1;
-/* Can't use __attribute__((visibility("protected"))) until the GCC bug:
-
-   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248
-
-   is fixed.  */
-asm (".protected global");
-
-static int
-one (void)
-{
-  return 1;
-}
-
-static int
-minus_one (void)
-{
-  return -1;
-}
-
-static int
-zero (void)
-{
-  return 0;
-}
-
-void * foo1_ifunc (void) __asm__ ("foo1");
-__asm__(".type foo1, %gnu_indirect_function");
-
-void *
-inhibit_stack_protector
-foo1_ifunc (void)
-{
-  return ifunc_sel (one, minus_one, zero);
-}
-
-void * foo2_ifunc (void) __asm__ ("foo2");
-__asm__(".type foo2, %gnu_indirect_function");
-
-void *
-inhibit_stack_protector
-foo2_ifunc (void)
-{
-  return ifunc_sel (minus_one, one, zero);
-}
-
-void * foo3_ifunc (void) __asm__ ("foo3");
-__asm__(".type foo3, %gnu_indirect_function");
-
-void *
-inhibit_stack_protector
-foo3_ifunc (void)
-{
-  return ifunc_sel (one, zero, minus_one);
-}
diff --git a/elf/ifuncdep2pic.c b/elf/ifuncdep2pic.c
deleted file mode 100644
index a84253dbc4..0000000000
--- a/elf/ifuncdep2pic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC.  */
-
-#include "ifuncdep2.c"
diff --git a/elf/ifuncdep5.c b/elf/ifuncdep5.c
deleted file mode 100644
index f26234336e..0000000000
--- a/elf/ifuncdep5.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols without -fPIC.  */
-
-#include "ifuncmod5.c"
diff --git a/elf/ifuncdep5pic.c b/elf/ifuncdep5pic.c
deleted file mode 100644
index 3edb3a07c6..0000000000
--- a/elf/ifuncdep5pic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC.  */
-
-#include "ifuncmod5.c"
diff --git a/elf/ifuncmain1.c b/elf/ifuncmain1.c
deleted file mode 100644
index 747fc02648..0000000000
--- a/elf/ifuncmain1.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Test STT_GNU_IFUNC symbols:
-
-   1. Direct function call.
-   2. Function pointer.
-   3. Visibility without override.
- */
-
-#include <stdlib.h>
-
-int ret_foo;
-int ret_foo_hidden;
-int ret_foo_protected;
-
-extern int foo (void);
-extern int foo_protected (void);
-
-#ifndef FOO_P
-typedef int (*foo_p) (void);
-#endif
-
-foo_p foo_ptr = foo;
-foo_p foo_procted_ptr = foo_protected;
-
-extern foo_p get_foo_p (void);
-extern foo_p get_foo_hidden_p (void);
-extern foo_p get_foo_protected_p (void);
-
-int
-main (void)
-{
-  foo_p p;
-
-  if (foo_ptr != foo)
-    abort ();
-  if (foo () != -1)
-    abort ();
-  if ((*foo_ptr) () != -1)
-    abort ();
-
-  if (foo_procted_ptr != foo_protected)
-    abort ();
-  if (foo_protected () != 0)
-    abort ();
-  if ((*foo_procted_ptr) () != 0)
-    abort ();
-
-  p = get_foo_p ();
-  if (p != foo)
-    abort ();
-  if (ret_foo != -1 || (*p) () != ret_foo)
-    abort ();
-
-  p = get_foo_hidden_p ();
-  if (ret_foo_hidden != 1 || (*p) () != ret_foo_hidden)
-    abort ();
-
-  p = get_foo_protected_p ();
-  if (p != foo_protected)
-    abort ();
-  if (ret_foo_protected != 0 || (*p) () != ret_foo_protected)
-    abort ();
-
-  return 0;
-}
diff --git a/elf/ifuncmain1pic.c b/elf/ifuncmain1pic.c
deleted file mode 100644
index db19dc9678..0000000000
--- a/elf/ifuncmain1pic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC.  */
-
-#include "ifuncmain1.c"
diff --git a/elf/ifuncmain1picstatic.c b/elf/ifuncmain1picstatic.c
deleted file mode 100644
index c937933029..0000000000
--- a/elf/ifuncmain1picstatic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC and -static.  */
-
-#include "ifuncmain1.c"
diff --git a/elf/ifuncmain1pie.c b/elf/ifuncmain1pie.c
deleted file mode 100644
index c16ef6dd09..0000000000
--- a/elf/ifuncmain1pie.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with PIE.  */
-
-#include "ifuncmain1.c"
diff --git a/elf/ifuncmain1static.c b/elf/ifuncmain1static.c
deleted file mode 100644
index fdd1e09024..0000000000
--- a/elf/ifuncmain1static.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -static.  */
-
-#include "ifuncmain1.c"
diff --git a/elf/ifuncmain1staticpic.c b/elf/ifuncmain1staticpic.c
deleted file mode 100644
index 39e0cbb4b8..0000000000
--- a/elf/ifuncmain1staticpic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC and no DSO.  */
-
-#include "ifuncmain1.c"
diff --git a/elf/ifuncmain1staticpie.c b/elf/ifuncmain1staticpie.c
deleted file mode 100644
index 4891114260..0000000000
--- a/elf/ifuncmain1staticpie.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with PIE and no DSO.  */
-
-#include "ifuncmain1.c"
diff --git a/elf/ifuncmain1vis.c b/elf/ifuncmain1vis.c
deleted file mode 100644
index d35e2f81fc..0000000000
--- a/elf/ifuncmain1vis.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Test STT_GNU_IFUNC symbols:
-
-   1. Direct function call.
-   2. Function pointer.
-   3. Visibility with override.
- */
-
-#include <stdlib.h>
-
-int ret_foo;
-int ret_foo_hidden;
-int ret_foo_protected;
-
-extern int foo (void);
-extern int foo_protected (void);
-
-#ifndef FOO_P
-typedef int (*foo_p) (void);
-#endif
-
-foo_p foo_ptr = foo;
-foo_p foo_procted_ptr = foo_protected;
-
-extern foo_p get_foo_p (void);
-extern foo_p get_foo_hidden_p (void);
-extern foo_p get_foo_protected_p (void);
-
-int
-__attribute__ ((noinline))
-foo (void)
-{
-  return -30;
-}
-
-int
-__attribute__ ((noinline))
-foo_hidden (void)
-{
-  return -20;
-}
-
-int
-__attribute__ ((noinline))
-foo_protected (void)
-{
-  return -40;
-}
-
-int
-main (void)
-{
-  foo_p p;
-
-  if (foo_ptr != foo)
-    abort ();
-  if ((*foo_ptr) () != -30)
-    abort ();
-
-  if (foo_procted_ptr != foo_protected)
-    abort ();
-  if ((*foo_procted_ptr) () != -40)
-    abort ();
-
-  p = get_foo_p ();
-  if (p != foo)
-    abort ();
-  if (foo () != -30)
-    abort ();
-  if (ret_foo != -30 || (*p) () != ret_foo)
-    abort ();
-
-  p = get_foo_hidden_p ();
-  if (foo_hidden () != -20)
-    abort ();
-  if (ret_foo_hidden != 1 || (*p) () != ret_foo_hidden)
-    abort ();
-
-  p = get_foo_protected_p ();
-  if (p == foo_protected)
-    abort ();
-  if (foo_protected () != -40)
-    abort ();
-  if (ret_foo_protected != 0 || (*p) () != ret_foo_protected)
-    abort ();
-
-  return 0;
-}
diff --git a/elf/ifuncmain1vispic.c b/elf/ifuncmain1vispic.c
deleted file mode 100644
index f8c104d560..0000000000
--- a/elf/ifuncmain1vispic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC.  */
-
-#include "ifuncmain1vis.c"
diff --git a/elf/ifuncmain1vispie.c b/elf/ifuncmain1vispie.c
deleted file mode 100644
index ad06d2ba1c..0000000000
--- a/elf/ifuncmain1vispie.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with PIE.  */
-
-#include "ifuncmain1vis.c"
diff --git a/elf/ifuncmain2.c b/elf/ifuncmain2.c
deleted file mode 100644
index db3ba56a02..0000000000
--- a/elf/ifuncmain2.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* Test calling one STT_GNU_IFUNC function with 3 different
-   STT_GNU_IFUNC definitions.  */
-
-#include <stdlib.h>
-
-extern int foo1 (void);
-
-int
-main (void)
-{
-  if (foo1 () != -1)
-    abort ();
-  return 0;
-}
diff --git a/elf/ifuncmain2pic.c b/elf/ifuncmain2pic.c
deleted file mode 100644
index 0006012a96..0000000000
--- a/elf/ifuncmain2pic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC.  */
-
-#include "ifuncmain2.c"
diff --git a/elf/ifuncmain2picstatic.c b/elf/ifuncmain2picstatic.c
deleted file mode 100644
index 3e89db536d..0000000000
--- a/elf/ifuncmain2picstatic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC and -static.  */
-
-#include "ifuncmain2.c"
diff --git a/elf/ifuncmain2static.c b/elf/ifuncmain2static.c
deleted file mode 100644
index 6932ae8066..0000000000
--- a/elf/ifuncmain2static.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -static.  */
-
-#include "ifuncmain2.c"
diff --git a/elf/ifuncmain3.c b/elf/ifuncmain3.c
deleted file mode 100644
index 1574dd5cbe..0000000000
--- a/elf/ifuncmain3.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with dlopen:
-
-   1. Direct function call.
-   2. Function pointer.
-   3. Visibility with override.
- */
-
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-typedef int (*foo_p) (void);
-
-int
-__attribute__ ((noinline))
-foo (void)
-{
-  return -30;
-}
-
-int
-__attribute__ ((noinline))
-foo_hidden (void)
-{
-  return -20;
-}
-
-int
-__attribute__ ((noinline))
-foo_protected (void)
-{
-  return -40;
-}
-
-int
-main (void)
-{
-  foo_p p;
-  foo_p (*f) (void);
-  int *ret;
-
-  void *h = dlopen ("ifuncmod3.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("cannot load: %s\n", dlerror ());
-      return 1;
-    }
-
-  p = dlsym (h, "foo");
-  if (p == NULL)
-    {
-      printf ("symbol not found: %s\n", dlerror ());
-      return 1;
-    }
-  if ((*p) () != -1)
-    abort ();
-
-  f = dlsym (h, "get_foo_p");
-  if (f == NULL)
-    {
-      printf ("symbol not found: %s\n", dlerror ());
-      return 1;
-    }
-
-  ret = dlsym (h, "ret_foo");
-  if (ret == NULL)
-    {
-      printf ("symbol not found: %s\n", dlerror ());
-      return 1;
-    }
-
-  p = (*f) ();
-  if (p != foo)
-    abort ();
-  if (foo () != -30)
-    abort ();
-  if (*ret != -30 || (*p) () != *ret)
-    abort ();
-
-  f = dlsym (h, "get_foo_hidden_p");
-  if (f == NULL)
-    {
-      printf ("symbol not found: %s\n", dlerror ());
-      return 1;
-    }
-
-  ret = dlsym (h, "ret_foo_hidden");
-  if (ret == NULL)
-    {
-      printf ("symbol not found: %s\n", dlerror ());
-      return 1;
-    }
-
-  p = (*f) ();
-  if (foo_hidden () != -20)
-    abort ();
-  if (*ret != 1 || (*p) () != *ret)
-    abort ();
-
-  f = dlsym (h, "get_foo_protected_p");
-  if (f == NULL)
-    {
-      printf ("symbol not found: %s\n", dlerror ());
-      return 1;
-    }
-
-  ret = dlsym (h, "ret_foo_protected");
-  if (ret == NULL)
-    {
-      printf ("symbol not found: %s\n", dlerror ());
-      return 1;
-    }
-
-  p = (*f) ();
-  if (p == foo_protected)
-    abort ();
-  if (foo_protected () != -40)
-    abort ();
-  if (*ret != 0 || (*p) () != *ret)
-    abort ();
-
-  if (dlclose (h) != 0)
-    {
-      printf ("cannot close: %s\n", dlerror ());
-      return 1;
-    }
-
-  return 0;
-}
diff --git a/elf/ifuncmain4.c b/elf/ifuncmain4.c
deleted file mode 100644
index e55fee2eb3..0000000000
--- a/elf/ifuncmain4.c
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Test STT_GNU_IFUNC symbols in a single source file.  */
-
-#include "ifuncmod1.c"
-#include "ifuncmain1.c"
diff --git a/elf/ifuncmain4picstatic.c b/elf/ifuncmain4picstatic.c
deleted file mode 100644
index 977d7f97fc..0000000000
--- a/elf/ifuncmain4picstatic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC and -static.  */
-
-#include "ifuncmain4.c"
diff --git a/elf/ifuncmain4static.c b/elf/ifuncmain4static.c
deleted file mode 100644
index c399977013..0000000000
--- a/elf/ifuncmain4static.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -static.  */
-
-#include "ifuncmain4.c"
diff --git a/elf/ifuncmain5.c b/elf/ifuncmain5.c
deleted file mode 100644
index f398085cb4..0000000000
--- a/elf/ifuncmain5.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with dynamic function pointer only.  */
-
-#include <stdlib.h>
-
-extern int foo (void);
-extern int foo_protected (void);
-
-typedef int (*foo_p) (void);
-
-foo_p
-__attribute__ ((noinline))
-get_foo (void)
-{
-  return foo;
-}
-
-foo_p
-__attribute__ ((noinline))
-get_foo_protected (void)
-{
-  return foo_protected;
-}
-
-int
-main (void)
-{
-  foo_p p;
-
-  p = get_foo ();
-  if ((*p) () != -1)
-    abort ();
-
-  p = get_foo_protected ();
-  if ((*p) () != 0)
-    abort ();
-
-  return 0;
-}
diff --git a/elf/ifuncmain5pic.c b/elf/ifuncmain5pic.c
deleted file mode 100644
index e9144fbb20..0000000000
--- a/elf/ifuncmain5pic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC.  */
-
-#include "ifuncmain5.c"
diff --git a/elf/ifuncmain5picstatic.c b/elf/ifuncmain5picstatic.c
deleted file mode 100644
index a0afe905d7..0000000000
--- a/elf/ifuncmain5picstatic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC and -static.  */
-
-#include "ifuncmain5.c"
diff --git a/elf/ifuncmain5pie.c b/elf/ifuncmain5pie.c
deleted file mode 100644
index 669f31eeda..0000000000
--- a/elf/ifuncmain5pie.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with PIE.  */
-
-#include "ifuncmain5.c"
diff --git a/elf/ifuncmain5static.c b/elf/ifuncmain5static.c
deleted file mode 100644
index 72504404a5..0000000000
--- a/elf/ifuncmain5static.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -static.  */
-
-#include "ifuncmain5.c"
diff --git a/elf/ifuncmain5staticpic.c b/elf/ifuncmain5staticpic.c
deleted file mode 100644
index 9e8bac254f..0000000000
--- a/elf/ifuncmain5staticpic.c
+++ /dev/null
@@ -1,3 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with -fPIC and no DSO.  */
-
-#include "ifuncmain5.c"
diff --git a/elf/ifuncmain6pie.c b/elf/ifuncmain6pie.c
deleted file mode 100644
index 04faeb86ef..0000000000
--- a/elf/ifuncmain6pie.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Test STT_GNU_IFUNC symbols in PIE:
-
-   1. Direct function call.
-   2. Function pointer.
-   3. Reference from a shared library.
- */
-
-#include <stdlib.h>
-#include "ifunc-sel.h"
-
-typedef int (*foo_p) (void);
-extern foo_p foo_ptr;
-
-static int
-one (void)
-{
-  return -30;
-}
-
-void * foo_ifunc (void) __asm__ ("foo");
-__asm__(".type foo, %gnu_indirect_function");
-
-void *
-inhibit_stack_protector
-foo_ifunc (void)
-{
-  return ifunc_one (one);
-}
-
-extern int foo (void);
-extern foo_p get_foo (void);
-extern foo_p get_foo_p (void);
-
-foo_p my_foo_ptr = foo;
-
-int
-main (void)
-{
-  foo_p p;
-
-  p = get_foo ();
-  if (p != foo)
-    abort ();
-  if ((*p) () != -30)
-    abort ();
-
-  p = get_foo_p ();
-  if (p != foo)
-    abort ();
-  if ((*p) () != -30)
-    abort ();
-
-  if (foo_ptr != foo)
-    abort ();
-  if (my_foo_ptr != foo)
-    abort ();
-  if ((*foo_ptr) () != -30)
-    abort ();
-  if ((*my_foo_ptr) () != -30)
-    abort ();
-  if (foo () != -30)
-    abort ();
-
-  return 0;
-}
diff --git a/elf/ifuncmain7.c b/elf/ifuncmain7.c
deleted file mode 100644
index 1e8f7ea38e..0000000000
--- a/elf/ifuncmain7.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Test local STT_GNU_IFUNC symbols:
-
-   1. Direct function call.
-   2. Function pointer.
- */
-
-#include <stdlib.h>
-#include "ifunc-sel.h"
-
-extern int foo (void);
-
-static int
-one (void)
-{
-  return -30;
-}
-
-static void * foo_ifunc (void) __asm__ ("foo");
-__asm__(".type foo, %gnu_indirect_function");
-
-static void *
-__attribute__ ((used))
-inhibit_stack_protector
-foo_ifunc (void)
-{
-  return ifunc_one (one);
-}
-
-typedef int (*foo_p) (void);
-
-foo_p foo_ptr = foo;
-
-foo_p
-__attribute__ ((noinline))
-get_foo_p (void)
-{
-  return foo_ptr;
-}
-
-foo_p
-__attribute__ ((noinline))
-get_foo (void)
-{
-  return foo;
-}
-
-int
-main (void)
-{
-  foo_p p;
-
-  p = get_foo ();
-  if (p != foo)
-    abort ();
-  if ((*p) () != -30)
-    abort ();
-
-  p = get_foo_p ();
-  if (p != foo)
-    abort ();
-  if ((*p) () != -30)
-    abort ();
-
-  if (foo_ptr != foo)
-    abort ();
-  if ((*foo_ptr) () != -30)
-    abort ();
-  if (foo () != -30)
-    abort ();
-
-  return 0;
-}
diff --git a/elf/ifuncmain7pic.c b/elf/ifuncmain7pic.c
deleted file mode 100644
index fc37bf4469..0000000000
--- a/elf/ifuncmain7pic.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Test local STT_GNU_IFUNC symbols with -fPIC:
-
-   1. Direct function call.
-   2. Function pointer.
- */
-
-#include "ifuncmain7.c"
diff --git a/elf/ifuncmain7picstatic.c b/elf/ifuncmain7picstatic.c
deleted file mode 100644
index baf8934b95..0000000000
--- a/elf/ifuncmain7picstatic.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Test local STT_GNU_IFUNC symbols with -fPIC and -static:
-
-   1. Direct function call.
-   2. Function pointer.
- */
-
-#include "ifuncmain7.c"
diff --git a/elf/ifuncmain7pie.c b/elf/ifuncmain7pie.c
deleted file mode 100644
index 254d453f1e..0000000000
--- a/elf/ifuncmain7pie.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Test local STT_GNU_IFUNC symbols with PIE:
-
-   1. Direct function call.
-   2. Function pointer.
- */
-
-#include "ifuncmain7.c"
diff --git a/elf/ifuncmain7static.c b/elf/ifuncmain7static.c
deleted file mode 100644
index e470d570ef..0000000000
--- a/elf/ifuncmain7static.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Test local STT_GNU_IFUNC symbols with -static:
-
-   1. Direct function call.
-   2. Function pointer.
- */
-
-#include "ifuncmain7.c"
diff --git a/elf/ifuncmod1.c b/elf/ifuncmod1.c
deleted file mode 100644
index f0bf5fb45f..0000000000
--- a/elf/ifuncmod1.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/* Test STT_GNU_IFUNC symbols:
-
-   1. Direct function call.
-   2. Function pointer.
-   3. Visibility.
- */
-#include "ifunc-sel.h"
-
-int global = -1;
-/* Can't use __attribute__((visibility("protected"))) until the GCC bug:
-
-   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248
-
-   is fixed.  */
-asm (".protected global");
-
-static int
-one (void)
-{
-  return 1;
-}
-
-static int
-minus_one (void)
-{
-  return -1;
-}
-
-static int
-zero (void)
-{
-  return 0;
-}
-
-void * foo_ifunc (void) __asm__ ("foo");
-__asm__(".type foo, %gnu_indirect_function");
-
-void *
-inhibit_stack_protector
-foo_ifunc (void)
-{
-  return ifunc_sel (one, minus_one, zero);
-}
-
-void * foo_hidden_ifunc (void) __asm__ ("foo_hidden");
-__asm__(".type foo_hidden, %gnu_indirect_function");
-
-void *
-inhibit_stack_protector
-foo_hidden_ifunc (void)
-{
-  return ifunc_sel (minus_one, one, zero);
-}
-
-void * foo_protected_ifunc (void) __asm__ ("foo_protected");
-__asm__(".type foo_protected, %gnu_indirect_function");
-
-void *
-inhibit_stack_protector
-foo_protected_ifunc (void)
-{
-  return ifunc_sel (one, zero, minus_one);
-}
-
-/* Test hidden indirect function.  */
-__asm__(".hidden foo_hidden");
-
-/* Test protected indirect function.  */
-__asm__(".protected foo_protected");
-
-extern int foo (void);
-extern int foo_hidden (void);
-extern int foo_protected (void);
-extern int ret_foo;
-extern int ret_foo_hidden;
-extern int ret_foo_protected;
-
-#define FOO_P
-typedef int (*foo_p) (void);
-
-foo_p
-get_foo_p (void)
-{
-  ret_foo = foo ();
-  return foo;
-}
-
-foo_p
-get_foo_hidden_p (void)
-{
-  ret_foo_hidden = foo_hidden ();
-  return foo_hidden;
-}
-
-foo_p
-get_foo_protected_p (void)
-{
-  ret_foo_protected = foo_protected ();
-  return foo_protected;
-}
diff --git a/elf/ifuncmod3.c b/elf/ifuncmod3.c
deleted file mode 100644
index ca2d962600..0000000000
--- a/elf/ifuncmod3.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Test STT_GNU_IFUNC symbols with dlopen.  */
-
-#include "ifuncmod1.c"
-
-int ret_foo;
-int ret_foo_hidden;
-int ret_foo_protected;
diff --git a/elf/ifuncmod5.c b/elf/ifuncmod5.c
deleted file mode 100644
index 5a957800e8..0000000000
--- a/elf/ifuncmod5.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Test STT_GNU_IFUNC symbols without direct function call.  */
-#include "ifunc-sel.h"
-
-int global = -1;
-/* Can't use __attribute__((visibility("protected"))) until the GCC bug:
-
-   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248
-
-   is fixed.  */
-asm (".protected global");
-
-static int
-one (void)
-{
-  return 1;
-}
-
-static int
-minus_one (void)
-{
-  return -1;
-}
-
-static int
-zero (void)
-{
-  return 0;
-}
-
-void * foo_ifunc (void) __asm__ ("foo");
-__asm__(".type foo, %gnu_indirect_function");
-
-void *
-inhibit_stack_protector
-foo_ifunc (void)
-{
-  return ifunc_sel (one, minus_one, zero);
-}
-
-void * foo_hidden_ifunc (void) __asm__ ("foo_hidden");
-__asm__(".type foo_hidden, %gnu_indirect_function");
-
-void *
-inhibit_stack_protector
-foo_hidden_ifunc (void)
-{
-  return ifunc_sel (minus_one, one, zero);
-}
-
-void * foo_protected_ifunc (void) __asm__ ("foo_protected");
-__asm__(".type foo_protected, %gnu_indirect_function");
-
-void *
-inhibit_stack_protector
-foo_protected_ifunc (void)
-{
-  return ifunc_sel (one, zero, minus_one);
-}
-
-/* Test hidden indirect function.  */
-__asm__(".hidden foo_hidden");
-
-/* Test protected indirect function.  */
-__asm__(".protected foo_protected");
diff --git a/elf/ifuncmod6.c b/elf/ifuncmod6.c
deleted file mode 100644
index 2e16c1d06d..0000000000
--- a/elf/ifuncmod6.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Test STT_GNU_IFUNC symbol reference in a shared library.  */
-
-extern int foo (void);
-
-typedef int (*foo_p) (void);
-
-foo_p foo_ptr = foo;
-
-foo_p
-get_foo_p (void)
-{
-  return foo_ptr;
-}
-
-foo_p
-get_foo (void)
-{
-  return foo;
-}
diff --git a/elf/initfirst.c b/elf/initfirst.c
deleted file mode 100644
index 5ca83d21bc..0000000000
--- a/elf/initfirst.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-main (void)
-{
-  void *h = dlopen ("firstobj.so", RTLD_LAZY);
-  void *f;
-  if (! h)
-    {
-      printf ("cannot find firstobj.so: %s\n", dlerror ());
-      return 1;
-    }
-  f = dlsym (h, "foo");
-  if (! f)
-    {
-      printf ("cannot find symbol foo: %s\n", dlerror ());
-      return 2;
-    }
-  ((void (*) (void)) f) ();
-  return 0;
-}
diff --git a/elf/interp.c b/elf/interp.c
deleted file mode 100644
index b6e8f04444..0000000000
--- a/elf/interp.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* interp - add information about dynamic loader to shared library objects.
-   Copyright (C) 1996-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <runtime-linker.h>
-
-const char __invoke_dynamic_linker__[] __attribute__ ((section (".interp")))
-  = RUNTIME_LINKER;
diff --git a/elf/lateglobal.c b/elf/lateglobal.c
deleted file mode 100644
index 4a1a7cd085..0000000000
--- a/elf/lateglobal.c
+++ /dev/null
@@ -1,47 +0,0 @@
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  void *h[2];
-  int fail;
-  int (*fp) (void);
-
-  mtrace ();
-
-  h[0] = dlopen ("ltglobmod1.so", RTLD_LAZY);
-  if (h[0] == NULL)
-    {
-      printf ("%s: cannot open %s: %s",
-	      __FUNCTION__, "ltglobmod1.so", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-  h[1] = dlopen ("ltglobmod2.so", RTLD_LAZY);
-  if (h[1] == NULL)
-    {
-      printf ("%s: cannot open %s: %s",
-	      __FUNCTION__, "ltglobmod2.so", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  puts ("loaded \"ltglobmod1.so\" without RTLD_GLOBAL");
-
-  fp = dlsym (h[1], "foo");
-  if (fp == NULL)
-    {
-      printf ("cannot get address of `foo': %s", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  fail = fp ();
-
-  puts ("back in main");
-
-  dlclose (h[1]);
-  dlclose (h[0]);
-
-  return fail;
-}
diff --git a/elf/ldconfig.c b/elf/ldconfig.c
deleted file mode 100644
index 99caf9e9bb..0000000000
--- a/elf/ldconfig.c
+++ /dev/null
@@ -1,1418 +0,0 @@
-/* Copyright (C) 1999-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Andreas Jaeger <aj@suse.de>, 1999.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published
-   by the Free Software Foundation; version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
-
-#define PROCINFO_CLASS static
-#include <alloca.h>
-#include <argp.h>
-#include <dirent.h>
-#include <elf.h>
-#include <error.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <libintl.h>
-#include <locale.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdio_ext.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <sys/fcntl.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <glob.h>
-#include <libgen.h>
-
-#include <ldconfig.h>
-#include <dl-cache.h>
-
-#include <dl-procinfo.h>
-
-#ifdef _DL_FIRST_PLATFORM
-# define _DL_FIRST_EXTRA (_DL_FIRST_PLATFORM + _DL_PLATFORMS_COUNT)
-#else
-# define _DL_FIRST_EXTRA _DL_HWCAP_COUNT
-#endif
-
-#ifndef LD_SO_CONF
-# define LD_SO_CONF SYSCONFDIR "/ld.so.conf"
-#endif
-
-/* Get libc version number.  */
-#include <version.h>
-
-#define PACKAGE _libc_intl_domainname
-
-static const struct
-{
-  const char *name;
-  int flag;
-} lib_types[] =
-{
-  {"libc4", FLAG_LIBC4},
-  {"libc5", FLAG_ELF_LIBC5},
-  {"libc6", FLAG_ELF_LIBC6},
-  {"glibc2", FLAG_ELF_LIBC6}
-};
-
-
-/* List of directories to handle.  */
-struct dir_entry
-{
-  char *path;
-  int flag;
-  ino64_t ino;
-  dev_t dev;
-  struct dir_entry *next;
-};
-
-/* The list is unsorted, contains no duplicates.  Entries are added at
-   the end.  */
-static struct dir_entry *dir_entries;
-
-/* Flags for different options.  */
-/* Print Cache.  */
-static int opt_print_cache;
-
-/* Be verbose.  */
-int opt_verbose;
-
-/* Format to support.  */
-/* 0: only libc5/glibc2; 1: both; 2: only glibc 2.2.  */
-int opt_format = 1;
-
-/* Build cache.  */
-static int opt_build_cache = 1;
-
-/* Enable symbolic link processing.  If set, create or update symbolic
-   links, and remove stale symbolic links.  */
-static int opt_link = 1;
-
-/* Only process directories specified on the command line.  */
-static int opt_only_cline;
-
-/* Path to root for chroot.  */
-static char *opt_chroot;
-
-/* Manually link given shared libraries.  */
-static int opt_manual_link;
-
-/* Should we ignore an old auxiliary cache file?  */
-static int opt_ignore_aux_cache;
-
-/* Cache file to use.  */
-static char *cache_file;
-
-/* Configuration file.  */
-static const char *config_file;
-
-/* Mask to use for important hardware capabilities.  */
-static unsigned long int hwcap_mask = HWCAP_IMPORTANT;
-
-/* Configuration-defined capabilities defined in kernel vDSOs.  */
-static const char *hwcap_extra[64 - _DL_FIRST_EXTRA];
-
-/* Name and version of program.  */
-static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *)
-     = print_version;
-
-/* Function to print some extra text in the help message.  */
-static char *more_help (int key, const char *text, void *input);
-
-/* Definitions of arguments for argp functions.  */
-static const struct argp_option options[] =
-{
-  { "print-cache", 'p', NULL, 0, N_("Print cache"), 0},
-  { "verbose", 'v', NULL, 0, N_("Generate verbose messages"), 0},
-  { NULL, 'N', NULL, 0, N_("Don't build cache"), 0},
-  { NULL, 'X', NULL, 0, N_("Don't update symbolic links"), 0},
-  { NULL, 'r', N_("ROOT"), 0, N_("Change to and use ROOT as root directory"), 0},
-  { NULL, 'C', N_("CACHE"), 0, N_("Use CACHE as cache file"), 0},
-  { NULL, 'f', N_("CONF"), 0, N_("Use CONF as configuration file"), 0},
-  { NULL, 'n', NULL, 0, N_("Only process directories specified on the command line.  Don't build cache."), 0},
-  { NULL, 'l', NULL, 0, N_("Manually link individual libraries."), 0},
-  { "format", 'c', N_("FORMAT"), 0, N_("Format to use: new, old or compat (default)"), 0},
-  { "ignore-aux-cache", 'i', NULL, 0, N_("Ignore auxiliary cache file"), 0},
-  { NULL, 0, NULL, 0, NULL, 0 }
-};
-
-#define PROCINFO_CLASS static
-#include <dl-procinfo.c>
-
-/* Short description of program.  */
-static const char doc[] = N_("Configure Dynamic Linker Run Time Bindings.");
-
-/* Prototype for option handler.  */
-static error_t parse_opt (int key, char *arg, struct argp_state *state);
-
-/* Data structure to communicate with argp functions.  */
-static struct argp argp =
-{
-  options, parse_opt, NULL, doc, NULL, more_help, NULL
-};
-
-/* Check if string corresponds to an important hardware capability or
-   a platform.  */
-static int
-is_hwcap_platform (const char *name)
-{
-  int hwcap_idx = _dl_string_hwcap (name);
-
-  /* Is this a normal hwcap for the machine like "fpu?"  */
-  if (hwcap_idx != -1 && ((1 << hwcap_idx) & hwcap_mask))
-    return 1;
-
-  /* Is this a platform pseudo-hwcap like "i686?"  */
-  hwcap_idx = _dl_string_platform (name);
-  if (hwcap_idx != -1)
-    return 1;
-
-  /* Is this one of the extra pseudo-hwcaps that we map beyond
-     _DL_FIRST_EXTRA like "tls", or "nosegneg?"  */
-  for (hwcap_idx = _DL_FIRST_EXTRA; hwcap_idx < 64; ++hwcap_idx)
-    if (hwcap_extra[hwcap_idx - _DL_FIRST_EXTRA] != NULL
-	&& !strcmp (name, hwcap_extra[hwcap_idx - _DL_FIRST_EXTRA]))
-      return 1;
-
-  return 0;
-}
-
-/* Get hwcap (including platform) encoding of path.  */
-static uint64_t
-path_hwcap (const char *path)
-{
-  char *str = xstrdup (path);
-  char *ptr;
-  uint64_t hwcap = 0;
-  uint64_t h;
-
-  size_t len;
-
-  len = strlen (str);
-  if (str[len] == '/')
-    str[len] = '\0';
-
-  /* Search pathname from the end and check for hwcap strings.  */
-  for (;;)
-    {
-      ptr = strrchr (str, '/');
-
-      if (ptr == NULL)
-	break;
-
-      h = _dl_string_hwcap (ptr + 1);
-
-      if (h == (uint64_t) -1)
-	{
-	  h = _dl_string_platform (ptr + 1);
-	  if (h == (uint64_t) -1)
-	    {
-	      for (h = _DL_FIRST_EXTRA; h < 64; ++h)
-		if (hwcap_extra[h - _DL_FIRST_EXTRA] != NULL
-		    && !strcmp (ptr + 1, hwcap_extra[h - _DL_FIRST_EXTRA]))
-		  break;
-	      if (h == 64)
-		break;
-	    }
-	}
-      hwcap += 1ULL << h;
-
-      /* Search the next part of the path.  */
-      *ptr = '\0';
-    }
-
-  free (str);
-  return hwcap;
-}
-
-/* Handle program arguments.  */
-static error_t
-parse_opt (int key, char *arg, struct argp_state *state)
-{
-  switch (key)
-    {
-    case 'C':
-      cache_file = arg;
-      /* Ignore auxiliary cache since we use non-standard cache.  */
-      opt_ignore_aux_cache = 1;
-      break;
-    case 'f':
-      config_file = arg;
-      break;
-    case 'i':
-      opt_ignore_aux_cache = 1;
-      break;
-    case 'l':
-      opt_manual_link = 1;
-      break;
-    case 'N':
-      opt_build_cache = 0;
-      break;
-    case 'n':
-      opt_build_cache = 0;
-      opt_only_cline = 1;
-      break;
-    case 'p':
-      opt_print_cache = 1;
-      break;
-    case 'r':
-      opt_chroot = arg;
-      break;
-    case 'v':
-      opt_verbose = 1;
-      break;
-    case 'X':
-      opt_link = 0;
-      break;
-    case 'c':
-      if (strcmp (arg, "old") == 0)
-	opt_format = 0;
-      else if (strcmp (arg, "compat") == 0)
-	opt_format = 1;
-      else if (strcmp (arg, "new") == 0)
-	opt_format = 2;
-      break;
-    default:
-      return ARGP_ERR_UNKNOWN;
-    }
-
-  return 0;
-}
-
-/* Print bug-reporting information in the help message.  */
-static char *
-more_help (int key, const char *text, void *input)
-{
-  char *tp = NULL;
-  switch (key)
-    {
-    case ARGP_KEY_HELP_EXTRA:
-      /* We print some extra information.  */
-      if (asprintf (&tp, gettext ("\
-For bug reporting instructions, please see:\n\
-%s.\n"), REPORT_BUGS_TO) < 0)
-	return NULL;
-      return tp;
-    default:
-      break;
-    }
-  return (char *) text;
-}
-
-/* Print the version information.  */
-static void
-print_version (FILE *stream, struct argp_state *state)
-{
-  fprintf (stream, "ldconfig %s%s\n", PKGVERSION, VERSION);
-  fprintf (stream, gettext ("\
-Copyright (C) %s Free Software Foundation, Inc.\n\
-This is free software; see the source for copying conditions.  There is NO\n\
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2017");
-  fprintf (stream, gettext ("Written by %s.\n"),
-	   "Andreas Jaeger");
-}
-
-/* Add a single directory entry.  */
-static void
-add_single_dir (struct dir_entry *entry, int verbose)
-{
-  struct dir_entry *ptr, *prev;
-
-  ptr = dir_entries;
-  prev = ptr;
-  while (ptr != NULL)
-    {
-      /* Check for duplicates.  */
-      if (ptr->ino == entry->ino && ptr->dev == entry->dev)
-	{
-	  if (opt_verbose && verbose)
-	    error (0, 0, _("Path `%s' given more than once"), entry->path);
-	  /* Use the newer information.  */
-	  ptr->flag = entry->flag;
-	  free (entry->path);
-	  free (entry);
-	  break;
-	}
-      prev = ptr;
-      ptr = ptr->next;
-    }
-  /* Is this the first entry?  */
-  if (ptr == NULL && dir_entries == NULL)
-    dir_entries = entry;
-  else if (ptr == NULL)
-    prev->next = entry;
-}
-
-/* Add one directory to the list of directories to process.  */
-static void
-add_dir (const char *line)
-{
-  unsigned int i;
-  struct dir_entry *entry = xmalloc (sizeof (struct dir_entry));
-  entry->next = NULL;
-
-  /* Search for an '=' sign.  */
-  entry->path = xstrdup (line);
-  char *equal_sign = strchr (entry->path, '=');
-  if (equal_sign)
-    {
-      *equal_sign = '\0';
-      ++equal_sign;
-      entry->flag = FLAG_ANY;
-      for (i = 0; i < sizeof (lib_types) / sizeof (lib_types[0]); ++i)
-	if (strcmp (equal_sign, lib_types[i].name) == 0)
-	  {
-	    entry->flag = lib_types[i].flag;
-	    break;
-	  }
-      if (entry->flag == FLAG_ANY)
-	error (0, 0, _("%s is not a known library type"), equal_sign);
-    }
-  else
-    {
-      entry->flag = FLAG_ANY;
-    }
-
-  /* Canonify path: for now only remove leading and trailing
-     whitespace and the trailing slashes.  */
-  i = strlen (entry->path);
-
-  while (i > 0 && isspace (entry->path[i - 1]))
-    entry->path[--i] = '\0';
-
-  while (i > 0 && entry->path[i - 1] == '/')
-    entry->path[--i] = '\0';
-
-  if (i == 0)
-    return;
-
-  char *path = entry->path;
-  if (opt_chroot)
-    path = chroot_canon (opt_chroot, path);
-
-  struct stat64 stat_buf;
-  if (path == NULL || stat64 (path, &stat_buf))
-    {
-      if (opt_verbose)
-	error (0, errno, _("Can't stat %s"), entry->path);
-      free (entry->path);
-      free (entry);
-    }
-  else
-    {
-      entry->ino = stat_buf.st_ino;
-      entry->dev = stat_buf.st_dev;
-
-      add_single_dir (entry, 1);
-    }
-
-  if (opt_chroot)
-    free (path);
-}
-
-
-static int
-chroot_stat (const char *real_path, const char *path, struct stat64 *st)
-{
-  int ret;
-  char *canon_path;
-
-  if (!opt_chroot)
-    return stat64 (real_path, st);
-
-  ret = lstat64 (real_path, st);
-  if (ret || !S_ISLNK (st->st_mode))
-    return ret;
-
-  canon_path = chroot_canon (opt_chroot, path);
-  if (canon_path == NULL)
-    return -1;
-
-  ret = stat64 (canon_path, st);
-  free (canon_path);
-  return ret;
-}
-
-/* Create a symbolic link from soname to libname in directory path.  */
-static void
-create_links (const char *real_path, const char *path, const char *libname,
-	      const char *soname)
-{
-  char *full_libname, *full_soname;
-  char *real_full_libname, *real_full_soname;
-  struct stat64 stat_lib, stat_so, lstat_so;
-  int do_link = 1;
-  int do_remove = 1;
-  /* XXX: The logics in this function should be simplified.  */
-
-  /* Get complete path.  */
-  full_libname = alloca (strlen (path) + strlen (libname) + 2);
-  full_soname = alloca (strlen (path) + strlen (soname) + 2);
-  sprintf (full_libname, "%s/%s", path, libname);
-  sprintf (full_soname, "%s/%s", path, soname);
-  if (opt_chroot)
-    {
-      real_full_libname = alloca (strlen (real_path) + strlen (libname) + 2);
-      real_full_soname = alloca (strlen (real_path) + strlen (soname) + 2);
-      sprintf (real_full_libname, "%s/%s", real_path, libname);
-      sprintf (real_full_soname, "%s/%s", real_path, soname);
-    }
-  else
-    {
-      real_full_libname = full_libname;
-      real_full_soname = full_soname;
-    }
-
-  /* Does soname already exist and point to the right library?  */
-  if (chroot_stat (real_full_soname, full_soname, &stat_so) == 0)
-    {
-      if (chroot_stat (real_full_libname, full_libname, &stat_lib))
-	{
-	  error (0, 0, _("Can't stat %s\n"), full_libname);
-	  return;
-	}
-      if (stat_lib.st_dev == stat_so.st_dev
-	  && stat_lib.st_ino == stat_so.st_ino)
-	/* Link is already correct.  */
-	do_link = 0;
-      else if (lstat64 (full_soname, &lstat_so) == 0
-	       && !S_ISLNK (lstat_so.st_mode))
-	{
-	  error (0, 0, _("%s is not a symbolic link\n"), full_soname);
-	  do_link = 0;
-	  do_remove = 0;
-	}
-    }
-  else if (lstat64 (real_full_soname, &lstat_so) != 0
-	   || !S_ISLNK (lstat_so.st_mode))
-    /* Unless it is a stale symlink, there is no need to remove.  */
-    do_remove = 0;
-
-  if (opt_verbose)
-    printf ("\t%s -> %s", soname, libname);
-
-  if (do_link && opt_link)
-    {
-      /* Remove old link.  */
-      if (do_remove)
-	if (unlink (real_full_soname))
-	  {
-	    error (0, 0, _("Can't unlink %s"), full_soname);
-	    do_link = 0;
-	  }
-      /* Create symbolic link.  */
-      if (do_link && symlink (libname, real_full_soname))
-	{
-	  error (0, 0, _("Can't link %s to %s"), full_soname, libname);
-	  do_link = 0;
-	}
-      if (opt_verbose)
-	{
-	  if (do_link)
-	    fputs (_(" (changed)\n"), stdout);
-	  else
-	    fputs (_(" (SKIPPED)\n"), stdout);
-	}
-    }
-  else if (opt_verbose)
-    fputs ("\n", stdout);
-}
-
-/* Manually link the given library.  */
-static void
-manual_link (char *library)
-{
-  char *path;
-  char *real_path;
-  char *real_library;
-  char *libname;
-  char *soname;
-  struct stat64 stat_buf;
-  int flag;
-  unsigned int osversion;
-
-  /* Prepare arguments for create_links call.  Split library name in
-     directory and filename first.  Since path is allocated, we've got
-     to be careful to free at the end.  */
-  path = xstrdup (library);
-  libname = strrchr (path, '/');
-
-  if (libname)
-    {
-      /* Successfully split names.  Check if path is just "/" to avoid
-	 an empty path.  */
-      if (libname == path)
-	{
-	  libname = library + 1;
-	  path = xrealloc (path, 2);
-	  strcpy (path, "/");
-	}
-      else
-	{
-	  *libname = '\0';
-	  ++libname;
-	}
-    }
-  else
-    {
-      /* There's no path, construct one. */
-      libname = library;
-      path = xrealloc (path, 2);
-      strcpy (path, ".");
-    }
-
-  if (opt_chroot)
-    {
-      real_path = chroot_canon (opt_chroot, path);
-      if (real_path == NULL)
-	{
-	  error (0, errno, _("Can't find %s"), path);
-	  free (path);
-	  return;
-	}
-      real_library = alloca (strlen (real_path) + strlen (libname) + 2);
-      sprintf (real_library, "%s/%s", real_path, libname);
-    }
-  else
-    {
-      real_path = path;
-      real_library = library;
-    }
-
-  /* Do some sanity checks first.  */
-  if (lstat64 (real_library, &stat_buf))
-    {
-      error (0, errno, _("Cannot lstat %s"), library);
-      free (path);
-      return;
-    }
-  /* We don't want links here!  */
-  else if (!S_ISREG (stat_buf.st_mode))
-    {
-      error (0, 0, _("Ignored file %s since it is not a regular file."),
-	     library);
-      free (path);
-      return;
-    }
-
-  if (process_file (real_library, library, libname, &flag, &osversion,
-		    &soname, 0, &stat_buf))
-    {
-      error (0, 0, _("No link created since soname could not be found for %s"),
-	     library);
-      free (path);
-      return;
-    }
-  if (soname == NULL)
-    soname = implicit_soname (libname, flag);
-  create_links (real_path, path, libname, soname);
-  free (soname);
-  free (path);
-}
-
-
-/* Read a whole directory and search for libraries.
-   The purpose is two-fold:
-   - search for libraries which will be added to the cache
-   - create symbolic links to the soname for each library
-
-   This has to be done separatly for each directory.
-
-   To keep track of which libraries to add to the cache and which
-   links to create, we save a list of all libraries.
-
-   The algorithm is basically:
-   for all libraries in the directory do
-     get soname of library
-     if soname is already in list
-       if new library is newer, replace entry
-       otherwise ignore this library
-     otherwise add library to list
-
-   For example, if the two libraries libxy.so.1.1 and libxy.so.1.2
-   exist and both have the same soname, e.g. libxy.so, a symbolic link
-   is created from libxy.so.1.2 (the newer one) to libxy.so.
-   libxy.so.1.2 and libxy.so are added to the cache - but not
-   libxy.so.1.1.  */
-
-/* Information for one library.  */
-struct dlib_entry
-{
-  char *name;
-  char *soname;
-  int flag;
-  int is_link;
-  unsigned int osversion;
-  struct dlib_entry *next;
-};
-
-
-static void
-search_dir (const struct dir_entry *entry)
-{
-  uint64_t hwcap = path_hwcap (entry->path);
-  if (opt_verbose)
-    {
-      if (hwcap != 0)
-	printf ("%s: (hwcap: %#.16" PRIx64 ")\n", entry->path, hwcap);
-      else
-	printf ("%s:\n", entry->path);
-    }
-
-  char *dir_name;
-  char *real_file_name;
-  size_t real_file_name_len;
-  size_t file_name_len = PATH_MAX;
-  char *file_name = alloca (file_name_len);
-  if (opt_chroot)
-    {
-      dir_name = chroot_canon (opt_chroot, entry->path);
-      real_file_name_len = PATH_MAX;
-      real_file_name = alloca (real_file_name_len);
-    }
-  else
-    {
-      dir_name = entry->path;
-      real_file_name_len = 0;
-      real_file_name = file_name;
-    }
-
-  DIR *dir;
-  if (dir_name == NULL || (dir = opendir (dir_name)) == NULL)
-    {
-      if (opt_verbose)
-	error (0, errno, _("Can't open directory %s"), entry->path);
-      if (opt_chroot && dir_name)
-	free (dir_name);
-      return;
-    }
-
-  struct dirent64 *direntry;
-  struct dlib_entry *dlibs = NULL;
-  while ((direntry = readdir64 (dir)) != NULL)
-    {
-      int flag;
-#ifdef _DIRENT_HAVE_D_TYPE
-      /* We only look at links and regular files.  */
-      if (direntry->d_type != DT_UNKNOWN
-	  && direntry->d_type != DT_LNK
-	  && direntry->d_type != DT_REG
-	  && direntry->d_type != DT_DIR)
-	continue;
-#endif /* _DIRENT_HAVE_D_TYPE  */
-      /* Does this file look like a shared library or is it a hwcap
-	 subdirectory?  The dynamic linker is also considered as
-	 shared library.  */
-      if (((strncmp (direntry->d_name, "lib", 3) != 0
-	    && strncmp (direntry->d_name, "ld-", 3) != 0)
-	   || strstr (direntry->d_name, ".so") == NULL)
-	  && (
-#ifdef _DIRENT_HAVE_D_TYPE
-	      direntry->d_type == DT_REG ||
-#endif
-	      !is_hwcap_platform (direntry->d_name)))
-	continue;
-
-      size_t len = strlen (direntry->d_name);
-      /* Skip temporary files created by the prelink program.  Files with
-	 names like these are never really DSOs we want to look at.  */
-      if (len >= sizeof (".#prelink#") - 1)
-	{
-	  if (strcmp (direntry->d_name + len - sizeof (".#prelink#") + 1,
-		      ".#prelink#") == 0)
-	    continue;
-	  if (len >= sizeof (".#prelink#.XXXXXX") - 1
-	      && memcmp (direntry->d_name + len - sizeof (".#prelink#.XXXXXX")
-			 + 1, ".#prelink#.", sizeof (".#prelink#.") - 1) == 0)
-	    continue;
-	}
-      len += strlen (entry->path) + 2;
-      if (len > file_name_len)
-	{
-	  file_name_len = len;
-	  file_name = alloca (file_name_len);
-	  if (!opt_chroot)
-	    real_file_name = file_name;
-	}
-      sprintf (file_name, "%s/%s", entry->path, direntry->d_name);
-      if (opt_chroot)
-	{
-	  len = strlen (dir_name) + strlen (direntry->d_name) + 2;
-	  if (len > real_file_name_len)
-	    {
-	      real_file_name_len = len;
-	      real_file_name = alloca (real_file_name_len);
-	    }
-	  sprintf (real_file_name, "%s/%s", dir_name, direntry->d_name);
-	}
-
-      struct stat64 lstat_buf;
-#ifdef _DIRENT_HAVE_D_TYPE
-      /* We optimize and try to do the lstat call only if needed.  */
-      if (direntry->d_type != DT_UNKNOWN)
-	lstat_buf.st_mode = DTTOIF (direntry->d_type);
-      else
-#endif
-	if (__glibc_unlikely (lstat64 (real_file_name, &lstat_buf)))
-	  {
-	    error (0, errno, _("Cannot lstat %s"), file_name);
-	    continue;
-	  }
-
-      struct stat64 stat_buf;
-      int is_dir;
-      int is_link = S_ISLNK (lstat_buf.st_mode);
-      if (is_link)
-	{
-	  /* In case of symlink, we check if the symlink refers to
-	     a directory. */
-	  char *target_name = real_file_name;
-	  if (opt_chroot)
-	    {
-	      target_name = chroot_canon (opt_chroot, file_name);
-	      if (target_name == NULL)
-		{
-		  if (strstr (file_name, ".so") == NULL)
-		    error (0, 0, _("Input file %s not found.\n"), file_name);
-		  continue;
-		}
-	    }
-	  if (__glibc_unlikely (stat64 (target_name, &stat_buf)))
-	    {
-	      if (opt_verbose)
-		error (0, errno, _("Cannot stat %s"), file_name);
-
-	      /* Remove stale symlinks.  */
-	      if (opt_link && strstr (direntry->d_name, ".so."))
-		unlink (real_file_name);
-	      continue;
-	    }
-	  is_dir = S_ISDIR (stat_buf.st_mode);
-
-	  /* lstat_buf is later stored, update contents.  */
-	  lstat_buf.st_dev = stat_buf.st_dev;
-	  lstat_buf.st_ino = stat_buf.st_ino;
-	  lstat_buf.st_size = stat_buf.st_size;
-	  lstat_buf.st_ctime = stat_buf.st_ctime;
-	}
-      else
-	is_dir = S_ISDIR (lstat_buf.st_mode);
-
-      if (is_dir && is_hwcap_platform (direntry->d_name))
-	{
-	  /* Handle subdirectory later.  */
-	  struct dir_entry *new_entry;
-
-	  new_entry = xmalloc (sizeof (struct dir_entry));
-	  new_entry->path = xstrdup (file_name);
-	  new_entry->flag = entry->flag;
-	  new_entry->next = NULL;
-#ifdef _DIRENT_HAVE_D_TYPE
-	  /* We have filled in lstat only #ifndef
-	     _DIRENT_HAVE_D_TYPE.  Fill it in if needed.  */
-	  if (!is_link
-	      && direntry->d_type != DT_UNKNOWN
-	      && __builtin_expect (lstat64 (real_file_name, &lstat_buf), 0))
-	    {
-	      error (0, errno, _("Cannot lstat %s"), file_name);
-	      free (new_entry->path);
-	      free (new_entry);
-	      continue;
-	    }
-#endif
-	  new_entry->ino = lstat_buf.st_ino;
-	  new_entry->dev = lstat_buf.st_dev;
-	  add_single_dir (new_entry, 0);
-	  continue;
-	}
-      else if (!S_ISREG (lstat_buf.st_mode) && !is_link)
-	continue;
-
-      char *real_name;
-      if (opt_chroot && is_link)
-	{
-	  real_name = chroot_canon (opt_chroot, file_name);
-	  if (real_name == NULL)
-	    {
-	      if (strstr (file_name, ".so") == NULL)
-		error (0, 0, _("Input file %s not found.\n"), file_name);
-	      continue;
-	    }
-	}
-      else
-	real_name = real_file_name;
-
-#ifdef _DIRENT_HAVE_D_TYPE
-      /* Call lstat64 if not done yet.  */
-      if (!is_link
-	  && direntry->d_type != DT_UNKNOWN
-	  && __builtin_expect (lstat64 (real_file_name, &lstat_buf), 0))
-	{
-	  error (0, errno, _("Cannot lstat %s"), file_name);
-	  continue;
-	}
-#endif
-
-      /* First search whether the auxiliary cache contains this
-	 library already and it's not changed.  */
-      char *soname;
-      unsigned int osversion;
-      if (!search_aux_cache (&lstat_buf, &flag, &osversion, &soname))
-	{
-	  if (process_file (real_name, file_name, direntry->d_name, &flag,
-			    &osversion, &soname, is_link, &lstat_buf))
-	    {
-	      if (real_name != real_file_name)
-		free (real_name);
-	      continue;
-	    }
-	  else if (opt_build_cache)
-	    add_to_aux_cache (&lstat_buf, flag, osversion, soname);
-	}
-
-      if (soname == NULL)
-	soname = implicit_soname (direntry->d_name, flag);
-
-      /* A link may just point to itself.  */
-      if (is_link)
-	{
-	  /* If the path the link points to isn't its soname or it is not
-	     the .so symlink for ld(1), we treat it as a normal file.
-
-	     You should always do this:
-
-		libfoo.so -> SONAME -> Arbitrary package-chosen name.
-
-	     e.g. libfoo.so -> libfoo.so.1 -> libfooimp.so.9.99.
-	     Given a SONAME of libfoo.so.1.
-
-	     You should *never* do this:
-
-		libfoo.so -> libfooimp.so.9.99
-
-	     If you do, and your SONAME is libfoo.so.1, then libfoo.so
-	     fails to point at the SONAME. In that case ldconfig may consider
-	     libfoo.so as another implementation of SONAME and will create
-	     symlinks against it causing problems when you try to upgrade
-	     or downgrade. The problems will arise because ldconfig will,
-	     depending on directory ordering, creat symlinks against libfoo.so
-	     e.g. libfoo.so.1.2 -> libfoo.so, but when libfoo.so is removed
-	     (typically by the removal of a development pacakge not required
-	     for the runtime) it will break the libfoo.so.1.2 symlink and the
-	     application will fail to start.  */
-	  const char *real_base_name = basename (real_file_name);
-
-	  if (strcmp (real_base_name, soname) != 0)
-	    {
-	      len = strlen (real_base_name);
-	      if (len < strlen (".so")
-		  || strcmp (real_base_name + len - strlen (".so"), ".so") != 0
-		  || strncmp (real_base_name, soname, len) != 0)
-		is_link = 0;
-	    }
-	}
-
-      if (real_name != real_file_name)
-	free (real_name);
-
-      if (is_link)
-	{
-	  free (soname);
-	  soname = xstrdup (direntry->d_name);
-	}
-
-      if (flag == FLAG_ELF
-	  && (entry->flag == FLAG_ELF_LIBC5
-	      || entry->flag == FLAG_ELF_LIBC6))
-	flag = entry->flag;
-
-      /* Some sanity checks to print warnings.  */
-      if (opt_verbose)
-	{
-	  if (flag == FLAG_ELF_LIBC5 && entry->flag != FLAG_ELF_LIBC5
-	      && entry->flag != FLAG_ANY)
-	    error (0, 0, _("libc5 library %s in wrong directory"), file_name);
-	  if (flag == FLAG_ELF_LIBC6 && entry->flag != FLAG_ELF_LIBC6
-	      && entry->flag != FLAG_ANY)
-	    error (0, 0, _("libc6 library %s in wrong directory"), file_name);
-	  if (flag == FLAG_LIBC4 && entry->flag != FLAG_LIBC4
-	      && entry->flag != FLAG_ANY)
-	    error (0, 0, _("libc4 library %s in wrong directory"), file_name);
-	}
-
-      /* Add library to list.  */
-      struct dlib_entry *dlib_ptr;
-      for (dlib_ptr = dlibs; dlib_ptr != NULL; dlib_ptr = dlib_ptr->next)
-	{
-	  /* Is soname already in list?  */
-	  if (strcmp (dlib_ptr->soname, soname) == 0)
-	    {
-	      /* Prefer a file to a link, otherwise check which one
-		 is newer.  */
-	      if ((!is_link && dlib_ptr->is_link)
-		  || (is_link == dlib_ptr->is_link
-		      && _dl_cache_libcmp (dlib_ptr->name, direntry->d_name) < 0))
-		{
-		  /* It's newer - add it.  */
-		  /* Flag should be the same - sanity check.  */
-		  if (dlib_ptr->flag != flag)
-		    {
-		      if (dlib_ptr->flag == FLAG_ELF
-			  && (flag == FLAG_ELF_LIBC5 || flag == FLAG_ELF_LIBC6))
-			dlib_ptr->flag = flag;
-		      else if ((dlib_ptr->flag == FLAG_ELF_LIBC5
-				|| dlib_ptr->flag == FLAG_ELF_LIBC6)
-			       && flag == FLAG_ELF)
-			dlib_ptr->flag = flag;
-		      else
-			error (0, 0, _("libraries %s and %s in directory %s have same soname but different type."),
-			       dlib_ptr->name, direntry->d_name,
-			       entry->path);
-		    }
-		  free (dlib_ptr->name);
-		  dlib_ptr->name = xstrdup (direntry->d_name);
-		  dlib_ptr->is_link = is_link;
-		  dlib_ptr->osversion = osversion;
-		}
-	      /* Don't add this library, abort loop.  */
-	      /* Also free soname, since it's dynamically allocated.  */
-	      free (soname);
-	      break;
-	    }
-	}
-      /* Add the library if it's not already in.  */
-      if (dlib_ptr == NULL)
-	{
-	  dlib_ptr = (struct dlib_entry *)xmalloc (sizeof (struct dlib_entry));
-	  dlib_ptr->name = xstrdup (direntry->d_name);
-	  dlib_ptr->soname = soname;
-	  dlib_ptr->flag = flag;
-	  dlib_ptr->is_link = is_link;
-	  dlib_ptr->osversion = osversion;
-	  /* Add at head of list.  */
-	  dlib_ptr->next = dlibs;
-	  dlibs = dlib_ptr;
-	}
-    }
-
-  closedir (dir);
-
-  /* Now dlibs contains a list of all libs - add those to the cache
-     and created all symbolic links.  */
-  struct dlib_entry *dlib_ptr;
-  for (dlib_ptr = dlibs; dlib_ptr != NULL; dlib_ptr = dlib_ptr->next)
-    {
-      /* Don't create links to links.  */
-      if (dlib_ptr->is_link == 0)
-	create_links (dir_name, entry->path, dlib_ptr->name,
-		      dlib_ptr->soname);
-      if (opt_build_cache)
-	add_to_cache (entry->path, dlib_ptr->soname, dlib_ptr->flag,
-		      dlib_ptr->osversion, hwcap);
-    }
-
-  /* Free all resources.  */
-  while (dlibs)
-    {
-      dlib_ptr = dlibs;
-      free (dlib_ptr->soname);
-      free (dlib_ptr->name);
-      dlibs = dlibs->next;
-      free (dlib_ptr);
-    }
-
-  if (opt_chroot && dir_name)
-    free (dir_name);
-}
-
-/* Search through all libraries.  */
-static void
-search_dirs (void)
-{
-  struct dir_entry *entry;
-
-  for (entry = dir_entries; entry != NULL; entry = entry->next)
-    search_dir (entry);
-
-  /* Free all allocated memory.  */
-  while (dir_entries)
-    {
-      entry = dir_entries;
-      dir_entries = dir_entries->next;
-      free (entry->path);
-      free (entry);
-    }
-}
-
-
-static void parse_conf_include (const char *config_file, unsigned int lineno,
-				bool do_chroot, const char *pattern);
-
-/* Parse configuration file.  */
-static void
-parse_conf (const char *filename, bool do_chroot)
-{
-  FILE *file = NULL;
-  char *line = NULL;
-  const char *canon;
-  size_t len = 0;
-  unsigned int lineno;
-
-  if (do_chroot && opt_chroot)
-    {
-      canon = chroot_canon (opt_chroot, filename);
-      if (canon)
-	file = fopen (canon, "r");
-      else
-	canon = filename;
-    }
-  else
-    {
-      canon = filename;
-      file = fopen (filename, "r");
-    }
-
-  if (file == NULL)
-    {
-      error (0, errno, _("\
-Warning: ignoring configuration file that cannot be opened: %s"),
-	     canon);
-      if (canon != filename)
-	free ((char *) canon);
-      return;
-    }
-
-  /* No threads use this stream.  */
-  __fsetlocking (file, FSETLOCKING_BYCALLER);
-
-  if (canon != filename)
-    free ((char *) canon);
-
-  lineno = 0;
-  do
-    {
-      ssize_t n = getline (&line, &len, file);
-      if (n < 0)
-	break;
-
-      ++lineno;
-      if (line[n - 1] == '\n')
-	line[n - 1] = '\0';
-
-      /* Because the file format does not know any form of quoting we
-	 can search forward for the next '#' character and if found
-	 make it terminating the line.  */
-      *strchrnul (line, '#') = '\0';
-
-      /* Remove leading whitespace.  NUL is no whitespace character.  */
-      char *cp = line;
-      while (isspace (*cp))
-	++cp;
-
-      /* If the line is blank it is ignored.  */
-      if (cp[0] == '\0')
-	continue;
-
-      if (!strncmp (cp, "include", 7) && isblank (cp[7]))
-	{
-	  char *dir;
-	  cp += 8;
-	  while ((dir = strsep (&cp, " \t")) != NULL)
-	    if (dir[0] != '\0')
-	      parse_conf_include (filename, lineno, do_chroot, dir);
-	}
-      else if (!strncasecmp (cp, "hwcap", 5) && isblank (cp[5]))
-	{
-	  cp += 6;
-	  char *p, *name = NULL;
-	  unsigned long int n = strtoul (cp, &cp, 0);
-	  if (cp != NULL && isblank (*cp))
-	    while ((p = strsep (&cp, " \t")) != NULL)
-	      if (p[0] != '\0')
-		{
-		  if (name == NULL)
-		    name = p;
-		  else
-		    {
-		      name = NULL;
-		      break;
-		    }
-		}
-	  if (name == NULL)
-	    {
-	      error (EXIT_FAILURE, 0, _("%s:%u: bad syntax in hwcap line"),
-		     filename, lineno);
-	      break;
-	    }
-	  if (n >= (64 - _DL_FIRST_EXTRA))
-	    error (EXIT_FAILURE, 0,
-		   _("%s:%u: hwcap index %lu above maximum %u"),
-		   filename, lineno, n, 64 - _DL_FIRST_EXTRA - 1);
-	  if (hwcap_extra[n] == NULL)
-	    {
-	      for (unsigned long int h = 0; h < (64 - _DL_FIRST_EXTRA); ++h)
-		if (hwcap_extra[h] != NULL && !strcmp (name, hwcap_extra[h]))
-		  error (EXIT_FAILURE, 0,
-			 _("%s:%u: hwcap index %lu already defined as %s"),
-			 filename, lineno, h, name);
-	      hwcap_extra[n] = xstrdup (name);
-	    }
-	  else
-	    {
-	      if (strcmp (name, hwcap_extra[n]))
-		error (EXIT_FAILURE, 0,
-		       _("%s:%u: hwcap index %lu already defined as %s"),
-		       filename, lineno, n, hwcap_extra[n]);
-	      if (opt_verbose)
-		error (0, 0, _("%s:%u: duplicate hwcap %lu %s"),
-		       filename, lineno, n, name);
-	    }
-	}
-      else
-	add_dir (cp);
-    }
-  while (!feof_unlocked (file));
-
-  /* Free buffer and close file.  */
-  free (line);
-  fclose (file);
-}
-
-/* Handle one word in an `include' line, a glob pattern of additional
-   config files to read.  */
-static void
-parse_conf_include (const char *config_file, unsigned int lineno,
-		    bool do_chroot, const char *pattern)
-{
-  if (opt_chroot && pattern[0] != '/')
-    error (EXIT_FAILURE, 0,
-	   _("need absolute file name for configuration file when using -r"));
-
-  char *copy = NULL;
-  if (pattern[0] != '/' && strchr (config_file, '/') != NULL)
-    {
-      if (asprintf (&copy, "%s/%s", dirname (strdupa (config_file)),
-		    pattern) < 0)
-	error (EXIT_FAILURE, 0, _("memory exhausted"));
-      pattern = copy;
-    }
-
-  glob64_t gl;
-  int result;
-  if (do_chroot && opt_chroot)
-    {
-      char *canon = chroot_canon (opt_chroot, pattern);
-      if (canon == NULL)
-	return;
-      result = glob64 (canon, 0, NULL, &gl);
-      free (canon);
-    }
-  else
-    result = glob64 (pattern, 0, NULL, &gl);
-
-  switch (result)
-    {
-    case 0:
-      for (size_t i = 0; i < gl.gl_pathc; ++i)
-	parse_conf (gl.gl_pathv[i], false);
-      globfree64 (&gl);
-      break;
-
-    case GLOB_NOMATCH:
-      break;
-
-    case GLOB_NOSPACE:
-      errno = ENOMEM;
-    case GLOB_ABORTED:
-      if (opt_verbose)
-	error (0, errno, _("%s:%u: cannot read directory %s"),
-	       config_file, lineno, pattern);
-      break;
-
-    default:
-      abort ();
-      break;
-    }
-
-  free (copy);
-}
-
-/* Honour LD_HWCAP_MASK.  */
-static void
-set_hwcap (void)
-{
-  char *mask = getenv ("LD_HWCAP_MASK");
-
-  if (mask)
-    hwcap_mask = strtoul (mask, NULL, 0);
-}
-
-
-int
-main (int argc, char **argv)
-{
-  /* Set locale via LC_ALL.  */
-  setlocale (LC_ALL, "");
-
-  /* Set the text message domain.  */
-  textdomain (_libc_intl_domainname);
-
-  /* Parse and process arguments.  */
-  int remaining;
-  argp_parse (&argp, argc, argv, 0, &remaining, NULL);
-
-  /* Remaining arguments are additional directories if opt_manual_link
-     is not set.  */
-  if (remaining != argc && !opt_manual_link)
-    {
-      int i;
-      for (i = remaining; i < argc; ++i)
-	if (opt_build_cache && argv[i][0] != '/')
-	  error (EXIT_FAILURE, 0,
-		 _("relative path `%s' used to build cache"),
-		 argv[i]);
-	else
-	  add_dir (argv[i]);
-    }
-
-  /* The last entry in hwcap_extra is reserved for the "tls" pseudo-hwcap which
-     indicates support for TLS.  This pseudo-hwcap is only used by old versions
-     under which TLS support was optional.  The entry is no longer needed, but
-     must remain for compatibility.  */
-  hwcap_extra[63 - _DL_FIRST_EXTRA] = "tls";
-
-  set_hwcap ();
-
-  if (opt_chroot)
-    {
-      /* Normalize the path a bit, we might need it for printing later.  */
-      char *endp = rawmemchr (opt_chroot, '\0');
-      while (endp > opt_chroot && endp[-1] == '/')
-	--endp;
-      *endp = '\0';
-      if (endp == opt_chroot)
-	opt_chroot = NULL;
-
-      if (opt_chroot)
-	{
-	  /* It is faster to use chroot if we can.  */
-	  if (!chroot (opt_chroot))
-	    {
-	      if (chdir ("/"))
-		error (EXIT_FAILURE, errno, _("Can't chdir to /"));
-	      opt_chroot = NULL;
-	    }
-	}
-    }
-
-  if (cache_file == NULL)
-    {
-      cache_file = alloca (strlen (LD_SO_CACHE) + 1);
-      strcpy (cache_file, LD_SO_CACHE);
-    }
-
-  if (config_file == NULL)
-    config_file = LD_SO_CONF;
-
-  if (opt_print_cache)
-    {
-      if (opt_chroot)
-	{
-	  char *p = chroot_canon (opt_chroot, cache_file);
-	  if (p == NULL)
-	    error (EXIT_FAILURE, errno, _("Can't open cache file %s\n"),
-		   cache_file);
-	  cache_file = p;
-	}
-      print_cache (cache_file);
-      if (opt_chroot)
-	free (cache_file);
-      exit (0);
-    }
-
-  if (opt_chroot)
-    {
-      /* Canonicalize the directory name of cache_file, not cache_file,
-	 because we'll rename a temporary cache file to it.  */
-      char *p = strrchr (cache_file, '/');
-      char *canon = chroot_canon (opt_chroot,
-				  p ? (*p = '\0', cache_file) : "/");
-
-      if (canon == NULL)
-	error (EXIT_FAILURE, errno,
-	       _("Can't open cache file directory %s\n"),
-	       p ? cache_file : "/");
-
-      if (p)
-	++p;
-      else
-	p = cache_file;
-
-      cache_file = alloca (strlen (canon) + strlen (p) + 2);
-      sprintf (cache_file, "%s/%s", canon, p);
-      free (canon);
-    }
-
-  if (opt_manual_link)
-    {
-      /* Link all given libraries manually.  */
-      int i;
-
-      for (i = remaining; i < argc; ++i)
-	manual_link (argv[i]);
-
-      exit (0);
-    }
-
-
-  if (opt_build_cache)
-    init_cache ();
-
-  if (!opt_only_cline)
-    {
-      parse_conf (config_file, true);
-
-      /* Always add the standard search paths.  */
-      add_system_dir (SLIBDIR);
-      if (strcmp (SLIBDIR, LIBDIR))
-	add_system_dir (LIBDIR);
-    }
-
-  const char *aux_cache_file = _PATH_LDCONFIG_AUX_CACHE;
-  if (opt_chroot)
-    aux_cache_file = chroot_canon (opt_chroot, aux_cache_file);
-
-  if (! opt_ignore_aux_cache && aux_cache_file)
-    load_aux_cache (aux_cache_file);
-  else
-    init_aux_cache ();
-
-  search_dirs ();
-
-  if (opt_build_cache)
-    {
-      save_cache (cache_file);
-      if (aux_cache_file)
-	save_aux_cache (aux_cache_file);
-    }
-
-  return 0;
-}
diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in
deleted file mode 100644
index 7dd1fccf24..0000000000
--- a/elf/ldd.bash.in
+++ /dev/null
@@ -1,203 +0,0 @@
-#! @BASH@
-# Copyright (C) 1996-2017 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, see
-# <http://www.gnu.org/licenses/>.
-
-
-# This is the `ldd' command, which lists what shared libraries are
-# used by given dynamically-linked executables.  It works by invoking the
-# run-time dynamic linker as a command and setting the environment
-# variable LD_TRACE_LOADED_OBJECTS to a non-empty value.
-
-# We should be able to find the translation right at the beginning.
-TEXTDOMAIN=libc
-TEXTDOMAINDIR=@TEXTDOMAINDIR@
-
-RTLDLIST=@RTLD@
-warn=
-bind_now=
-verbose=
-
-while test $# -gt 0; do
-  case "$1" in
-  --vers | --versi | --versio | --version)
-    echo 'ldd @PKGVERSION@@VERSION@'
-    printf $"Copyright (C) %s 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.
-" "2017"
-    printf $"Written by %s and %s.
-" "Roland McGrath" "Ulrich Drepper"
-    exit 0
-    ;;
-  --h | --he | --hel | --help)
-    echo $"Usage: ldd [OPTION]... FILE...
-      --help              print this help and exit
-      --version           print version information and exit
-  -d, --data-relocs       process data relocations
-  -r, --function-relocs   process data and function relocations
-  -u, --unused            print unused direct dependencies
-  -v, --verbose           print all information
-"
-    printf $"For bug reporting instructions, please see:\\n%s.\\n" \
-      "@REPORT_BUGS_TO@"
-    exit 0
-    ;;
-  -d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \
-  --data-rel | --data-relo | --data-reloc | --data-relocs)
-    warn=yes
-    shift
-    ;;
-  -r | --f | --fu | --fun | --func | --funct | --functi | --functio | \
-  --function | --function- | --function-r | --function-re | --function-rel | \
-  --function-relo | --function-reloc | --function-relocs)
-    warn=yes
-    bind_now=yes
-    shift
-    ;;
-  -v | --verb | --verbo | --verbos | --verbose)
-    verbose=yes
-    shift
-    ;;
-  -u | --u | --un | --unu | --unus | --unuse | --unused)
-    unused=yes
-    shift
-    ;;
-  --v | --ve | --ver)
-    echo >&2 $"ldd: option \`$1' is ambiguous"
-    exit 1
-    ;;
-  --)		# Stop option processing.
-    shift; break
-    ;;
-  -*)
-    echo >&2 'ldd:' $"unrecognized option" "\`$1'"
-    echo >&2 $"Try \`ldd --help' for more information."
-    exit 1
-    ;;
-  *)
-    break
-    ;;
-  esac
-done
-
-nonelf ()
-{
-  # Maybe extra code for non-ELF binaries.
-  return 1;
-}
-
-add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
-add_env="$add_env LD_VERBOSE=$verbose"
-if test "$unused" = yes; then
-  add_env="$add_env LD_DEBUG=\"$LD_DEBUG${LD_DEBUG:+,}unused\""
-fi
-
-# The following command substitution is needed to make ldd work in SELinux
-# environments where the RTLD might not have permission to write to the
-# terminal.  The extra "x" character prevents the shell from trimming trailing
-# newlines from command substitution results.  This function is defined as a
-# subshell compound list (using "(...)") to prevent parameter assignments from
-# affecting the calling shell execution environment.
-try_trace() (
-  output=$(eval $add_env '"$@"' 2>&1; rc=$?; printf 'x'; exit $rc)
-  rc=$?
-  printf '%s' "${output%x}"
-  return $rc
-)
-
-case $# in
-0)
-  echo >&2 'ldd:' $"missing file arguments"
-  echo >&2 $"Try \`ldd --help' for more information."
-  exit 1
-  ;;
-1)
-  single_file=t
-  ;;
-*)
-  single_file=f
-  ;;
-esac
-
-result=0
-for file do
-  # We don't list the file name when there is only one.
-  test $single_file = t || echo "${file}:"
-  case $file in
-  */*) :
-       ;;
-  *) file=./$file
-     ;;
-  esac
-  if test ! -e "$file"; then
-    echo "ldd: ${file}:" $"No such file or directory" >&2
-    result=1
-  elif test ! -f "$file"; then
-    echo "ldd: ${file}:" $"not regular file" >&2
-    result=1
-  elif test -r "$file"; then
-    test -x "$file" || echo 'ldd:' $"\
-warning: you do not have execution permission for" "\`$file'" >&2
-    RTLD=
-    ret=1
-    for rtld in ${RTLDLIST}; do
-      if test -x $rtld; then
-	verify_out=`${rtld} --verify "$file"`
-	ret=$?
-	case $ret in
-	[02]) RTLD=${rtld}; break;;
-	esac
-      fi
-    done
-    case $ret in
-    0)
-      # If the program exits with exit code 5, it means the process has been
-      # invoked with __libc_enable_secure.  Fall back to running it through
-      # the dynamic linker.
-      try_trace "$file"
-      rc=$?
-      if [ $rc = 5 ]; then
-	try_trace "$RTLD" "$file"
-	rc=$?
-      fi
-      [ $rc = 0 ] || result=1
-      ;;
-    1)
-      # This can be a non-ELF binary or no binary at all.
-      nonelf "$file" || {
-	echo $"	not a dynamic executable"
-	result=1
-      }
-      ;;
-    2)
-      try_trace "$RTLD" "$file" || result=1
-      ;;
-    *)
-      echo 'ldd:' ${RTLD} $"exited with unknown exit code" "($ret)" >&2
-      exit 1
-      ;;
-    esac
-  else
-    echo 'ldd:' $"error: you do not have read permission for" "\`$file'" >&2
-    result=1
-  fi
-done
-
-exit $result
-# Local Variables:
-#  mode:ksh
-# End:
diff --git a/elf/link.h b/elf/link.h
deleted file mode 100644
index 0e223ce9f0..0000000000
--- a/elf/link.h
+++ /dev/null
@@ -1,194 +0,0 @@
-/* Data structure for communication from the run-time dynamic linker for
-   loaded ELF shared objects.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef	_LINK_H
-#define	_LINK_H	1
-
-#include <features.h>
-#include <elf.h>
-#include <dlfcn.h>
-#include <sys/types.h>
-
-/* We use this macro to refer to ELF types independent of the native wordsize.
-   `ElfW(TYPE)' is used in place of `Elf32_TYPE' or `Elf64_TYPE'.  */
-#define ElfW(type)	_ElfW (Elf, __ELF_NATIVE_CLASS, type)
-#define _ElfW(e,w,t)	_ElfW_1 (e, w, _##t)
-#define _ElfW_1(e,w,t)	e##w##t
-
-#include <bits/elfclass.h>		/* Defines __ELF_NATIVE_CLASS.  */
-#include <bits/link.h>
-
-/* Rendezvous structure used by the run-time dynamic linker to communicate
-   details of shared object loading to the debugger.  If the executable's
-   dynamic section has a DT_DEBUG element, the run-time linker sets that
-   element's value to the address where this structure can be found.  */
-
-struct r_debug
-  {
-    int r_version;		/* Version number for this protocol.  */
-
-    struct link_map *r_map;	/* Head of the chain of loaded objects.  */
-
-    /* This is the address of a function internal to the run-time linker,
-       that will always be called when the linker begins to map in a
-       library or unmap it, and again when the mapping change is complete.
-       The debugger can set a breakpoint at this address if it wants to
-       notice shared object mapping changes.  */
-    ElfW(Addr) r_brk;
-    enum
-      {
-	/* This state value describes the mapping change taking place when
-	   the `r_brk' address is called.  */
-	RT_CONSISTENT,		/* Mapping change is complete.  */
-	RT_ADD,			/* Beginning to add a new object.  */
-	RT_DELETE		/* Beginning to remove an object mapping.  */
-      } r_state;
-
-    ElfW(Addr) r_ldbase;	/* Base address the linker is loaded at.  */
-  };
-
-/* This is the instance of that structure used by the dynamic linker.  */
-extern struct r_debug _r_debug;
-
-/* This symbol refers to the "dynamic structure" in the `.dynamic' section
-   of whatever module refers to `_DYNAMIC'.  So, to find its own
-   `struct r_debug', a program could do:
-     for (dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn)
-       if (dyn->d_tag == DT_DEBUG)
-	 r_debug = (struct r_debug *) dyn->d_un.d_ptr;
-   */
-extern ElfW(Dyn) _DYNAMIC[];
-
-/* Structure describing a loaded shared object.  The `l_next' and `l_prev'
-   members form a chain of all the shared objects loaded at startup.
-
-   These data structures exist in space used by the run-time dynamic linker;
-   modifying them may have disastrous results.  */
-
-struct link_map
-  {
-    /* These first few members are part of the protocol with the debugger.
-       This is the same format used in SVR4.  */
-
-    ElfW(Addr) l_addr;		/* Difference between the address in the ELF
-				   file and the addresses in memory.  */
-    char *l_name;		/* Absolute file name object was found in.  */
-    ElfW(Dyn) *l_ld;		/* Dynamic section of the shared object.  */
-    struct link_map *l_next, *l_prev; /* Chain of loaded objects.  */
-  };
-
-#ifdef __USE_GNU
-
-/* Version numbers for la_version handshake interface.  */
-#define LAV_CURRENT	1
-
-/* Activity types signaled through la_activity.  */
-enum
-  {
-    LA_ACT_CONSISTENT,		/* Link map consistent again.  */
-    LA_ACT_ADD,			/* New object will be added.  */
-    LA_ACT_DELETE		/* Objects will be removed.  */
-  };
-
-/* Values representing origin of name for dynamic loading.  */
-enum
-  {
-    LA_SER_ORIG = 0x01,		/* Original name.  */
-    LA_SER_LIBPATH = 0x02,	/* Directory from LD_LIBRARY_PATH.  */
-    LA_SER_RUNPATH = 0x04,	/* Directory from RPATH/RUNPATH.  */
-    LA_SER_CONFIG = 0x08,	/* Found through ldconfig.  */
-    LA_SER_DEFAULT = 0x40,	/* Default directory.  */
-    LA_SER_SECURE = 0x80	/* Unused.  */
-  };
-
-/* Values for la_objopen return value.  */
-enum
-  {
-    LA_FLG_BINDTO = 0x01,	/* Audit symbols bound to this object.  */
-    LA_FLG_BINDFROM = 0x02	/* Audit symbols bound from this object.  */
-  };
-
-/* Values for la_symbind flags parameter.  */
-enum
-  {
-    LA_SYMB_NOPLTENTER = 0x01,	/* la_pltenter will not be called.  */
-    LA_SYMB_NOPLTEXIT = 0x02,	/* la_pltexit will not be called.  */
-    LA_SYMB_STRUCTCALL = 0x04,	/* Return value is a structure.  */
-    LA_SYMB_DLSYM = 0x08,	/* Binding due to dlsym call.  */
-    LA_SYMB_ALTVALUE = 0x10	/* Value has been changed by a previous
-				   la_symbind call.  */
-  };
-
-struct dl_phdr_info
-  {
-    ElfW(Addr) dlpi_addr;
-    const char *dlpi_name;
-    const ElfW(Phdr) *dlpi_phdr;
-    ElfW(Half) dlpi_phnum;
-
-    /* Note: Following members were introduced after the first
-       version of this structure was available.  Check the SIZE
-       argument passed to the dl_iterate_phdr callback to determine
-       whether or not each later member is available.  */
-
-    /* Incremented when a new object may have been added.  */
-    __extension__ unsigned long long int dlpi_adds;
-    /* Incremented when an object may have been removed.  */
-    __extension__ unsigned long long int dlpi_subs;
-
-    /* If there is a PT_TLS segment, its module ID as used in
-       TLS relocations, else zero.  */
-    size_t dlpi_tls_modid;
-
-    /* The address of the calling thread's instance of this module's
-       PT_TLS segment, if it has one and it has been allocated
-       in the calling thread, otherwise a null pointer.  */
-    void *dlpi_tls_data;
-  };
-
-__BEGIN_DECLS
-
-extern int dl_iterate_phdr (int (*__callback) (struct dl_phdr_info *,
-					       size_t, void *),
-			    void *__data);
-
-
-/* Prototypes for the ld.so auditing interfaces.  These are not
-   defined anywhere in ld.so but instead have to be provided by the
-   auditing DSO.  */
-extern unsigned int la_version (unsigned int __version);
-extern void la_activity (uintptr_t *__cookie, unsigned int __flag);
-extern char *la_objsearch (const char *__name, uintptr_t *__cookie,
-			   unsigned int __flag);
-extern unsigned int la_objopen (struct link_map *__map, Lmid_t __lmid,
-				uintptr_t *__cookie);
-extern void la_preinit (uintptr_t *__cookie);
-extern uintptr_t la_symbind32 (Elf32_Sym *__sym, unsigned int __ndx,
-			       uintptr_t *__refcook, uintptr_t *__defcook,
-			       unsigned int *__flags, const char *__symname);
-extern uintptr_t la_symbind64 (Elf64_Sym *__sym, unsigned int __ndx,
-			       uintptr_t *__refcook, uintptr_t *__defcook,
-			       unsigned int *__flags, const char *__symname);
-extern unsigned int la_objclose (uintptr_t *__cookie);
-
-__END_DECLS
-
-#endif
-
-#endif /* link.h */
diff --git a/elf/loadfail.c b/elf/loadfail.c
deleted file mode 100644
index 7531aa958e..0000000000
--- a/elf/loadfail.c
+++ /dev/null
@@ -1,42 +0,0 @@
-#include <dlfcn.h>
-#include <error.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  void *su[5];
-  void *h;
-  int n;
-
-  mtrace ();
-
-  if ((su[0] = dlopen ("testobj1.so", RTLD_GLOBAL | RTLD_NOW)) == NULL
-      || (su[1] = dlopen ("testobj2.so", RTLD_GLOBAL | RTLD_NOW)) == NULL
-      || (su[2] = dlopen ("testobj3.so", RTLD_GLOBAL | RTLD_NOW)) == NULL
-      || (su[3] = dlopen ("testobj4.so", RTLD_GLOBAL | RTLD_NOW)) == NULL
-      || (su[4] = dlopen ("testobj5.so", RTLD_GLOBAL | RTLD_NOW)) == NULL)
-    error (EXIT_FAILURE, 0, "failed to load shared object: %s", dlerror ());
-
-  h = dlopen ("failobj.so", RTLD_GLOBAL | RTLD_NOW);
-
-  printf ("h = %p, %s\n", h, h == NULL ? "ok" : "fail");
-
-  for (n = 0; n < 5; ++n)
-    if (dlclose (su[n]) != 0)
-      {
-	printf ("failed to unload su[%d]: %s\n", n, dlerror ());
-	exit (EXIT_FAILURE);
-      }
-
-  return h != NULL;
-}
-
-extern int foo (int a);
-int
-foo (int a)
-{
-  return 10;
-}
diff --git a/elf/loadtest.c b/elf/loadtest.c
deleted file mode 100644
index 727469b496..0000000000
--- a/elf/loadtest.c
+++ /dev/null
@@ -1,202 +0,0 @@
-#include <assert.h>
-#include <dlfcn.h>
-#include <errno.h>
-#include <error.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-/* How many load/unload operations do we do.  */
-#define TEST_ROUNDS	1000
-
-
-static struct
-{
-  /* Name of the module.  */
-  const char *name;
-  /* The handle.  */
-  void *handle;
-} testobjs[] =
-{
-  { "testobj1.so", NULL },
-  { "testobj2.so", NULL },
-  { "testobj3.so", NULL },
-  { "testobj4.so", NULL },
-  { "testobj5.so", NULL },
-  { "testobj6.so", NULL },
-};
-#define NOBJS	(sizeof (testobjs) / sizeof (testobjs[0]))
-
-
-static const struct
-{
-  /* Name of a function to call.  */
-  const char *fname;
-  /* Index in status and handle array.  */
-  int index;
-  /* Options while loading the module.  */
-  int options;
-} tests[] =
-{
-  { "obj1func2", 0, RTLD_LAZY },
-  { "obj1func1", 0, RTLD_LAZY | RTLD_GLOBAL },
-  { "obj1func1", 0, RTLD_NOW, },
-  { "obj1func2", 0, RTLD_NOW | RTLD_GLOBAL },
-  { "obj2func2", 1, RTLD_LAZY },
-  { "obj2func1", 1, RTLD_LAZY | RTLD_GLOBAL, },
-  { "obj2func1", 1, RTLD_NOW, },
-  { "obj2func2", 1, RTLD_NOW | RTLD_GLOBAL },
-  { "obj3func2", 2, RTLD_LAZY },
-  { "obj3func1", 2, RTLD_LAZY | RTLD_GLOBAL },
-  { "obj3func1", 2, RTLD_NOW },
-  { "obj3func2", 2, RTLD_NOW | RTLD_GLOBAL },
-  { "obj4func2", 3, RTLD_LAZY },
-  { "obj4func1", 3, RTLD_LAZY | RTLD_GLOBAL },
-  { "obj4func1", 3, RTLD_NOW },
-  { "obj4func2", 3, RTLD_NOW | RTLD_GLOBAL },
-  { "obj5func2", 4, RTLD_LAZY },
-  { "obj5func1", 4, RTLD_LAZY | RTLD_GLOBAL },
-  { "obj5func1", 4, RTLD_NOW },
-  { "obj5func2", 4, RTLD_NOW | RTLD_GLOBAL },
-  { "obj6func2", 5, RTLD_LAZY },
-  { "obj6func1", 5, RTLD_LAZY | RTLD_GLOBAL },
-  { "obj6func1", 5, RTLD_NOW },
-  { "obj6func2", 5, RTLD_NOW | RTLD_GLOBAL },
-};
-#define NTESTS	(sizeof (tests) / sizeof (tests[0]))
-
-
-#include <include/link.h>
-
-#define MAPS ((struct link_map *) _r_debug.r_map)
-
-#define OUT \
-  for (map = MAPS; map != NULL; map = map->l_next)		      \
-    if (map->l_type == lt_loaded)					      \
-      printf ("name = \"%s\", direct_opencount = %d\n",			      \
-	      map->l_name, (int) map->l_direct_opencount);		      \
-  fflush (stdout)
-
-
-int
-main (int argc, char *argv[])
-{
-  int debug = argc > 1 && argv[1][0] != '\0';
-  int count = TEST_ROUNDS;
-  int result = 0;
-  struct link_map *map;
-
-  mtrace ();
-
-  /* Just a seed.  */
-  srandom (TEST_ROUNDS);
-
-  if (debug)
-    {
-      puts ("in the beginning");
-      OUT;
-    }
-
-  while (count--)
-    {
-      int nr = random () % NTESTS;
-      int index = tests[nr].index;
-
-      printf ("%4d: %4d: ", count + 1, nr);
-      fflush (stdout);
-
-      if (testobjs[index].handle == NULL)
-	{
-	  int (*fct) (int);
-
-	  /* Load the object.  */
-	  testobjs[index].handle = dlopen (testobjs[index].name,
-					   tests[nr].options);
-	  if (testobjs[index].handle == NULL)
-	    error (EXIT_FAILURE, 0, "cannot load `%s': %s",
-		   testobjs[index].name, dlerror ());
-
-	  /* Test the function call.  */
-	  fct = dlsym (testobjs[index].handle, tests[nr].fname);
-	  if (fct == NULL)
-	    error (EXIT_FAILURE, 0,
-		   "cannot get function `%s' from shared object `%s': %s",
-		   tests[nr].fname, testobjs[index].name, dlerror ());
-
-	  fct (10);
-
-	  printf ("successfully loaded `%s', handle %p\n",
-		  testobjs[index].name, testobjs[index].handle);
-	}
-      else
-	{
-	  if (dlclose (testobjs[index].handle) != 0)
-	    {
-	      printf ("failed to close %s\n", testobjs[index].name);
-	      result = 1;
-	    }
-	  else
-	    printf ("successfully unloaded `%s', handle %p\n",
-		    testobjs[index].name, testobjs[index].handle);
-
-	  testobjs[index].handle = NULL;
-
-	  if (testobjs[0].handle == NULL
-	      && testobjs[1].handle == NULL
-	      && testobjs[5].handle == NULL)
-	    {
-	      /* In this case none of the objects above should be
-		 present.  */
-	      for (map = MAPS; map != NULL; map = map->l_next)
-		if (map->l_type == lt_loaded
-		    && (strstr (map->l_name, testobjs[0].name) != NULL
-			|| strstr (map->l_name, testobjs[1].name) != NULL
-			|| strstr (map->l_name, testobjs[5].name) != NULL))
-		  {
-		    printf ("`%s' is still loaded\n", map->l_name);
-		    result = 1;
-		  }
-	    }
-	}
-
-      if (debug)
-	OUT;
-    }
-
-  /* Unload all loaded modules.  */
-  for (count = 0; count < (int) NOBJS; ++count)
-    if (testobjs[count].handle != NULL)
-      {
-	printf ("\nclose: %s: l_initfini = %p, l_versions = %p\n",
-		testobjs[count].name,
-		((struct link_map *) testobjs[count].handle)->l_initfini,
-		((struct link_map *) testobjs[count].handle)->l_versions);
-
-	if (dlclose (testobjs[count].handle) != 0)
-	  {
-	    printf ("failed to close %s\n", testobjs[count].name);
-	    result = 1;
-	  }
-      }
-
-  /* Check whether all files are unloaded.  */
-  for (map = MAPS; map != NULL; map = map->l_next)
-    if (map->l_type == lt_loaded)
-      {
-	printf ("name = \"%s\", direct_opencount = %d\n",
-		map->l_name, (int) map->l_direct_opencount);
-	result = 1;
-      }
-
-  return result;
-}
-
-
-extern int foo (int a);
-int
-foo (int a)
-{
-  return a - 1;
-}
diff --git a/elf/ltglobmod1.c b/elf/ltglobmod1.c
deleted file mode 100644
index 300fa9a89f..0000000000
--- a/elf/ltglobmod1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern int bar (void);
-
-int
-bar (void)
-{
-  return 42;
-}
diff --git a/elf/ltglobmod2.c b/elf/ltglobmod2.c
deleted file mode 100644
index 33f14cc980..0000000000
--- a/elf/ltglobmod2.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-extern int bar (void);
-extern int foo (void);
-
-int
-foo (void)
-{
-  void *h;
-  int res;
-
-  /* Load ltglobalmod1 in the global namespace.  */
-  h = dlopen ("ltglobmod1.so", RTLD_GLOBAL | RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("%s: cannot open %s: %s",
-	      __FUNCTION__, "ltglobmod1.so", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  /* Call bar.  This is undefined in the DSO.  */
-  puts ("about to call `bar'");
-  fflush (stdout);
-  res = bar ();
-
-  printf ("bar returned %d\n", res);
-
-  dlclose (h);
-
-  return res != 42;
-}
diff --git a/elf/multiload.c b/elf/multiload.c
deleted file mode 100644
index e85cc96589..0000000000
--- a/elf/multiload.c
+++ /dev/null
@@ -1,105 +0,0 @@
-#include <dlfcn.h>
-#include <errno.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-int
-main (void)
-{
-  void *a;
-  void *b;
-  void *c;
-  void *d;
-  char *wd;
-  char *base;
-  char *buf;
-
-  mtrace ();
-
-  /* Change to the binary directory.  */
-  if (chdir (OBJDIR) != 0)
-    {
-      printf ("cannot change to `%s': %m", OBJDIR);
-      exit (EXIT_FAILURE);
-    }
-
-  wd = getcwd (NULL, 0);
-  base = basename (wd);
-  buf = alloca (strlen (wd) + strlen (base) + 5 + sizeof "testobj1.so");
-
-  printf ("loading `%s'\n", "./testobj1.so");
-  a = dlopen ("./testobj1.so", RTLD_NOW);
-  if (a == NULL)
-    {
-      printf ("cannot load `./testobj1.so': %s\n", dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  stpcpy (stpcpy (stpcpy (buf, "../"), base), "/testobj1.so");
-  printf ("loading `%s'\n", buf);
-  b = dlopen (buf, RTLD_NOW);
-  if (b == NULL)
-    {
-      printf ("cannot load `%s': %s\n", buf, dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  stpcpy (stpcpy (buf, wd), "/testobj1.so");
-  printf ("loading `%s'\n", buf);
-  c = dlopen (buf, RTLD_NOW);
-  if (c == NULL)
-    {
-      printf ("cannot load `%s': %s\n", buf, dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  stpcpy (stpcpy (stpcpy (stpcpy (buf, wd), "/../"), base), "/testobj1.so");
-  printf ("loading `%s'\n", buf);
-  d = dlopen (buf, RTLD_NOW);
-  if (d == NULL)
-    {
-      printf ("cannot load `%s': %s\n", buf, dlerror ());
-      exit (EXIT_FAILURE);
-    }
-
-  if (a != b || b != c || c != d)
-    {
-      puts ("shared object loaded more than once");
-      exit (EXIT_FAILURE);
-    }
-
-  if (dlclose (a) != 0)
-    {
-      puts ("closing `a' failed");
-      exit (EXIT_FAILURE);
-    }
-  if (dlclose (b) != 0)
-    {
-      puts ("closing `a' failed");
-      exit (EXIT_FAILURE);
-    }
-  if (dlclose (c) != 0)
-    {
-      puts ("closing `a' failed");
-      exit (EXIT_FAILURE);
-    }
-  if (dlclose (d) != 0)
-    {
-      puts ("closing `a' failed");
-      exit (EXIT_FAILURE);
-    }
-
-  free (wd);
-
-  return 0;
-}
-
-extern int foo (int a);
-int
-foo (int a)
-{
-  return a;
-}
diff --git a/elf/neededobj1.c b/elf/neededobj1.c
deleted file mode 100644
index eb55adab39..0000000000
--- a/elf/neededobj1.c
+++ /dev/null
@@ -1,6 +0,0 @@
-extern void c_function (void);
-
-void
-c_function (void)
-{
-}
diff --git a/elf/neededobj2.c b/elf/neededobj2.c
deleted file mode 100644
index 5ad8a51d62..0000000000
--- a/elf/neededobj2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern void b_function (void);
-extern void c_function (void);
-
-void
-b_function (void)
-{
-  c_function();
-}
diff --git a/elf/neededobj3.c b/elf/neededobj3.c
deleted file mode 100644
index da25329aa7..0000000000
--- a/elf/neededobj3.c
+++ /dev/null
@@ -1,10 +0,0 @@
-extern void a_function (void);
-extern void b_function (void);
-extern void c_function (void);
-
-void
-a_function (void)
-{
-  b_function ();
-  c_function ();
-}
diff --git a/elf/neededobj4.c b/elf/neededobj4.c
deleted file mode 100644
index 3ea8540047..0000000000
--- a/elf/neededobj4.c
+++ /dev/null
@@ -1,12 +0,0 @@
-extern void a_function (void);
-extern void b_function (void);
-extern void c_function (void);
-extern void d_function (void);
-
-void
-d_function (void)
-{
-  a_function ();
-  b_function ();
-  c_function ();
-}
diff --git a/elf/neededobj5.c b/elf/neededobj5.c
deleted file mode 100644
index 2d629b0880..0000000000
--- a/elf/neededobj5.c
+++ /dev/null
@@ -1,5 +0,0 @@
-extern void a1_function (void);
-
-void a1_function (void)
-{
-}
diff --git a/elf/neededobj6.c b/elf/neededobj6.c
deleted file mode 100644
index 639b6f195e..0000000000
--- a/elf/neededobj6.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern void a1_function (void);
-extern void a2_function (void);
-
-void a2_function (void)
-{
-  a1_function ();
-}
diff --git a/elf/neededtest.c b/elf/neededtest.c
deleted file mode 100644
index 3cea499314..0000000000
--- a/elf/neededtest.c
+++ /dev/null
@@ -1,125 +0,0 @@
-#include <dlfcn.h>
-#include <libintl.h>
-#include <link.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define MAPS ((struct link_map *) _r_debug.r_map)
-
-static int
-check_loaded_objects (const char **loaded)
-{
-  struct link_map *lm;
-  int n;
-  int *found = NULL;
-  int errors = 0;
-
-  for (n = 0; loaded[n]; n++)
-    /* NOTHING */;
-
-  if (n)
-    {
-      found = (int *) alloca (sizeof (int) * n);
-      memset (found, 0, sizeof (int) * n);
-    }
-
-  printf("   Name\n");
-  printf(" --------------------------------------------------------\n");
-  for (lm = MAPS; lm; lm = lm->l_next)
-    {
-      if (lm->l_name && lm->l_name[0])
-	printf(" %s, count = %d\n", lm->l_name, (int) lm->l_direct_opencount);
-      if (lm->l_type == lt_loaded && lm->l_name)
-	{
-	  int match = 0;
-	  for (n = 0; loaded[n] != NULL; n++)
-	    {
-	      if (strcmp (basename (loaded[n]), basename (lm->l_name)) == 0)
-	        {
-		  found[n] = 1;
-		  match = 1;
-		  break;
-		}
-	    }
-
-	  if (match == 0)
-	    {
-	      ++errors;
-	      printf ("ERRORS: %s is not unloaded\n", lm->l_name);
-	    }
-	}
-    }
-
-  for (n = 0; loaded[n] != NULL; n++)
-    {
-      if (found[n] == 0)
-        {
-	  ++errors;
-	  printf ("ERRORS: %s is not loaded\n", loaded[n]);
-	}
-    }
-
-  return errors;
-}
-
-int
-main (void)
-{
-  void *obj2[2];
-  void *obj3;
-  const char *loaded[] = { NULL, NULL, NULL, NULL };
-  int errors = 0;
-
-  printf ("\nThis is what is in memory now:\n");
-  errors += check_loaded_objects (loaded);
-
-  printf( "Loading shared object neededobj3.so\n");
-  obj3 = dlopen( "neededobj3.so", RTLD_LAZY);
-  if (obj3 == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  loaded[0] = "neededobj1.so";
-  loaded[1] = "neededobj2.so";
-  loaded[2] = "neededobj3.so";
-  errors += check_loaded_objects (loaded);
-
-  printf ("Now loading shared object neededobj2.so\n");
-  obj2[0] = dlopen ("neededobj2.so", RTLD_LAZY);
-  if (obj2[0] == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  errors += check_loaded_objects (loaded);
-
-  printf ("And loading shared object neededobj2.so again\n");
-  obj2[1] = dlopen ("neededobj2.so", RTLD_LAZY);
-  if (obj2[1] == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  errors += check_loaded_objects (loaded);
-
-  printf ("Closing neededobj2.so for the first time\n");
-  dlclose (obj2[0]);
-  errors += check_loaded_objects (loaded);
-
-  printf ("Closing neededobj3.so\n");
-  dlclose (obj3);
-  loaded[2] = NULL;
-  errors += check_loaded_objects (loaded);
-
-  printf ("Closing neededobj2.so for the second time\n");
-  dlclose (obj2[1]);
-  loaded[0] = NULL;
-  loaded[1] = NULL;
-  errors += check_loaded_objects (loaded);
-
-  if (errors != 0)
-    printf ("%d errors found\n", errors);
-  return errors;
-}
diff --git a/elf/neededtest2.c b/elf/neededtest2.c
deleted file mode 100644
index 17c75f2ba3..0000000000
--- a/elf/neededtest2.c
+++ /dev/null
@@ -1,118 +0,0 @@
-#include <dlfcn.h>
-#include <libintl.h>
-#include <link.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define MAPS ((struct link_map *) _r_debug.r_map)
-
-static int
-check_loaded_objects (const char **loaded)
-{
-  struct link_map *lm;
-  int n;
-  int *found = NULL;
-  int errors = 0;
-
-  for (n = 0; loaded[n]; n++)
-    /* NOTHING */;
-
-  if (n)
-    {
-      found = (int *) alloca (sizeof (int) * n);
-      memset (found, 0, sizeof (int) * n);
-    }
-
-  printf("   Name\n");
-  printf(" --------------------------------------------------------\n");
-  for (lm = MAPS; lm; lm = lm->l_next)
-    {
-      if (lm->l_name && lm->l_name[0])
-	printf(" %s, count = %d\n", lm->l_name, (int) lm->l_direct_opencount);
-      if (lm->l_type == lt_loaded && lm->l_name)
-	{
-	  int match = 0;
-	  for (n = 0; loaded[n] != NULL; n++)
-	    {
-	      if (strcmp (basename (loaded[n]), basename (lm->l_name)) == 0)
-	        {
-		  found[n] = 1;
-		  match = 1;
-		  break;
-		}
-	    }
-
-	  if (match == 0)
-	    {
-	      ++errors;
-	      printf ("ERRORS: %s is not unloaded\n", lm->l_name);
-	    }
-	}
-    }
-
-  for (n = 0; loaded[n] != NULL; n++)
-    {
-      if (found[n] == 0)
-        {
-	  ++errors;
-	  printf ("ERRORS: %s is not loaded\n", loaded[n]);
-	}
-    }
-
-  return errors;
-}
-
-int
-main (void)
-{
-  void *obj2;
-  void *obj3[2];
-  const char *loaded[] = { NULL, NULL, NULL, NULL };
-  int errors = 0;
-
-  printf ("\nThis is what is in memory now:\n");
-  errors += check_loaded_objects (loaded);
-  printf ("\nLoading shared object neededobj2.so\n");
-  obj2 = dlopen ("neededobj2.so", RTLD_LAZY);
-  if (obj2 == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  loaded[0] = "neededobj1.so";
-  loaded[1] = "neededobj2.so";
-  errors += check_loaded_objects (loaded);
-  printf ("\nLoading shared object neededobj3.so\n");
-  obj3[0] = dlopen( "neededobj3.so", RTLD_LAZY);
-  if (obj3[0] == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  loaded[2] = "neededobj3.so";
-  errors += check_loaded_objects (loaded);
-  printf ("\nNow loading shared object neededobj3.so again\n");
-  obj3[1] = dlopen ("neededobj3.so", RTLD_LAZY);
-  if (obj3[1] == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  errors += check_loaded_objects (loaded);
-  printf ("\nClosing neededobj3.so once\n");
-  dlclose (obj3[0]);
-  errors += check_loaded_objects (loaded);
-  printf ("\nClosing neededobj2.so\n");
-  dlclose (obj2);
-  errors += check_loaded_objects (loaded);
-  printf ("\nClosing neededobj3.so for the second time\n");
-  dlclose (obj3[1]);
-  loaded[0] = NULL;
-  loaded[1] = NULL;
-  loaded[2] = NULL;
-  errors += check_loaded_objects (loaded);
-  if (errors != 0)
-    printf ("%d errors found\n", errors);
-  return errors;
-}
diff --git a/elf/neededtest3.c b/elf/neededtest3.c
deleted file mode 100644
index 41970cf2c7..0000000000
--- a/elf/neededtest3.c
+++ /dev/null
@@ -1,129 +0,0 @@
-#include <dlfcn.h>
-#include <libintl.h>
-#include <link.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define MAPS ((struct link_map *) _r_debug.r_map)
-
-static int
-check_loaded_objects (const char **loaded)
-{
-  struct link_map *lm;
-  int n;
-  int *found = NULL;
-  int errors = 0;
-
-  for (n = 0; loaded[n]; n++)
-    /* NOTHING */;
-
-  if (n)
-    {
-      found = (int *) alloca (sizeof (int) * n);
-      memset (found, 0, sizeof (int) * n);
-    }
-
-  printf("   Name\n");
-  printf(" --------------------------------------------------------\n");
-  for (lm = MAPS; lm; lm = lm->l_next)
-    {
-      if (lm->l_name && lm->l_name[0])
-	printf(" %s, count = %d\n", lm->l_name, (int) lm->l_direct_opencount);
-      if (lm->l_type == lt_loaded && lm->l_name)
-	{
-	  int match = 0;
-	  for (n = 0; loaded[n] != NULL; n++)
-	    {
-	      if (strcmp (basename (loaded[n]), basename (lm->l_name)) == 0)
-	        {
-		  found[n] = 1;
-		  match = 1;
-		  break;
-		}
-	    }
-
-	  if (match == 0)
-	    {
-	      ++errors;
-	      printf ("ERRORS: %s is not unloaded\n", lm->l_name);
-	    }
-	}
-    }
-
-  for (n = 0; loaded[n] != NULL; n++)
-    {
-      if (found[n] == 0)
-        {
-	  ++errors;
-	  printf ("ERRORS: %s is not loaded\n", loaded[n]);
-	}
-    }
-
-  return errors;
-}
-
-int
-main (void)
-{
-  void *obj2;
-  void *obj3;
-  void *obj4;
-  const char *loaded[] = { NULL, NULL, NULL, NULL, NULL };
-  int errors = 0;
-
-  printf ("\nThis is what is in memory now:\n");
-  errors += check_loaded_objects (loaded);
-
-  printf ("Now loading shared object neededobj2.so\n");
-  obj2 = dlopen ("neededobj2.so", RTLD_LAZY);
-  if (obj2 == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  loaded[0] = "neededobj1.so";
-  loaded[1] = "neededobj2.so";
-  errors += check_loaded_objects (loaded);
-
-  printf( "Loading shared object neededobj3.so\n");
-  obj3 = dlopen( "neededobj3.so", RTLD_LAZY);
-  if (obj3 == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  loaded[2] = "neededobj3.so";
-  errors += check_loaded_objects (loaded);
-
-
-  printf( "Loading shared object neededobj4.so\n");
-  obj4 = dlopen( "neededobj4.so", RTLD_LAZY);
-  if (obj4 == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  loaded[3] = "neededobj4.so";
-  errors += check_loaded_objects (loaded);
-
-  printf ("Closing neededobj2.so\n");
-  dlclose (obj2);
-  errors += check_loaded_objects (loaded);
-
-  printf ("Closing neededobj3.so\n");
-  dlclose (obj3);
-  errors += check_loaded_objects (loaded);
-
-  printf ("Closing neededobj4.so\n");
-  dlclose (obj4);
-  loaded[0] = NULL;
-  loaded[1] = NULL;
-  loaded[2] = NULL;
-  loaded[3] = NULL;
-  errors += check_loaded_objects (loaded);
-
-  if (errors != 0)
-    printf ("%d errors found\n", errors);
-  return errors;
-}
diff --git a/elf/neededtest4.c b/elf/neededtest4.c
deleted file mode 100644
index 0ae0b7ff47..0000000000
--- a/elf/neededtest4.c
+++ /dev/null
@@ -1,158 +0,0 @@
-#include <dlfcn.h>
-#include <libintl.h>
-#include <link.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define MAPS ((struct link_map *) _r_debug.r_map)
-
-static int
-check_loaded_objects (const char **loaded)
-{
-  struct link_map *lm;
-  int n;
-  int *found = NULL;
-  int errors = 0;
-
-  for (n = 0; loaded[n]; n++)
-    /* NOTHING */;
-
-  if (n)
-    {
-      found = (int *) alloca (sizeof (int) * n);
-      memset (found, 0, sizeof (int) * n);
-    }
-
-  printf("   Name\n");
-  printf(" --------------------------------------------------------\n");
-  for (lm = MAPS; lm; lm = lm->l_next)
-    {
-      if (lm->l_name && lm->l_name[0])
-	printf(" %s, count = %d\n", lm->l_name, (int) lm->l_direct_opencount);
-      if (lm->l_type == lt_loaded && lm->l_name)
-	{
-	  int match = 0;
-	  for (n = 0; loaded[n] != NULL; n++)
-	    {
-	      if (strcmp (basename (loaded[n]), basename (lm->l_name)) == 0)
-		{
-		  found[n] = 1;
-		  match = 1;
-		  break;
-		}
-	    }
-
-	  if (match == 0)
-	    {
-	      ++errors;
-	      printf ("ERRORS: %s is not unloaded\n", lm->l_name);
-	    }
-	}
-    }
-
-  for (n = 0; loaded[n] != NULL; n++)
-    {
-      if (found[n] == 0)
-	{
-	  ++errors;
-	  printf ("ERRORS: %s is not loaded\n", loaded[n]);
-	}
-    }
-
-  return errors;
-}
-
-extern void c_function (void);
-extern char *dirname (const char *__filename);
-
-int
-main (int argc, char **argv)
-{
-  void *obj;
-  const char *loaded[] = { NULL, NULL, NULL};
-  int errors = 0;
-  void (*f) (void);
-  const char *dir = dirname (argv [0]);
-  char *oldfilename;
-  char *newfilename;
-
-  c_function ();
-
-  printf ("\nThis is what is in memory now:\n");
-  errors += check_loaded_objects (loaded);
-
-  printf( "Loading shared object neededobj6.so\n");
-  obj = dlopen( "neededobj6.so", RTLD_LAZY);
-  if (obj == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  f = dlsym (obj, "a2_function");
-  if (f == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  f ();
-  loaded[0] = "neededobj5.so";
-  loaded[1] = "neededobj6.so";
-  errors += check_loaded_objects (loaded);
-
-  printf ("Closing neededobj6.so\n");
-  dlclose (obj);
-  loaded[0] = NULL;
-  errors += check_loaded_objects (loaded);
-
-  printf ("Rename neededobj5.so\n");
-  oldfilename = alloca (strlen (dir) + 1 + sizeof ("neededobj5.so"));
-  strcpy (oldfilename, dir);
-  strcat (oldfilename, "/");
-  strcat (oldfilename, "neededobj5.so");
-  newfilename = alloca (strlen (oldfilename) + sizeof (".renamed"));
-  strcpy (newfilename, oldfilename);
-  strcat (newfilename, ".renamed");
-  if (rename (oldfilename, newfilename))
-    {
-      perror ("rename");
-      exit (1);
-    }
-
-  printf( "Loading shared object neededobj6.so\n");
-  obj = dlopen( "neededobj6.so", RTLD_LAZY);
-  if (obj == NULL)
-    printf ("%s\n", dlerror ());
-  else
-    {
-      printf ("neededobj6.so should fail to load\n");
-      exit (1);
-    }
-
-  printf( "Loading shared object neededobj1.so\n");
-  obj = dlopen( "neededobj1.so", RTLD_LAZY);
-  if (obj == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  errors += check_loaded_objects (loaded);
-  f = dlsym (obj, "c_function");
-  if (f == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  f ();
-
-  printf ("Restore neededobj5.so\n");
-  if (rename (newfilename, oldfilename))
-    {
-      perror ("rename");
-      exit (1);
-    }
-
-  if (errors != 0)
-    printf ("%d errors found\n", errors);
-  return errors;
-}
diff --git a/elf/next.c b/elf/next.c
deleted file mode 100644
index a0d532b8c3..0000000000
--- a/elf/next.c
+++ /dev/null
@@ -1,43 +0,0 @@
-#include <stdio.h>
-
-
-extern int successful_rtld_next_test (void);
-extern void *failing_rtld_next_use (void);
-
-
-static int
-do_test (void)
-{
-  int result;
-  void *addr;
-
-  /* First try call a function which uses RTLD_NEXT and calls that
-     function.  */
-  result = successful_rtld_next_test ();
-  if (result == 42)
-    {
-      puts ("RTLD_NEXT seems to work for existing functions");
-      result = 0;
-    }
-  else
-    {
-      printf ("Heh?  `successful_rtld_next_test' returned %d\n", result);
-      result = 1;
-    }
-
-  /* Next try a function which tries to get a function with RTLD_NEXT
-     but that fails.  This dlsym() call should return a NULL pointer
-     and do nothing else.  */
-  addr = failing_rtld_next_use ();
-  if (addr == NULL)
-    puts ("dlsym returned NULL for non-existing function.  Good");
-  else
-    {
-      puts ("dlsym found something !?");
-      result = 1;
-    }
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/nextmod1.c b/elf/nextmod1.c
deleted file mode 100644
index 56de3536a0..0000000000
--- a/elf/nextmod1.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <dlfcn.h>
-
-extern int successful_rtld_next_test (void);
-extern void *failing_rtld_next_use (void);
-
-int nextmod1_dummy_var;
-
-int
-successful_rtld_next_test (void)
-{
-  int (*fp) (void);
-
-  /* Get the next function... */
-  fp = (int (*) (void)) dlsym (RTLD_NEXT, __FUNCTION__);
-
-  /* ...and simply call it.  */
-  return fp ();
-}
-
-
-void *
-failing_rtld_next_use (void)
-{
-  void *ret = dlsym (RTLD_NEXT, __FUNCTION__);
-
-  /* Ensure we are not tail call optimized, because then RTLD_NEXT
-     might return this function.  */
-  ++nextmod1_dummy_var;
-  return ret;
-}
diff --git a/elf/nextmod2.c b/elf/nextmod2.c
deleted file mode 100644
index b2c435f341..0000000000
--- a/elf/nextmod2.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Very elaborated function.  */
-
-extern int successful_rtld_next_test (void);
-
-
-int
-successful_rtld_next_test (void)
-{
-  return 42;
-}
diff --git a/elf/nodel2mod1.c b/elf/nodel2mod1.c
deleted file mode 100644
index acddc4cf8b..0000000000
--- a/elf/nodel2mod1.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <stdlib.h>
-void
-foo (void)
-{
-  exit (0);
-}
-
-void
-__attribute__((destructor))
-bar (void)
-{
-  static int i;
-  foo ();
-  ++i;
-}
-void
-baz (void)
-{
-}
diff --git a/elf/nodel2mod2.c b/elf/nodel2mod2.c
deleted file mode 100644
index d0020240a8..0000000000
--- a/elf/nodel2mod2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-void
-__attribute__((constructor))
-xxx (void)
-{
-  extern void baz (void);
-  baz ();
-}
diff --git a/elf/nodel2mod3.c b/elf/nodel2mod3.c
deleted file mode 100644
index 6d1a0d47b7..0000000000
--- a/elf/nodel2mod3.c
+++ /dev/null
@@ -1 +0,0 @@
-int x;
diff --git a/elf/nodelete.c b/elf/nodelete.c
deleted file mode 100644
index c8d71152f2..0000000000
--- a/elf/nodelete.c
+++ /dev/null
@@ -1,210 +0,0 @@
-#include <dlfcn.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdio.h>
-
-
-static sigjmp_buf jmpbuf;
-
-
-int fini_ran;
-
-
-static void
-__attribute__ ((noreturn))
-handler (int sig)
-{
-  siglongjmp (jmpbuf, 1);
-}
-
-
-static int
-do_test (void)
-{
-  /* We are testing the two possibilities to mark an object as not deletable:
-     - marked on the linker commandline with `-z nodelete'
-     - with the RTLD_NODELETE flag at dlopen()-time.
-
-     The test we are performing should be safe.  We are loading the objects,
-     get the address of variables in the respective object, unload the object
-     and then try to read the variable.  If the object is unloaded this
-     should lead to an segmentation fault.  */
-  int result = 0;
-  void *p;
-  struct sigaction sa;
-
-  sa.sa_handler = handler;
-  sigfillset (&sa.sa_mask);
-  sa.sa_flags = SA_RESTART;
-
-  if (sigaction (SIGSEGV, &sa, NULL) == -1)
-    printf ("cannot install signal handler: %m\n");
-
-  p = dlopen ("nodelmod1.so", RTLD_LAZY);
-  if (p == NULL)
-    {
-      printf ("failed to load \"nodelmod1.so\": %s\n", dlerror ());
-      result = 1;
-    }
-  else
-    {
-      int *varp;
-
-      puts ("succeeded loading \"nodelmod1.so\"");
-
-      varp = dlsym (p, "var1");
-      if (varp == NULL)
-	{
-	  puts ("failed to get address of \"var1\" in \"nodelmod1.so\"");
-	  result = 1;
-	}
-      else
-	{
-	  *varp = 20000720;
-
-	  /* Now close the object.  */
-	  fini_ran = 0;
-	  if (dlclose (p) != 0)
-	    {
-	      puts ("failed to close \"nodelmod1.so\"");
-	      result = 1;
-	    }
-	  else if (! sigsetjmp (jmpbuf, 1))
-	    {
-	      /* Access the variable again.  */
-	      if (*varp != 20000720)
-		{
-		  puts ("\"var1\" value not correct");
-		  result = 1;
-		}
-	      else if (fini_ran != 0)
-		{
-		  puts ("destructor of \"nodelmod1.so\" ran");
-		  result = 1;
-		}
-	      else
-		puts ("-z nodelete test succeeded");
-	    }
-	  else
-	    {
-	      /* We caught an segmentation fault.  */
-	      puts ("\"nodelmod1.so\" got deleted");
-	      result = 1;
-	    }
-	}
-    }
-
-  p = dlopen ("nodelmod2.so", RTLD_LAZY | RTLD_NODELETE);
-  if (p == NULL)
-    {
-      printf ("failed to load \"nodelmod2.so\": %s\n", dlerror ());
-      result = 1;
-    }
-  else
-    {
-      int *varp;
-
-      puts ("succeeded loading \"nodelmod2.so\"");
-
-      varp = dlsym (p, "var2");
-      if (varp == NULL)
-	{
-	  puts ("failed to get address of \"var2\" in \"nodelmod2.so\"");
-	  result = 1;
-	}
-      else
-	{
-	  *varp = 42;
-
-	  /* Now close the object.  */
-	  fini_ran = 0;
-	  if (dlclose (p) != 0)
-	    {
-	      puts ("failed to close \"nodelmod2.so\"");
-	      result = 1;
-	    }
-	  else if (! sigsetjmp (jmpbuf, 1))
-	    {
-	      /* Access the variable again.  */
-	      if (*varp != 42)
-		{
-		  puts ("\"var2\" value not correct");
-		  result = 1;
-		}
-	      else if (fini_ran != 0)
-		{
-		  puts ("destructor of \"nodelmod2.so\" ran");
-		  result = 1;
-		}
-	      else
-		puts ("RTLD_NODELETE test succeeded");
-	    }
-	  else
-	    {
-	      /* We caught an segmentation fault.  */
-	      puts ("\"nodelmod2.so\" got deleted");
-	      result = 1;
-	    }
-	}
-    }
-
-  p = dlopen ("nodelmod3.so", RTLD_LAZY);
-  if (p == NULL)
-    {
-      printf ("failed to load \"nodelmod3.so\": %s\n", dlerror ());
-      result = 1;
-    }
-  else
-    {
-      int *(*fctp) (void);
-
-      puts ("succeeded loading \"nodelmod3.so\"");
-
-      fctp = dlsym (p, "addr");
-      if (fctp == NULL)
-	{
-	  puts ("failed to get address of \"addr\" in \"nodelmod3.so\"");
-	  result = 1;
-	}
-      else
-	{
-	  int *varp = fctp ();
-
-	  *varp = -1;
-
-	  /* Now close the object.  */
-	  fini_ran = 0;
-	  if (dlclose (p) != 0)
-	    {
-	      puts ("failed to close \"nodelmod3.so\"");
-	      result = 1;
-	    }
-	  else if (! sigsetjmp (jmpbuf, 1))
-	    {
-	      /* Access the variable again.  */
-	      if (*varp != -1)
-		{
-		  puts ("\"var_in_mod4\" value not correct");
-		  result = 1;
-		}
-	      else if (fini_ran != 0)
-		{
-		  puts ("destructor of \"nodelmod4.so\" ran");
-		  result = 1;
-		}
-	      else
-		puts ("-z nodelete in dependency succeeded");
-	    }
-	  else
-	    {
-	      /* We caught an segmentation fault.  */
-	      puts ("\"nodelmod4.so\" got deleted");
-	      result = 1;
-	    }
-	}
-    }
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/nodelete2.c b/elf/nodelete2.c
deleted file mode 100644
index b3d7e31a08..0000000000
--- a/elf/nodelete2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <dlfcn.h>
-
-int
-main (void)
-{
-  void *handle = dlopen ("nodel2mod3.so", RTLD_LAZY);
-  if (handle == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  dlclose (handle);
-  exit (1);
-}
diff --git a/elf/nodelmod1.c b/elf/nodelmod1.c
deleted file mode 100644
index fc24a7b172..0000000000
--- a/elf/nodelmod1.c
+++ /dev/null
@@ -1,9 +0,0 @@
-int var1 = 42;
-
-static void
-__attribute__ ((__destructor__))
-destr (void)
-{
-  extern int fini_ran;
-  fini_ran = 1;
-}
diff --git a/elf/nodelmod2.c b/elf/nodelmod2.c
deleted file mode 100644
index 6bd7108a13..0000000000
--- a/elf/nodelmod2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-int var2 = 100;
-
-static void
-__attribute__ ((__destructor__))
-destr (void)
-{
-  extern int fini_ran;
-  fini_ran = 1;
-}
diff --git a/elf/nodelmod3.c b/elf/nodelmod3.c
deleted file mode 100644
index 817c94db6e..0000000000
--- a/elf/nodelmod3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern int var_in_mod4;
-extern int *addr (void);
-
-int *
-addr (void)
-{
-  return &var_in_mod4;
-}
diff --git a/elf/nodelmod4.c b/elf/nodelmod4.c
deleted file mode 100644
index 2cca43a6e8..0000000000
--- a/elf/nodelmod4.c
+++ /dev/null
@@ -1,9 +0,0 @@
-int var_in_mod4 = 99;
-
-static void
-__attribute__ ((__destructor__))
-destr (void)
-{
-  extern int fini_ran;
-  fini_ran = 1;
-}
diff --git a/elf/nodlopen.c b/elf/nodlopen.c
deleted file mode 100644
index 642bdb3011..0000000000
--- a/elf/nodlopen.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-main (void)
-{
-  if (dlopen ("nodlopenmod.so", RTLD_LAZY) != NULL)
-    {
-      puts ("opening \"nodlopenmod.so\" succeeded, FAIL");
-      return 1;
-    }
-
-  puts ("opening \"nodlopenmod.so\" failed, OK");
-  return 0;
-}
diff --git a/elf/nodlopen2.c b/elf/nodlopen2.c
deleted file mode 100644
index a223f36834..0000000000
--- a/elf/nodlopen2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-main (void)
-{
-  if (dlopen ("nodlopenmod2.so", RTLD_LAZY) != NULL)
-    {
-      puts ("opening \"nodlopenmod2.so\" succeeded, FAIL");
-      return 1;
-    }
-
-  puts ("opening \"nodlopenmod2.so\" failed, OK");
-  return 0;
-}
diff --git a/elf/nodlopenmod.c b/elf/nodlopenmod.c
deleted file mode 100644
index 4bcf8c9786..0000000000
--- a/elf/nodlopenmod.c
+++ /dev/null
@@ -1 +0,0 @@
-int a = 42;
diff --git a/elf/nodlopenmod2.c b/elf/nodlopenmod2.c
deleted file mode 100644
index e72ae53e95..0000000000
--- a/elf/nodlopenmod2.c
+++ /dev/null
@@ -1,9 +0,0 @@
-extern int a;
-
-extern int foo (void);
-
-int
-foo (void)
-{
-  return a;
-}
diff --git a/elf/noload.c b/elf/noload.c
deleted file mode 100644
index bcc85efc27..0000000000
--- a/elf/noload.c
+++ /dev/null
@@ -1,81 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <mcheck.h>
-
-int
-main (void)
-{
-  int result = 0;
-  void *p;
-
-  mtrace ();
-
-  /* First try to load an object which is a dependency.  This should
-     succeed.  */
-  p = dlopen ("testobj1.so", RTLD_LAZY | RTLD_NOLOAD);
-  if (p == NULL)
-    {
-      printf ("cannot open \"testobj1.so\": %s\n", dlerror ());
-      result = 1;
-    }
-  else
-    {
-      puts ("loading \"testobj1.so\" succeeded, OK");
-      dlclose (p);
-    }
-
-  /* Now try loading an object which is not already loaded.  */
-  if (dlopen ("testobj5.so", RTLD_LAZY | RTLD_NOLOAD) != NULL)
-    {
-      puts ("succeeded in loading \"testobj5.so\"");
-      result = 1;
-    }
-  else
-    {
-      /* Load the object and run the same test again.  */
-      puts ("\"testobj5.so\" wasn't loaded and RTLD_NOLOAD prevented it, OK");
-
-      p = dlopen ("testobj5.so", RTLD_LAZY);
-
-      if (p == NULL)
-	{
-	  printf ("cannot open \"testobj5.so\" without RTLD_NOLOAD: %s\n",
-		  dlerror ());
-	  result = 1;
-	}
-      else
-	{
-	  puts ("loading \"testobj5.so\" succeeded, OK");
-
-	  void *q = dlopen ("testobj5.so", RTLD_LAZY | RTLD_NOLOAD);
-	  if (q == NULL)
-	    {
-	      printf ("cannot open \"testobj5.so\": %s\n", dlerror ());
-	      result = 1;
-	    }
-	  else
-	    {
-	      puts ("loading \"testobj5.so\" with RTLD_NOLOAD succeeded, OK");
-	      dlclose (q);
-	    }
-
-	  if (dlclose (p) != 0)
-	    {
-	      printf ("cannot close \"testobj5.so\": %s\n", dlerror ());
-	      result = 1;
-	    }
-	  else
-	    puts ("closing \"testobj5.so\" succeeded, OK");
-	}
-    }
-
-  return result;
-}
-
-
-extern int foo (int a);
-int
-foo (int a)
-{
-  return 42 + a;
-}
diff --git a/elf/order.c b/elf/order.c
deleted file mode 100644
index ca617cbc09..0000000000
--- a/elf/order.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <unistd.h>
-
-void init (void) __attribute__ ((constructor));
-void
-__attribute__ ((constructor))
-init (void)
-{
-  write (1, "4", 1);
-}
-
-void fini (void) __attribute__ ((destructor));
-void
-__attribute__ ((destructor))
-fini (void)
-{
-  write (1, "5", 1);
-}
-
-extern int dep1 (void);
-
-int
-main (void)
-{
-  return dep1 () != 42;
-}
diff --git a/elf/order2.c b/elf/order2.c
deleted file mode 100644
index bcf266d5b1..0000000000
--- a/elf/order2.c
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-
-int call_puts;
-
-static int
-do_test (void)
-{
-  call_puts = 1;
-
-  void *h1 = dlopen ("$ORIGIN/order2mod1.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (h1 == NULL)
-    {
-      puts ("cannot load order2mod1");
-      return 1;
-    }
-  void *h2 = dlopen ("$ORIGIN/order2mod2.so", RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      puts ("cannot load order2mod2");
-      return 1;
-    }
-  if (dlclose (h1) != 0)
-    {
-      puts ("dlclose order2mod1 failed");
-      return 1;
-    }
-  if (dlclose (h2) != 0)
-    {
-      puts ("dlclose order2mod2 failed");
-      return 1;
-    }
-  return 0;
-}
-
-#include <support/test-driver.c>
-
-static void
-__attribute__ ((destructor))
-fini (void)
-{
-  if (call_puts)
-    puts ("5");
-}
diff --git a/elf/order2mod1.c b/elf/order2mod1.c
deleted file mode 100644
index b695db29b7..0000000000
--- a/elf/order2mod1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-static void
-__attribute__ ((destructor))
-fini (void)
-{
-  putchar ('1');
-}
diff --git a/elf/order2mod2.c b/elf/order2mod2.c
deleted file mode 100644
index 026cd2acc4..0000000000
--- a/elf/order2mod2.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <stdio.h>
-
-extern int foo (void);
-extern int bar (void);
-
-void
-__attribute__ ((constructor))
-init (void)
-{
-  (void) (foo () - bar ());
-}
-
-static void
-__attribute__ ((destructor))
-fini (void)
-{
-  putchar ('2');
-}
diff --git a/elf/order2mod3.c b/elf/order2mod3.c
deleted file mode 100644
index 7913a79925..0000000000
--- a/elf/order2mod3.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-int
-bar (void)
-{
-  return 1;
-}
-
-static void
-__attribute__ ((destructor))
-fini (void)
-{
-  putchar ('4');
-}
diff --git a/elf/order2mod4.c b/elf/order2mod4.c
deleted file mode 100644
index 4f2026f041..0000000000
--- a/elf/order2mod4.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern int bar (void);
-
-int
-foo (void)
-{
-  return 42 + bar ();
-}
-
-static void
-__attribute__ ((destructor))
-fini (void)
-{
-  putchar ('3');
-}
diff --git a/elf/origtest.c b/elf/origtest.c
deleted file mode 100644
index 1cacabcc39..0000000000
--- a/elf/origtest.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <dlfcn.h>
-#include <error.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  void *h;
-  int (*fp) (int);
-  int res;
-
-  h = dlopen ("${ORIGIN}/testobj1.so", RTLD_LAZY);
-  if (h == NULL)
-    error (EXIT_FAILURE, 0, "while loading `%s': %s", "testobj1.so",
-	   dlerror ());
-
-  fp = dlsym (h, "obj1func1");
-  if (fp == NULL)
-    error (EXIT_FAILURE, 0, "getting `obj1func1' in `%s': %s",
-	   "testobj1.so", dlerror ());
-
-  res = fp (10);
-  printf ("fp(10) = %d\n", res);
-
-  if (dlclose (h) != 0)
-    error (EXIT_FAILURE, 0, "while close `%s': %s",
-	   "testobj1.so", dlerror ());
-
-  return res != 42;
-}
-
-
-extern int foo (int a);
-int
-foo (int a)
-{
-  return a + 10;
-}
diff --git a/elf/pathoptobj.c b/elf/pathoptobj.c
deleted file mode 100644
index a452c2d7d4..0000000000
--- a/elf/pathoptobj.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern int in_renamed (int);
-
-
-int
-in_renamed (int a)
-{
-  return a - 10;
-}
diff --git a/elf/pldd-xx.c b/elf/pldd-xx.c
deleted file mode 100644
index 5ce0bce4c9..0000000000
--- a/elf/pldd-xx.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* Copyright (C) 2011-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@gmail.com>, 2011.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#define E(name) E_(name, CLASS)
-#define E_(name, cl) E__(name, cl)
-#define E__(name, cl) name##cl
-#define EW(type) EW_(Elf, CLASS, type)
-#define EW_(e, w, t) EW__(e, w, _##t)
-#define EW__(e, w, t) e##w##t
-
-#define pldd_assert(name, exp) \
-  typedef int __assert_##name[((exp) != 0) - 1]
-
-
-struct E(link_map)
-{
-  EW(Addr) l_addr;
-  EW(Addr) l_name;
-  EW(Addr) l_ld;
-  EW(Addr) l_next;
-  EW(Addr) l_prev;
-  EW(Addr) l_real;
-  Lmid_t l_ns;
-  EW(Addr) l_libname;
-};
-#if CLASS == __ELF_NATIVE_CLASS
-pldd_assert (l_addr, (offsetof (struct link_map, l_addr)
-			== offsetof (struct E(link_map), l_addr)));
-pldd_assert (l_name, (offsetof (struct link_map, l_name)
-			== offsetof (struct E(link_map), l_name)));
-pldd_assert (l_next, (offsetof (struct link_map, l_next)
-			== offsetof (struct E(link_map), l_next)));
-#endif
-
-
-struct E(libname_list)
-{
-  EW(Addr) name;
-  EW(Addr) next;
-};
-#if CLASS == __ELF_NATIVE_CLASS
-pldd_assert (name, (offsetof (struct libname_list, name)
-		      == offsetof (struct E(libname_list), name)));
-pldd_assert (next, (offsetof (struct libname_list, next)
-		      == offsetof (struct E(libname_list), next)));
-#endif
-
-struct E(r_debug)
-{
-  int r_version;
-#if CLASS == 64
-  int pad;
-#endif
-  EW(Addr) r_map;
-};
-#if CLASS == __ELF_NATIVE_CLASS
-pldd_assert (r_version, (offsetof (struct r_debug, r_version)
-			   == offsetof (struct E(r_debug), r_version)));
-pldd_assert (r_map, (offsetof (struct r_debug, r_map)
-		       == offsetof (struct E(r_debug), r_map)));
-#endif
-
-
-static int
-
-E(find_maps) (pid_t pid, void *auxv, size_t auxv_size)
-{
-  EW(Addr) phdr = 0;
-  unsigned int phnum = 0;
-  unsigned int phent = 0;
-
-  EW(auxv_t) *auxvXX = (EW(auxv_t) *) auxv;
-  for (int i = 0; i < auxv_size / sizeof (EW(auxv_t)); ++i)
-    switch (auxvXX[i].a_type)
-      {
-      case AT_PHDR:
-	phdr = auxvXX[i].a_un.a_val;
-	break;
-      case AT_PHNUM:
-	phnum = auxvXX[i].a_un.a_val;
-	break;
-      case AT_PHENT:
-	phent = auxvXX[i].a_un.a_val;
-	break;
-      default:
-	break;
-      }
-
-  if (phdr == 0 || phnum == 0 || phent == 0)
-    error (EXIT_FAILURE, 0, gettext ("cannot find program header of process"));
-
-  EW(Phdr) *p = alloca (phnum * phent);
-  if (pread64 (memfd, p, phnum * phent, phdr) != phnum * phent)
-    {
-      error (0, 0, gettext ("cannot read program header"));
-      return EXIT_FAILURE;
-    }
-
-  /* Determine the load offset.  We need this for interpreting the
-     other program header entries so we do this in a separate loop.
-     Fortunately it is the first time unless someone does something
-     stupid when linking the application.  */
-  EW(Addr) offset = 0;
-  for (unsigned int i = 0; i < phnum; ++i)
-    if (p[i].p_type == PT_PHDR)
-      {
-	offset = phdr - p[i].p_vaddr;
-	break;
-      }
-
-  EW(Addr) list = 0;
-  char *interp = NULL;
-  for (unsigned int i = 0; i < phnum; ++i)
-    if (p[i].p_type == PT_DYNAMIC)
-      {
-	EW(Dyn) *dyn = xmalloc (p[i].p_filesz);
-	if (pread64 (memfd, dyn, p[i].p_filesz, offset + p[i].p_vaddr)
-	    != p[i].p_filesz)
-	  {
-	    error (0, 0, gettext ("cannot read dynamic section"));
-	    return EXIT_FAILURE;
-	  }
-
-	/* Search for the DT_DEBUG entry.  */
-	for (unsigned int j = 0; j < p[i].p_filesz / sizeof (EW(Dyn)); ++j)
-	  if (dyn[j].d_tag == DT_DEBUG && dyn[j].d_un.d_ptr != 0)
-	    {
-	      struct E(r_debug) r;
-	      if (pread64 (memfd, &r, sizeof (r), dyn[j].d_un.d_ptr)
-		  != sizeof (r))
-		{
-		  error (0, 0, gettext ("cannot read r_debug"));
-		  return EXIT_FAILURE;
-		}
-
-	      if (r.r_map != 0)
-		{
-		  list = r.r_map;
-		  break;
-		}
-	    }
-
-	free (dyn);
-	break;
-      }
-    else if (p[i].p_type == PT_INTERP)
-      {
-	interp = alloca (p[i].p_filesz);
-	if (pread64 (memfd, interp, p[i].p_filesz, offset + p[i].p_vaddr)
-	    != p[i].p_filesz)
-	  {
-	    error (0, 0, gettext ("cannot read program interpreter"));
-	    return EXIT_FAILURE;
-	  }
-      }
-
-  if (list == 0)
-    {
-      if (interp == NULL)
-	{
-	  // XXX check whether the executable itself is the loader
-	  return EXIT_FAILURE;
-	}
-
-      // XXX perhaps try finding ld.so and _r_debug in it
-
-      return EXIT_FAILURE;
-    }
-
-  /* Print the PID and program name first.  */
-  printf ("%lu:\t%s\n", (unsigned long int) pid, exe);
-
-  /* Iterate over the list of objects and print the information.  */
-  struct scratch_buffer tmpbuf;
-  scratch_buffer_init (&tmpbuf);
-  int status = 0;
-  do
-    {
-      struct E(link_map) m;
-      if (pread64 (memfd, &m, sizeof (m), list) != sizeof (m))
-	{
-	  error (0, 0, gettext ("cannot read link map"));
-	  status = EXIT_FAILURE;
-	  goto out;
-	}
-
-      EW(Addr) name_offset = m.l_name;
-    again:
-      while (1)
-	{
-	  ssize_t n = pread64 (memfd, tmpbuf.data, tmpbuf.length, name_offset);
-	  if (n == -1)
-	    {
-	      error (0, 0, gettext ("cannot read object name"));
-	      status = EXIT_FAILURE;
-	      goto out;
-	    }
-
-	  if (memchr (tmpbuf.data, '\0', n) != NULL)
-	    break;
-
-	  if (!scratch_buffer_grow (&tmpbuf))
-	    {
-	      error (0, 0, gettext ("cannot allocate buffer for object name"));
-	      status = EXIT_FAILURE;
-	      goto out;
-	    }
-	}
-
-      if (((char *)tmpbuf.data)[0] == '\0' && name_offset == m.l_name
-	  && m.l_libname != 0)
-	{
-	  /* Try the l_libname element.  */
-	  struct E(libname_list) ln;
-	  if (pread64 (memfd, &ln, sizeof (ln), m.l_libname) == sizeof (ln))
-	    {
-	      name_offset = ln.name;
-	      goto again;
-	    }
-	}
-
-      /* Skip over the executable.  */
-      if (((char *)tmpbuf.data)[0] != '\0')
-	printf ("%s\n", (char *)tmpbuf.data);
-
-      list = m.l_next;
-    }
-  while (list != 0);
-
- out:
-  scratch_buffer_free (&tmpbuf);
-  return status;
-}
-
-
-#undef CLASS
diff --git a/elf/pldd.c b/elf/pldd.c
deleted file mode 100644
index ddfa88d63b..0000000000
--- a/elf/pldd.c
+++ /dev/null
@@ -1,344 +0,0 @@
-/* List dynamic shared objects linked into given process.
-   Copyright (C) 2011-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@gmail.com>, 2011.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <alloca.h>
-#include <argp.h>
-#include <assert.h>
-#include <dirent.h>
-#include <elf.h>
-#include <errno.h>
-#include <error.h>
-#include <fcntl.h>
-#include <libintl.h>
-#include <link.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/ptrace.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <scratch_buffer.h>
-
-#include <ldsodefs.h>
-#include <version.h>
-
-/* Global variables.  */
-extern char *program_invocation_short_name;
-#define PACKAGE _libc_intl_domainname
-
-/* External functions.  */
-#include <programs/xmalloc.h>
-
-/* Name and version of program.  */
-static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
-
-/* Function to print some extra text in the help message.  */
-static char *more_help (int key, const char *text, void *input);
-
-/* Definitions of arguments for argp functions.  */
-static const struct argp_option options[] =
-{
-  { NULL, 0, NULL, 0, NULL }
-};
-
-/* Short description of program.  */
-static const char doc[] = N_("\
-List dynamic shared objects loaded into process.");
-
-/* Strings for arguments in help texts.  */
-static const char args_doc[] = N_("PID");
-
-/* Prototype for option handler.  */
-static error_t parse_opt (int key, char *arg, struct argp_state *state);
-
-/* Data structure to communicate with argp functions.  */
-static struct argp argp =
-{
-  options, parse_opt, args_doc, doc, NULL, more_help, NULL
-};
-
-// File descriptor of /proc/*/mem file.
-static int memfd;
-
-/* Name of the executable  */
-static char *exe;
-
-/* Local functions.  */
-static int get_process_info (int dfd, long int pid);
-static void wait_for_ptrace_stop (long int pid);
-
-
-int
-main (int argc, char *argv[])
-{
-  /* Parse and process arguments.  */
-  int remaining;
-  argp_parse (&argp, argc, argv, 0, &remaining, NULL);
-
-  if (remaining != argc - 1)
-    {
-      fprintf (stderr,
-	       gettext ("Exactly one parameter with process ID required.\n"));
-      argp_help (&argp, stderr, ARGP_HELP_SEE, program_invocation_short_name);
-      return 1;
-    }
-
-  assert (sizeof (pid_t) == sizeof (int)
-	  || sizeof (pid_t) == sizeof (long int));
-  char *endp;
-  errno = 0;
-  long int pid = strtol (argv[remaining], &endp, 10);
-  if (pid < 0 || (pid == ULONG_MAX && errno == ERANGE) || *endp != '\0'
-      || (sizeof (pid_t) < sizeof (pid) && pid > INT_MAX))
-    error (EXIT_FAILURE, 0, gettext ("invalid process ID '%s'"),
-	   argv[remaining]);
-
-  /* Determine the program name.  */
-  char buf[7 + 3 * sizeof (pid)];
-  snprintf (buf, sizeof (buf), "/proc/%lu", pid);
-  int dfd = open (buf, O_RDONLY | O_DIRECTORY);
-  if (dfd == -1)
-    error (EXIT_FAILURE, errno, gettext ("cannot open %s"), buf);
-
-  struct scratch_buffer exebuf;
-  scratch_buffer_init (&exebuf);
-  ssize_t nexe;
-  while ((nexe = readlinkat (dfd, "exe",
-			     exebuf.data, exebuf.length)) == exebuf.length)
-    {
-      if (!scratch_buffer_grow (&exebuf))
-	{
-	  nexe = -1;
-	  break;
-	}
-    }
-  if (nexe == -1)
-    exe = (char *) "<program name undetermined>";
-  else
-    {
-      exe = exebuf.data;
-      exe[nexe] = '\0';
-    }
-
-  /* Stop all threads since otherwise the list of loaded modules might
-     change while we are reading it.  */
-  struct thread_list
-  {
-    pid_t tid;
-    struct thread_list *next;
-  } *thread_list = NULL;
-
-  int taskfd = openat (dfd, "task", O_RDONLY | O_DIRECTORY | O_CLOEXEC);
-  if (taskfd == 1)
-    error (EXIT_FAILURE, errno, gettext ("cannot open %s/task"), buf);
-  DIR *dir = fdopendir (taskfd);
-  if (dir == NULL)
-    error (EXIT_FAILURE, errno, gettext ("cannot prepare reading %s/task"),
-	   buf);
-
-  struct dirent64 *d;
-  while ((d = readdir64 (dir)) != NULL)
-    {
-      if (! isdigit (d->d_name[0]))
-	continue;
-
-      errno = 0;
-      long int tid = strtol (d->d_name, &endp, 10);
-      if (tid < 0 || (tid == ULONG_MAX && errno == ERANGE) || *endp != '\0'
-	  || (sizeof (pid_t) < sizeof (pid) && tid > INT_MAX))
-	error (EXIT_FAILURE, 0, gettext ("invalid thread ID '%s'"),
-	       d->d_name);
-
-      if (ptrace (PTRACE_ATTACH, tid, NULL, NULL) != 0)
-	{
-	  /* There might be a race between reading the directory and
-	     threads terminating.  Ignore errors attaching to unknown
-	     threads unless this is the main thread.  */
-	  if (errno == ESRCH && tid != pid)
-	    continue;
-
-	  error (EXIT_FAILURE, errno, gettext ("cannot attach to process %lu"),
-		 tid);
-	}
-
-      wait_for_ptrace_stop (tid);
-
-      struct thread_list *newp = alloca (sizeof (*newp));
-      newp->tid = tid;
-      newp->next = thread_list;
-      thread_list = newp;
-    }
-
-  closedir (dir);
-
-  int status = get_process_info (dfd, pid);
-
-  assert (thread_list != NULL);
-  do
-    {
-      ptrace (PTRACE_DETACH, thread_list->tid, NULL, NULL);
-      thread_list = thread_list->next;
-    }
-  while (thread_list != NULL);
-
-  close (dfd);
-
-  return status;
-}
-
-
-/* Wait for PID to enter ptrace-stop state after being attached.  */
-static void
-wait_for_ptrace_stop (long int pid)
-{
-  int status;
-
-  /* While waiting for SIGSTOP being delivered to the tracee we have to
-     reinject any other pending signal.  Ignore all other errors.  */
-  while (waitpid (pid, &status, __WALL) == pid && WIFSTOPPED (status))
-    {
-      /* The STOP signal should not be delivered to the tracee.  */
-      if (WSTOPSIG (status) == SIGSTOP)
-	return;
-      if (ptrace (PTRACE_CONT, pid, NULL,
-		  (void *) (uintptr_t) WSTOPSIG (status)))
-	/* The only possible error is that the process died.  */
-	return;
-    }
-}
-
-
-/* Handle program arguments.  */
-static error_t
-parse_opt (int key, char *arg, struct argp_state *state)
-{
-  switch (key)
-    {
-    default:
-      return ARGP_ERR_UNKNOWN;
-    }
-  return 0;
-}
-
-
-/* Print bug-reporting information in the help message.  */
-static char *
-more_help (int key, const char *text, void *input)
-{
-  char *tp = NULL;
-  switch (key)
-    {
-    case ARGP_KEY_HELP_EXTRA:
-      /* We print some extra information.  */
-      if (asprintf (&tp, gettext ("\
-For bug reporting instructions, please see:\n\
-%s.\n"), REPORT_BUGS_TO) < 0)
-	return NULL;
-      return tp;
-    default:
-      break;
-    }
-  return (char *) text;
-}
-
-/* Print the version information.  */
-static void
-print_version (FILE *stream, struct argp_state *state)
-{
-  fprintf (stream, "pldd %s%s\n", PKGVERSION, VERSION);
-  fprintf (stream, gettext ("\
-Copyright (C) %s Free Software Foundation, Inc.\n\
-This is free software; see the source for copying conditions.  There is NO\n\
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2017");
-  fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
-}
-
-
-#define CLASS 32
-#include "pldd-xx.c"
-#define CLASS 64
-#include "pldd-xx.c"
-
-
-static int
-get_process_info (int dfd, long int pid)
-{
-  memfd = openat (dfd, "mem", O_RDONLY);
-  if (memfd == -1)
-    goto no_info;
-
-  int fd = openat (dfd, "exe", O_RDONLY);
-  if (fd == -1)
-    {
-    no_info:
-      error (0, errno, gettext ("cannot get information about process %lu"),
-	     pid);
-      return EXIT_FAILURE;
-    }
-
-  char e_ident[EI_NIDENT];
-  if (read (fd, e_ident, EI_NIDENT) != EI_NIDENT)
-    goto no_info;
-
-  close (fd);
-
-  if (memcmp (e_ident, ELFMAG, SELFMAG) != 0)
-    {
-      error (0, 0, gettext ("process %lu is no ELF program"), pid);
-      return EXIT_FAILURE;
-    }
-
-  fd = openat (dfd, "auxv", O_RDONLY);
-  if (fd == -1)
-    goto no_info;
-
-  size_t auxv_size = 0;
-  void *auxv = NULL;
-  while (1)
-    {
-      auxv_size += 512;
-      auxv = xrealloc (auxv, auxv_size);
-
-      ssize_t n = pread (fd, auxv, auxv_size, 0);
-      if (n < 0)
-	goto no_info;
-      if (n < auxv_size)
-	{
-	  auxv_size = n;
-	  break;
-	}
-    }
-
-  close (fd);
-
-  int retval;
-  if (e_ident[EI_CLASS] == ELFCLASS32)
-    retval = find_maps32 (pid, auxv, auxv_size);
-  else
-    retval = find_maps64 (pid, auxv, auxv_size);
-
-  free (auxv);
-  close (memfd);
-
-  return retval;
-}
diff --git a/elf/preloadtest.c b/elf/preloadtest.c
deleted file mode 100644
index 7ea10b9b5b..0000000000
--- a/elf/preloadtest.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <stdio.h>
-
-#include "testobj.h"
-
-int
-main (void)
-{
-  int res = preload (42);
-
-  printf ("preload (42) = %d, %s\n", res, res == 92 ? "ok" : "wrong");
-
-  return res != 92;
-}
-
-int
-foo (int a)
-{
-  return a;
-}
diff --git a/elf/readelflib.c b/elf/readelflib.c
deleted file mode 100644
index 9ad56dcc34..0000000000
--- a/elf/readelflib.c
+++ /dev/null
@@ -1,234 +0,0 @@
-/* Copyright (C) 1999-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Andreas Jaeger <aj@suse.de>, 1999 and
-		  Jakub Jelinek <jakub@redhat.com>, 1999.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This code is a heavily simplified version of the readelf program
-   that's part of the current binutils development version.  For architectures
-   which need to handle both 32bit and 64bit ELF libraries,  this file is
-   included twice for each arch size.  */
-
-/* check_ptr checks that a pointer is in the mmaped file and doesn't
-   point outside it.  */
-#undef check_ptr
-#define check_ptr(ptr)						\
-do								\
-  {								\
-    if ((void *)(ptr) < file_contents				\
-	|| (void *)(ptr) > (file_contents+file_length))		\
-      {								\
-	error (0, 0, _("file %s is truncated\n"), file_name);	\
-	return 1;						\
-      }								\
-  }								\
- while (0);
-
-/* Returns 0 if everything is ok, != 0 in case of error.  */
-int
-process_elf_file (const char *file_name, const char *lib, int *flag,
-		  unsigned int *osversion, char **soname, void *file_contents,
-		  size_t file_length)
-{
-  int i;
-  unsigned int j;
-  ElfW(Addr) loadaddr;
-  unsigned int dynamic_addr;
-  size_t dynamic_size;
-  char *program_interpreter;
-
-  ElfW(Ehdr) *elf_header;
-  ElfW(Phdr) *elf_pheader, *segment;
-  ElfW(Dyn) *dynamic_segment, *dyn_entry;
-  char *dynamic_strings;
-
-  elf_header = (ElfW(Ehdr) *) file_contents;
-  *osversion = 0;
-
-  if (elf_header->e_ident [EI_CLASS] != ElfW (CLASS))
-    {
-      if (opt_verbose)
-	{
-	  if (elf_header->e_ident [EI_CLASS] == ELFCLASS32)
-	    error (0, 0, _("%s is a 32 bit ELF file.\n"), file_name);
-	  else if (elf_header->e_ident [EI_CLASS] == ELFCLASS64)
-	    error (0, 0, _("%s is a 64 bit ELF file.\n"), file_name);
-	  else
-	    error (0, 0, _("Unknown ELFCLASS in file %s.\n"), file_name);
-	}
-      return 1;
-    }
-
-  if (elf_header->e_type != ET_DYN)
-    {
-      error (0, 0, _("%s is not a shared object file (Type: %d).\n"), file_name,
-	     elf_header->e_type);
-      return 1;
-    }
-
-  /* Get information from elf program header.  */
-  elf_pheader = (ElfW(Phdr) *) (elf_header->e_phoff + file_contents);
-  check_ptr (elf_pheader);
-
-  /* The library is an elf library, now search for soname and
-     libc5/libc6.  */
-  *flag = FLAG_ELF;
-
-  loadaddr = -1;
-  dynamic_addr = 0;
-  dynamic_size = 0;
-  program_interpreter = NULL;
-  for (i = 0, segment = elf_pheader;
-       i < elf_header->e_phnum; i++, segment++)
-    {
-      check_ptr (segment);
-
-      switch (segment->p_type)
-	{
-	case PT_LOAD:
-	  if (loadaddr == (ElfW(Addr)) -1)
-	    loadaddr = segment->p_vaddr - segment->p_offset;
-	  break;
-
-	case PT_DYNAMIC:
-	  if (dynamic_addr)
-	    error (0, 0, _("more than one dynamic segment\n"));
-
-	  dynamic_addr = segment->p_offset;
-	  dynamic_size = segment->p_filesz;
-	  break;
-
-	case PT_INTERP:
-	  program_interpreter = (char *) (file_contents + segment->p_offset);
-	  check_ptr (program_interpreter);
-
-	  /* Check if this is enough to classify the binary.  */
-	  for (j = 0; j < sizeof (interpreters) / sizeof (interpreters [0]);
-	       ++j)
-	    if (strcmp (program_interpreter, interpreters[j].soname) == 0)
-	      {
-		*flag = interpreters[j].flag;
-		break;
-	      }
-	  break;
-
-	case PT_NOTE:
-	  if (!*osversion && segment->p_filesz >= 32 && segment->p_align >= 4)
-	    {
-	      ElfW(Word) *abi_note = (ElfW(Word) *) (file_contents
-						     + segment->p_offset);
-	      ElfW(Addr) size = segment->p_filesz;
-
-	      while (abi_note [0] != 4 || abi_note [1] != 16
-		     || abi_note [2] != 1
-		     || memcmp (abi_note + 3, "GNU", 4) != 0)
-		{
-#define ROUND(len) (((len) + sizeof (ElfW(Word)) - 1) & -sizeof (ElfW(Word)))
-		  ElfW(Addr) note_size = 3 * sizeof (ElfW(Word))
-					 + ROUND (abi_note[0])
-					 + ROUND (abi_note[1]);
-
-		  if (size - 32 < note_size || note_size == 0)
-		    {
-		      size = 0;
-		      break;
-		    }
-		  size -= note_size;
-		  abi_note = (void *) abi_note + note_size;
-		}
-
-	      if (size == 0)
-		break;
-
-	      *osversion = (abi_note [4] << 24) |
-			   ((abi_note [5] & 0xff) << 16) |
-			   ((abi_note [6] & 0xff) << 8) |
-			   (abi_note [7] & 0xff);
-	    }
-	  break;
-
-	default:
-	  break;
-	}
-
-    }
-  if (loadaddr == (ElfW(Addr)) -1)
-    {
-      /* Very strange. */
-      loadaddr = 0;
-    }
-
-  /* Now we can read the dynamic sections.  */
-  if (dynamic_size == 0)
-    return 1;
-
-  dynamic_segment = (ElfW(Dyn) *) (file_contents + dynamic_addr);
-  check_ptr (dynamic_segment);
-
-  /* Find the string table.  */
-  dynamic_strings = NULL;
-  for (dyn_entry = dynamic_segment; dyn_entry->d_tag != DT_NULL;
-       ++dyn_entry)
-    {
-      check_ptr (dyn_entry);
-      if (dyn_entry->d_tag == DT_STRTAB)
-	{
-	  dynamic_strings = (char *) (file_contents + dyn_entry->d_un.d_val - loadaddr);
-	  check_ptr (dynamic_strings);
-	  break;
-	}
-    }
-
-  if (dynamic_strings == NULL)
-    return 1;
-
-  /* Now read the DT_NEEDED and DT_SONAME entries.  */
-  for (dyn_entry = dynamic_segment; dyn_entry->d_tag != DT_NULL;
-       ++dyn_entry)
-    {
-      if (dyn_entry->d_tag == DT_NEEDED || dyn_entry->d_tag == DT_SONAME)
-	{
-	  char *name = dynamic_strings + dyn_entry->d_un.d_val;
-	  check_ptr (name);
-
-	  if (dyn_entry->d_tag == DT_NEEDED)
-	    {
-
-	      if (*flag == FLAG_ELF)
-		{
-		  /* Check if this is enough to classify the binary.  */
-		  for (j = 0;
-		       j < sizeof (known_libs) / sizeof (known_libs [0]);
-		       ++j)
-		    if (strcmp (name, known_libs [j].soname) == 0)
-		      {
-			*flag = known_libs [j].flag;
-			break;
-		      }
-		}
-	    }
-
-	  else if (dyn_entry->d_tag == DT_SONAME)
-	    *soname = xstrdup (name);
-
-	  /* Do we have everything we need?  */
-	  if (*soname && *flag != FLAG_ELF)
-	    return 0;
-	}
-    }
-
-  return 0;
-}
diff --git a/elf/readlib.c b/elf/readlib.c
deleted file mode 100644
index d278a189b2..0000000000
--- a/elf/readlib.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/* Copyright (C) 1999-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Andreas Jaeger <aj@suse.de>, 1999 and
-		  Jakub Jelinek <jakub@redhat.com>, 1999.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published
-   by the Free Software Foundation; version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
-
-/* The code in this file and in readelflib is a heavily simplified
-   version of the readelf program that's part of the current binutils
-   development version.  Besides the simplification, it has also been
-   modified to read some other file formats.  */
-
-#include <a.out.h>
-#include <elf.h>
-#include <error.h>
-#include <libintl.h>
-#include <link.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <gnu/lib-names.h>
-
-#include <ldconfig.h>
-
-#define Elf32_CLASS ELFCLASS32
-#define Elf64_CLASS ELFCLASS64
-
-struct known_names
-{
-  const char *soname;
-  int flag;
-};
-
-static struct known_names interpreters[] =
-{
-  { "/lib/" LD_SO, FLAG_ELF_LIBC6 },
-#ifdef SYSDEP_KNOWN_INTERPRETER_NAMES
-  SYSDEP_KNOWN_INTERPRETER_NAMES
-#endif
-};
-
-static struct known_names known_libs[] =
-{
-  { LIBC_SO, FLAG_ELF_LIBC6 },
-  { LIBM_SO, FLAG_ELF_LIBC6 },
-#ifdef SYSDEP_KNOWN_LIBRARY_NAMES
-  SYSDEP_KNOWN_LIBRARY_NAMES
-#endif
-};
-
-
-/* Check if string corresponds to a GDB Python file.  */
-static bool
-is_gdb_python_file (const char *name)
-{
-  size_t len = strlen (name);
-  return len > 7 && strcmp (name + len - 7, "-gdb.py") == 0;
-}
-
-/* Returns 0 if everything is ok, != 0 in case of error.  */
-int
-process_file (const char *real_file_name, const char *file_name,
-	      const char *lib, int *flag, unsigned int *osversion,
-	      char **soname, int is_link, struct stat64 *stat_buf)
-{
-  FILE *file;
-  struct stat64 statbuf;
-  void *file_contents;
-  int ret;
-  ElfW(Ehdr) *elf_header;
-  struct exec *aout_header;
-
-  ret = 0;
-  *flag = FLAG_ANY;
-  *soname = NULL;
-
-  file = fopen (real_file_name, "rb");
-  if (file == NULL)
-    {
-      /* No error for stale symlink.  */
-      if (is_link && strstr (file_name, ".so") != NULL)
-	return 1;
-      error (0, 0, _("Input file %s not found.\n"), file_name);
-      return 1;
-    }
-
-  if (fstat64 (fileno (file), &statbuf) < 0)
-    {
-      error (0, 0, _("Cannot fstat file %s.\n"), file_name);
-      fclose (file);
-      return 1;
-    }
-
-  /* Check that the file is large enough so that we can access the
-     information.  We're only checking the size of the headers here.  */
-  if ((size_t) statbuf.st_size < sizeof (struct exec)
-      || (size_t) statbuf.st_size < sizeof (ElfW(Ehdr)))
-    {
-      if (statbuf.st_size == 0)
-	error (0, 0, _("File %s is empty, not checked."), file_name);
-      else
-	{
-	  char buf[SELFMAG];
-	  size_t n = MIN (statbuf.st_size, SELFMAG);
-	  if (fread (buf, n, 1, file) == 1 && memcmp (buf, ELFMAG, n) == 0)
-	    error (0, 0, _("File %s is too small, not checked."), file_name);
-	}
-      fclose (file);
-      return 1;
-    }
-
-  file_contents = mmap (0, statbuf.st_size, PROT_READ, MAP_SHARED,
-			fileno (file), 0);
-  if (file_contents == MAP_FAILED)
-    {
-      error (0, 0, _("Cannot mmap file %s.\n"), file_name);
-      fclose (file);
-      return 1;
-    }
-
-  /* First check if this is an aout file.  */
-  aout_header = (struct exec *) file_contents;
-  if (N_MAGIC (*aout_header) == ZMAGIC
-#ifdef QMAGIC			/* Linuxism.  */
-      || N_MAGIC (*aout_header) == QMAGIC
-#endif
-      )
-    {
-      /* Aout files don't have a soname, just return the name
-	 including the major number.  */
-      char *copy, *major, *dot;
-      copy = xstrdup (lib);
-      major = strstr (copy, ".so.");
-      if (major)
-	{
-	  dot = strstr (major + 4, ".");
-	  if (dot)
-	    *dot = '\0';
-	}
-      *soname = copy;
-      *flag = FLAG_LIBC4;
-      goto done;
-    }
-
-  elf_header = (ElfW(Ehdr) *) file_contents;
-  if (memcmp (elf_header->e_ident, ELFMAG, SELFMAG) != 0)
-    {
-      /* The file is neither ELF nor aout.  Check if it's a linker
-	 script, like libc.so - otherwise complain.  Only search the
-	 beginning of the file.  */
-      size_t len = MIN (statbuf.st_size, 512);
-      if (memmem (file_contents, len, "GROUP", 5) == NULL
-	  && memmem (file_contents, len, "GNU ld script", 13) == NULL
-	  && !is_gdb_python_file (file_name))
-	error (0, 0, _("%s is not an ELF file - it has the wrong magic bytes at the start.\n"),
-	       file_name);
-      ret = 1;
-    }
-  /* Libraries have to be shared object files.  */
-  else if (elf_header->e_type != ET_DYN)
-    ret = 1;
-  else if (process_elf_file (file_name, lib, flag, osversion, soname,
-			     file_contents, statbuf.st_size))
-    ret = 1;
-
- done:
-  /* Clean up allocated memory and resources.  */
-  munmap (file_contents, statbuf.st_size);
-  fclose (file);
-
-  *stat_buf = statbuf;
-  return ret;
-}
-
-/* Returns made up soname if lib doesn't have explicit DT_SONAME.  */
-
-char *
-implicit_soname (const char *lib, int flag)
-{
-  char *soname = xstrdup (lib);
-
-  if ((flag & FLAG_TYPE_MASK) != FLAG_LIBC4)
-    return soname;
-
-  /* Aout files don't have a soname, just return the name
-     including the major number.  */
-  char *major = strstr (soname, ".so.");
-  if (major)
-    {
-      char *dot = strstr (major + 4, ".");
-      if (dot)
-	*dot = '\0';
-    }
-  return soname;
-}
-
-/* Get architecture specific version of process_elf_file.  */
-#include <readelflib.c>
diff --git a/elf/reldep.c b/elf/reldep.c
deleted file mode 100644
index adabc0d5d5..0000000000
--- a/elf/reldep.c
+++ /dev/null
@@ -1,111 +0,0 @@
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  void *h1;
-  void *h2;
-  int (*fp) (void);
-  int *vp;
-
-  mtrace ();
-
-  /* Open the two objects.  */
-  h1 = dlopen ("reldepmod1.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (h1 == NULL)
-    {
-      printf ("cannot open reldepmod1.so: %s\n", dlerror ());
-      exit (1);
-    }
-  h2 = dlopen ("reldepmod2.so", RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      printf ("cannot open reldepmod2.so: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Get the address of the variable in reldepmod1.so.  */
-  vp = dlsym (h1, "some_var");
-  if (vp == NULL)
-    {
-      printf ("cannot get address of \"some_var\": %s\n", dlerror ());
-      exit (1);
-    }
-
-  *vp = 42;
-
-  /* Get the function `call_me' in the second object.  This has a
-     dependency which is resolved by a definition in reldepmod1.so.  */
-  fp = dlsym (h2, "call_me");
-  if (fp == NULL)
-    {
-      printf ("cannot get address of \"call_me\": %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Call the function.  */
-  if (fp () != 0)
-    {
-      puts ("function \"call_me\" returned wrong result");
-      exit (1);
-    }
-
-  /* Now close the first object.  If must still be around since we have
-     an implicit dependency.  */
-  if (dlclose (h1) != 0)
-    {
-      printf ("closing h1 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Try calling the function again.  This will fail if the first object
-     got unloaded.  */
-  if (fp () != 0)
-    {
-      puts ("second call of function \"call_me\" returned wrong result");
-      exit (1);
-    }
-
-  /* Now close the second file as well.  */
-  if (dlclose (h2) != 0)
-    {
-      printf ("closing h2 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Finally, open the first object again.   */
-  h1 = dlopen ("reldepmod1.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (h1 == NULL)
-    {
-      printf ("cannot open reldepmod1.so the second time: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* And get the variable address again.  */
-  vp = dlsym (h1, "some_var");
-  if (vp == NULL)
-    {
-      printf ("cannot get address of \"some_var\" the second time: %s\n",
-	      dlerror ());
-      exit (1);
-    }
-
-  /* The variable now must have its originial value.  */
-  if (*vp != 0)
-    {
-      puts ("variable \"some_var\" not reset");
-      exit (1);
-    }
-
-  /* Close the first object again, we are done.  */
-  if (dlclose (h1) != 0)
-    {
-      printf ("closing h1 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  return 0;
-}
diff --git a/elf/reldep2.c b/elf/reldep2.c
deleted file mode 100644
index ba5ab222f9..0000000000
--- a/elf/reldep2.c
+++ /dev/null
@@ -1,101 +0,0 @@
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  void *h1;
-  void *h2;
-  int (*fp) (void);
-  int *vp;
-
-  mtrace ();
-
-  /* Open the two objects.  */
-  h1 = dlopen ("reldepmod1.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (h1 == NULL)
-    {
-      printf ("cannot open reldepmod1.so: %s\n", dlerror ());
-      exit (1);
-    }
-  h2 = dlopen ("reldepmod3.so", RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      printf ("cannot open reldepmod3.so: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Get the address of the variable in reldepmod1.so.  */
-  vp = dlsym (h1, "some_var");
-  if (vp == NULL)
-    {
-      printf ("cannot get address of \"some_var\": %s\n", dlerror ());
-      exit (1);
-    }
-
-  *vp = 42;
-
-  /* Get the function `call_me' in the second object.  This has a
-     dependency which is resolved by a definition in reldepmod1.so.  */
-  fp = dlsym (h2, "call_me");
-  if (fp == NULL)
-    {
-      printf ("cannot get address of \"call_me\": %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Call the function.  */
-  if (fp () != 0)
-    {
-      puts ("function \"call_me\" returned wrong result");
-      exit (1);
-    }
-
-  /* Now close the first object.  It must still be around since we have
-     an implicit dependency.  */
-  if (dlclose (h1) != 0)
-    {
-      printf ("closing h1 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Open the first object again.   */
-  h1 = dlopen ("reldepmod1.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (h1 == NULL)
-    {
-      printf ("cannot open reldepmod1.so the second time: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Get the variable address again.  */
-  vp = dlsym (h1, "some_var");
-  if (vp == NULL)
-    {
-      printf ("cannot get address of \"some_var\" the second time: %s\n",
-	      dlerror ());
-      exit (1);
-    }
-
-  /* The variable now must have its originial value.  */
-  if (*vp != 42)
-    {
-      puts ("variable \"some_var\" reset");
-      exit (1);
-    }
-
-  /* Close the first object again, we are done.  */
-  if (dlclose (h1) != 0)
-    {
-      printf ("closing h1 failed: %s\n", dlerror ());
-      exit (1);
-    }
-  if (dlclose (h2) != 0)
-    {
-      printf ("closing h2 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  return 0;
-}
diff --git a/elf/reldep3.c b/elf/reldep3.c
deleted file mode 100644
index 05013d3509..0000000000
--- a/elf/reldep3.c
+++ /dev/null
@@ -1,101 +0,0 @@
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  void *h1;
-  void *h2;
-  int (*fp) (void);
-  int *vp;
-
-  mtrace ();
-
-  /* Open the two objects.  */
-  h1 = dlopen ("reldepmod1.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (h1 == NULL)
-    {
-      printf ("cannot open reldepmod1.so: %s\n", dlerror ());
-      exit (1);
-    }
-  h2 = dlopen ("reldepmod4.so", RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      printf ("cannot open reldepmod4.so: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Get the address of the variable in reldepmod1.so.  */
-  vp = dlsym (h1, "some_var");
-  if (vp == NULL)
-    {
-      printf ("cannot get address of \"some_var\": %s\n", dlerror ());
-      exit (1);
-    }
-
-  *vp = 42;
-
-  /* Get the function `call_me' in the second object.  This has a
-     dependency which is resolved by a definition in reldepmod1.so.  */
-  fp = dlsym (h2, "call_me");
-  if (fp == NULL)
-    {
-      printf ("cannot get address of \"call_me\": %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Call the function.  */
-  if (fp () != 0)
-    {
-      puts ("function \"call_me\" returned wrong result");
-      exit (1);
-    }
-
-  /* Now close the first object.  If must still be around since we have
-     an implicit dependency.  */
-  if (dlclose (h1) != 0)
-    {
-      printf ("closing h1 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Open the first object again.   */
-  h1 = dlopen ("reldepmod1.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (h1 == NULL)
-    {
-      printf ("cannot open reldepmod1.so the second time: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Get the variable address again.  */
-  vp = dlsym (h1, "some_var");
-  if (vp == NULL)
-    {
-      printf ("cannot get address of \"some_var\" the second time: %s\n",
-	      dlerror ());
-      exit (1);
-    }
-
-  /* The variable now must have its originial value.  */
-  if (*vp != 0)
-    {
-      puts ("variable \"some_var\" not reset");
-      exit (1);
-    }
-
-  /* Close the first object again, we are done.  */
-  if (dlclose (h1) != 0)
-    {
-      printf ("closing h1 failed: %s\n", dlerror ());
-      exit (1);
-    }
-  if (dlclose (h2) != 0)
-    {
-      printf ("closing h2 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  return 0;
-}
diff --git a/elf/reldep4.c b/elf/reldep4.c
deleted file mode 100644
index ba12e7d9c4..0000000000
--- a/elf/reldep4.c
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  int i;
-  void *h1, *h2;
-
-  mtrace ();
-
-  for (i = 0; i < 3; i++)
-    {
-      h1 = dlopen ("reldep4mod1.so", RTLD_NOW | RTLD_GLOBAL);
-      if (h1 == NULL)
-	{
-	  printf ("cannot open reldep4mod1.so: %s\n", dlerror ());
-	  exit (1);
-	}
-      h2 = dlopen ("reldep4mod2.so", RTLD_NOW | RTLD_GLOBAL);
-      if (h2 == NULL)
-	{
-	  printf ("cannot open reldep4mod2.so: %s\n", dlerror ());
-	  exit (1);
-	}
-      if (dlclose (h1) != 0)
-	{
-	  printf ("closing h1 failed: %s\n", dlerror ());
-	  exit (1);
-	}
-      if (dlclose (h2) != 0)
-	{
-	  printf ("closing h2 failed: %s\n", dlerror ());
-	  exit (1);
-	}
-    }
-  return 0;
-}
diff --git a/elf/reldep4mod1.c b/elf/reldep4mod1.c
deleted file mode 100644
index 934a68096e..0000000000
--- a/elf/reldep4mod1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-int foo (void);
-
-int foo (void)
-{
-  return 0;
-}
-
diff --git a/elf/reldep4mod2.c b/elf/reldep4mod2.c
deleted file mode 100644
index 26ce6bf13a..0000000000
--- a/elf/reldep4mod2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern int foo (void);
-extern int bar (void);
-
-int
-bar (void)
-{
-  return foo ();
-}
diff --git a/elf/reldep4mod3.c b/elf/reldep4mod3.c
deleted file mode 100644
index 934a68096e..0000000000
--- a/elf/reldep4mod3.c
+++ /dev/null
@@ -1,7 +0,0 @@
-int foo (void);
-
-int foo (void)
-{
-  return 0;
-}
-
diff --git a/elf/reldep4mod4.c b/elf/reldep4mod4.c
deleted file mode 100644
index 26ce6bf13a..0000000000
--- a/elf/reldep4mod4.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern int foo (void);
-extern int bar (void);
-
-int
-bar (void)
-{
-  return foo ();
-}
diff --git a/elf/reldep5.c b/elf/reldep5.c
deleted file mode 100644
index 881d519ff6..0000000000
--- a/elf/reldep5.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  void *h1;
-  void *h2;
-  int (*fp) (void);
-
-  mtrace ();
-
-  /* Open the two objects.  */
-  h1 = dlopen ("reldepmod5.so", RTLD_LAZY);
-  if (h1 == NULL)
-    {
-      printf ("cannot open reldepmod5.so: %s\n", dlerror ());
-      exit (1);
-    }
-  h2 = dlopen ("reldepmod6.so", RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      printf ("cannot open reldepmod6.so: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Get the address of the variable in reldepmod1.so.  */
-  fp = dlsym (h2, "bar");
-  if (fp == NULL)
-    {
-      printf ("cannot get address of \"bar\": %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Call the function.  */
-  puts ("calling fp for the first time");
-  if (fp () != 0)
-    {
-      puts ("function \"call_me\" returned wrong result");
-      exit (1);
-    }
-
-  /* Now close the first object.  It must still be around since we have
-     an implicit dependency.  */
-  if (dlclose (h1) != 0)
-    {
-      printf ("closing h1 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Calling the function must still work.  */
-  puts ("calling fp for the second time");
-  if (fp () != 0)
-    {
-      puts ("function \"call_me\" the second time returned wrong result");
-      exit (1);
-    }
-  puts ("second call suceeded as well");
-
-  /* Close the second object, we are done.  */
-  if (dlclose (h2) != 0)
-    {
-      printf ("closing h2 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  return 0;
-}
diff --git a/elf/reldep6.c b/elf/reldep6.c
deleted file mode 100644
index 1eeec6c862..0000000000
--- a/elf/reldep6.c
+++ /dev/null
@@ -1,109 +0,0 @@
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-typedef int (*fn)(void);
-#define CHUNKS 1024
-#define REPEAT 64
-
-int
-main (void)
-{
-  void *h1;
-  void *h2;
-  fn **foopp;
-  fn bar, baz;
-  int i, j;
-  int n;
-  void *allocs[REPEAT][CHUNKS];
-
-  mtrace ();
-
-  /* Open the two objects.  */
-  h1 = dlopen ("reldep6mod3.so", RTLD_LAZY);
-  if (h1 == NULL)
-    {
-      printf ("cannot open reldep6mod3.so: %s\n", dlerror ());
-      exit (1);
-    }
-
-  foopp = dlsym (h1, "foopp");
-  if (foopp == NULL)
-    {
-      printf ("cannot get address of \"foopp\": %s\n", dlerror ());
-      exit (1);
-    }
-  n = (**foopp) ();
-  if (n != 20)
-    {
-      printf ("(**foopp)() return %d, not return 20\n", n);
-      exit (1);
-    }
-
-  h2 = dlopen ("reldep6mod4.so", RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      printf ("cannot open reldep6mod4.so: %s\n", dlerror ());
-      exit (1);
-    }
-
-  baz = dlsym (h2, "baz");
-  if (baz == NULL)
-    {
-      printf ("cannot get address of \"baz\": %s\n", dlerror ());
-      exit (1);
-    }
-  if (baz () != 31)
-    {
-      printf ("baz() did not return 31\n");
-      exit (1);
-    }
-
-  if (dlclose (h1) != 0)
-    {
-      printf ("closing h1 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  /* Clobber memory.  */
-  for (i = 0; i < REPEAT; ++i)
-    for (j = 0; j < CHUNKS; ++j)
-      allocs[i][j] = calloc (1, j + 1);
-
-  bar = dlsym (h2, "bar");
-  if (bar == NULL)
-    {
-      printf ("cannot get address of \"bar\": %s\n", dlerror ());
-      exit (1);
-    }
-  if (bar () != 40)
-    {
-      printf ("bar() did not return 40\n");
-      exit (1);
-    }
-
-  baz = dlsym (h2, "baz");
-  if (baz == NULL)
-    {
-      printf ("cannot get address of \"baz\": %s\n", dlerror ());
-      exit (1);
-    }
-  if (baz () != 31)
-    {
-      printf ("baz() did not return 31\n");
-      exit (1);
-    }
-
-  for (i = 0; i < REPEAT; ++i)
-    for (j = 0; j < CHUNKS; ++j)
-      free (allocs[i][j]);
-
-  if (dlclose (h2) != 0)
-    {
-      printf ("closing h2 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  return 0;
-}
diff --git a/elf/reldep6mod0.c b/elf/reldep6mod0.c
deleted file mode 100644
index 58f3745fb4..0000000000
--- a/elf/reldep6mod0.c
+++ /dev/null
@@ -1,8 +0,0 @@
-int bar (void);
-extern void free (void *);
-
-int bar (void)
-{
-  free (0);
-  return 40;
-}
diff --git a/elf/reldep6mod1.c b/elf/reldep6mod1.c
deleted file mode 100644
index 037a73a198..0000000000
--- a/elf/reldep6mod1.c
+++ /dev/null
@@ -1,14 +0,0 @@
-int foo (void);
-int baz (void);
-extern int weak (void);
-asm (".weak weak");
-
-int foo (void)
-{
-  return 20;
-}
-
-int baz (void)
-{
-  return weak () + 1;
-}
diff --git a/elf/reldep6mod2.c b/elf/reldep6mod2.c
deleted file mode 100644
index c2ef3f9bc0..0000000000
--- a/elf/reldep6mod2.c
+++ /dev/null
@@ -1,3 +0,0 @@
-extern int foo (void);
-
-void *foop = (void *) foo;
diff --git a/elf/reldep6mod3.c b/elf/reldep6mod3.c
deleted file mode 100644
index 881828ef6e..0000000000
--- a/elf/reldep6mod3.c
+++ /dev/null
@@ -1,3 +0,0 @@
-extern void *foop;
-
-void **foopp = &foop;
diff --git a/elf/reldep6mod4.c b/elf/reldep6mod4.c
deleted file mode 100644
index 8fa89de64b..0000000000
--- a/elf/reldep6mod4.c
+++ /dev/null
@@ -1,12 +0,0 @@
-int foo (void);
-int weak (void);
-
-int foo (void)
-{
-  return 10;
-}
-
-int weak (void)
-{
-  return 30;
-}
diff --git a/elf/reldep7.c b/elf/reldep7.c
deleted file mode 100644
index 5275a0e8f1..0000000000
--- a/elf/reldep7.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  void *h1;
-  void *h2;
-  void *mod1_bar, *mod2_bar;
-
-  h1 = dlopen ("reldep7mod1.so", RTLD_GLOBAL | RTLD_LAZY);
-  if (h1 == NULL)
-    {
-      printf ("cannot open reldep7mod1.so: %s\n", dlerror ());
-      exit (1);
-    }
-
-  h2 = dlopen ("reldep7mod2.so", RTLD_GLOBAL | RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      printf ("cannot open reldep7mod1.so: %s\n", dlerror ());
-      exit (1);
-    }
-
-  mod1_bar = dlsym (h1, "mod1_bar");
-  if (mod1_bar == NULL)
-    {
-      printf ("cannot get address of \"mod1_bar\": %s\n", dlerror ());
-      exit (1);
-    }
-
-  mod2_bar = dlsym (h2, "mod2_bar");
-  if (mod2_bar == NULL)
-    {
-      printf ("cannot get address of \"mod2_bar\": %s\n", dlerror ());
-      exit (1);
-    }
-
-  printf ("%d\n", ((int (*) (void)) mod1_bar) ());
-  printf ("%d\n", ((int (*) (void)) mod2_bar) ());
-
-  if (dlclose (h1) != 0)
-    {
-      printf ("closing h1 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  printf ("%d\n", ((int (*) (void)) mod2_bar) ());
-
-  if (dlclose (h2) != 0)
-    {
-      printf ("closing h2 failed: %s\n", dlerror ());
-      exit (1);
-    }
-
-  return 0;
-}
diff --git a/elf/reldep7mod1.c b/elf/reldep7mod1.c
deleted file mode 100644
index de1bb3a6cd..0000000000
--- a/elf/reldep7mod1.c
+++ /dev/null
@@ -1,12 +0,0 @@
-int foo (void) __attribute__ ((weak));
-int
-foo (void)
-{
-  return 1;
-}
-
-int
-mod1_bar (void)
-{
-  return foo ();
-}
diff --git a/elf/reldep7mod2.c b/elf/reldep7mod2.c
deleted file mode 100644
index 3fa3368792..0000000000
--- a/elf/reldep7mod2.c
+++ /dev/null
@@ -1,12 +0,0 @@
-int foo (void) __attribute__ ((weak));
-int
-foo (void)
-{
-  return 2;
-}
-
-int
-mod2_bar (void)
-{
-  return foo ();
-}
diff --git a/elf/reldep8.c b/elf/reldep8.c
deleted file mode 100644
index 90009a5609..0000000000
--- a/elf/reldep8.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <dlfcn.h>
-
-int
-main (void)
-{
-  void *handle = dlopen ("reldep8mod3.so", RTLD_LAZY);
-  if (handle == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  dlclose (handle);
-  abort ();
-}
diff --git a/elf/reldep8mod1.c b/elf/reldep8mod1.c
deleted file mode 100644
index acddc4cf8b..0000000000
--- a/elf/reldep8mod1.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <stdlib.h>
-void
-foo (void)
-{
-  exit (0);
-}
-
-void
-__attribute__((destructor))
-bar (void)
-{
-  static int i;
-  foo ();
-  ++i;
-}
-void
-baz (void)
-{
-}
diff --git a/elf/reldep8mod2.c b/elf/reldep8mod2.c
deleted file mode 100644
index d0020240a8..0000000000
--- a/elf/reldep8mod2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-void
-__attribute__((constructor))
-xxx (void)
-{
-  extern void baz (void);
-  baz ();
-}
diff --git a/elf/reldep8mod3.c b/elf/reldep8mod3.c
deleted file mode 100644
index 6d1a0d47b7..0000000000
--- a/elf/reldep8mod3.c
+++ /dev/null
@@ -1 +0,0 @@
-int x;
diff --git a/elf/reldep9.c b/elf/reldep9.c
deleted file mode 100644
index 51c7a8bb9e..0000000000
--- a/elf/reldep9.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <dlfcn.h>
-
-int
-main (void)
-{
-  void *handle = dlopen ("reldep9mod3.so", RTLD_LAZY);
-  if (handle == NULL)
-    {
-      printf ("%s\n", dlerror ());
-      exit (1);
-    }
-  dlclose (handle);
-  abort ();
-}
diff --git a/elf/reldep9mod1.c b/elf/reldep9mod1.c
deleted file mode 100644
index 249a2bae1c..0000000000
--- a/elf/reldep9mod1.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdlib.h>
-void
-foo (void)
-{
-  exit (0);
-}
-
-void
-__attribute__((destructor))
-bar (void)
-{
-  static int i;
-  foo ();
-  ++i;
-}
-
-void
-__attribute__((constructor))
-destr (void)
-{
-  extern void baz (void);
-  baz ();
-}
diff --git a/elf/reldep9mod2.c b/elf/reldep9mod2.c
deleted file mode 100644
index 090966e3e3..0000000000
--- a/elf/reldep9mod2.c
+++ /dev/null
@@ -1,3 +0,0 @@
-void baz (void)
-{
-}
diff --git a/elf/reldep9mod3.c b/elf/reldep9mod3.c
deleted file mode 100644
index 6d1a0d47b7..0000000000
--- a/elf/reldep9mod3.c
+++ /dev/null
@@ -1 +0,0 @@
-int x;
diff --git a/elf/reldepmod1.c b/elf/reldepmod1.c
deleted file mode 100644
index b8ef6401e1..0000000000
--- a/elf/reldepmod1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-extern int foo (void);
-
-int some_var;
-
-
-int
-foo (void)
-{
-  return some_var;
-}
diff --git a/elf/reldepmod2.c b/elf/reldepmod2.c
deleted file mode 100644
index b7edebae80..0000000000
--- a/elf/reldepmod2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern int foo (void);
-extern int call_me (void);
-
-int
-call_me (void)
-{
-  return foo () - 42;
-}
diff --git a/elf/reldepmod3.c b/elf/reldepmod3.c
deleted file mode 100644
index 66a996cd90..0000000000
--- a/elf/reldepmod3.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-extern int call_me (void);
-
-int
-call_me (void)
-{
-  int (*fp) (void);
-
-  fp = dlsym (RTLD_DEFAULT, "foo");
-  if (fp == NULL)
-    {
-      printf ("cannot get address of foo in global scope: %s\n", dlerror ());
-      exit (1);
-    }
-
-  return fp () - 42;
-}
diff --git a/elf/reldepmod4.c b/elf/reldepmod4.c
deleted file mode 100644
index dcb503bba7..0000000000
--- a/elf/reldepmod4.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-extern int call_me (void);
-
-int
-call_me (void)
-{
-  void *h;
-  int (*fp) (void);
-  int res;
-
-  h = dlopen ("reldepmod1.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("cannot open reldepmod1.so in %s: %s\n", __FILE__, dlerror ());
-      exit (1);
-    }
-
-  fp = dlsym (h, "foo");
-  if (fp == NULL)
-    {
-      printf ("cannot get address of foo in global scope: %s\n", dlerror ());
-      exit (1);
-    }
-
-  res = fp () - 42;
-
-  if (dlclose (h) != 0)
-    {
-      printf ("failure when closing h in %s: %s\n", __FILE__, dlerror ());
-      exit (1);
-    }
-
-  return res;
-}
diff --git a/elf/reldepmod5.c b/elf/reldepmod5.c
deleted file mode 100644
index 62df697162..0000000000
--- a/elf/reldepmod5.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern int foo (void);
-
-int
-foo (void)
-{
-  return 42;
-}
diff --git a/elf/reldepmod6.c b/elf/reldepmod6.c
deleted file mode 100644
index cd2aeb400d..0000000000
--- a/elf/reldepmod6.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern int call_me (void);
-extern int bar (void);
-
-int
-bar (void)
-{
-  return call_me ();
-}
diff --git a/elf/resolvfail.c b/elf/resolvfail.c
deleted file mode 100644
index ebd635d153..0000000000
--- a/elf/resolvfail.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-static const char obj[] = "testobj1.so";
-
-int
-main (void)
-{
-  void *d = dlopen (obj, RTLD_LAZY);
-  int n;
-
-  if (d == NULL)
-    {
-      printf ("cannot load %s: %s\n", obj, dlerror ());
-      return 1;
-    }
-
-  for (n = 0; n < 10000; ++n)
-    if (dlsym (d, "does not exist") != NULL)
-      {
-	puts ("dlsym() did not fail");
-	return 1;
-      }
-    else if (dlerror () == NULL)
-      {
-	puts ("dlerror() didn't return a string");
-	return 1;
-      }
-
-  return 0;
-}
diff --git a/elf/restest1.c b/elf/restest1.c
deleted file mode 100644
index eb5aeca59e..0000000000
--- a/elf/restest1.c
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <dlfcn.h>
-#include <error.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-main (void)
-{
-  void *h1;
-  int (*fp1) (int);
-  void *h2;
-  int (*fp2) (int);
-  int res1;
-  int res2;
-
-  mtrace ();
-
-  h1 = dlopen ("testobj1.so", RTLD_LAZY);
-  if (h1 == NULL)
-    error (EXIT_FAILURE, 0, "while loading `%s': %s", "testobj1.so",
-	   dlerror ());
-
-  h2 = dlopen ("testobj1_1.so", RTLD_LAZY);
-  if (h1 == NULL)
-    error (EXIT_FAILURE, 0, "while loading `%s': %s", "testobj1_1.so",
-	   dlerror ());
-
-  fp1 = dlsym (h1, "obj1func1");
-  if (fp1 == NULL)
-    error (EXIT_FAILURE, 0, "getting `obj1func1' in `%s': %s",
-	   "testobj1.so", dlerror ());
-
-  fp2 = dlsym (h2, "obj1func1");
-  if (fp2 == NULL)
-    error (EXIT_FAILURE, 0, "getting `obj1func1' in `%s': %s",
-	   "testobj1_1.so", dlerror ());
-
-  res1 = fp1 (10);
-  res2 = fp2 (10);
-  printf ("fp1(10) = %d\nfp2(10) = %d\n", res1, res2);
-
-  if (dlclose (h1) != 0)
-    error (EXIT_FAILURE, 0, "cannot close testobj1.so: %s\n", dlerror ());
-  if (dlclose (h2) != 0)
-    error (EXIT_FAILURE, 0, "cannot close testobj1_1.so: %s\n", dlerror ());
-
-  return res1 != 42 || res2 != 72;
-}
-
-
-extern int foo (int a);
-int
-foo (int a)
-{
-  return a + 10;
-}
diff --git a/elf/restest2.c b/elf/restest2.c
deleted file mode 100644
index f959f030a0..0000000000
--- a/elf/restest2.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <sys/types.h>
-#include <dlfcn.h>
-#include <error.h>
-#include <mcheck.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-pid_t pid, pid2;
-
-pid_t getpid(void)
-{
-  pid_t (*f)(void);
-  f = (pid_t (*)(void)) dlsym (RTLD_NEXT, "getpid");
-  if (f == NULL)
-    error (EXIT_FAILURE, 0, "dlsym (RTLD_NEXT, \"getpid\"): %s", dlerror ());
-  return (pid2 = f()) + 26;
-}
-
-int
-main (void)
-{
-  pid_t (*f)(void);
-
-  mtrace ();
-
-  f = (pid_t (*)(void)) dlsym (RTLD_DEFAULT, "getpid");
-  if (f == NULL)
-    error (EXIT_FAILURE, 0, "dlsym (RTLD_DEFAULT, \"getpid\"): %s", dlerror ());
-  pid = f();
-  if (pid != pid2 + 26)
-    error (EXIT_FAILURE, 0, "main getpid() not called");
-  return 0;
-}
diff --git a/elf/rtld-Rules b/elf/rtld-Rules
deleted file mode 100644
index 2c7b99828c..0000000000
--- a/elf/rtld-Rules
+++ /dev/null
@@ -1,149 +0,0 @@
-# Subroutine makefile for compiling libc modules linked into dynamic linker.
-
-# Copyright (C) 2002-2017 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, see
-# <http://www.gnu.org/licenses/>.
-
-# This makefile is never used by itself, but only from the rtld-libc.a
-# rule in Makefile, which does make -f librtld.mk -f rtld-Rules.
-# librtld.mk is the generated file containing variable definitions for
-# `rtld-subdirs', a subset of the top-level $(subdirs) list; and for each
-# SUBDIR in $(rtld-subdirs), `rtld-SUBDIR' listing `module.os' file names.
-
-.PHONY: rtld-all
-rtld-all:
-
-# When run from the elf/Makefile to build rtld-libc.a, $(subdir) is elf.
-ifneq ($(subdir),elf)
-ifndef rtld-modules
-error rtld-modules not set
-endif
-endif
-
-ifndef rtld-modules
-# Running to build rtld-libc.a, driving runs of $(rtld-subdir-make), below.
-
-ifndef rtld-subdirs
-error This makefile is a subroutine of elf/Makefile not to be used directly
-endif
-
-include ../Makeconfig
-
-rtld-all: $(objpfx)rtld-libc.a
-
-$(objpfx)rtld-libc.a: $(foreach dir,$(rtld-subdirs),\
-				$(addprefix $(common-objpfx)$(dir)/rtld-,\
-					    $(rtld-$(dir))))
-	@-rm -f $@T
-	$(AR) cq$(verbose) $@T $^
-	mv -f $@T $@
-
-# Use the verbose option of ar and tar when not running silently.
-ifeq	"$(findstring s,$(MAKEFLAGS))" ""	# if not -s
-verbose := v
-else						# -s
-verbose	:=
-endif						# not -s
-
-
-# For each subdirectory, define a pattern rule that makes all of that
-# subdirectory's modules at once with one recursive make command.
-object-suffixes-left := $(rtld-subdirs)
-define o-iterator-doit
-$(foreach obj,$(rtld-$o),$(common-objpfx)%/rtld-$(obj)): FORCE ; \
-	+$$(rtld-subdir-make)
-endef
-include $(patsubst %,../o-iterator.mk,$(object-suffixes-left))
-
-# This is how we descend into each subdirectory.  See below.
-define rtld-subdir-make
-$(MAKE) $(subdir-args) objdir=$(objdir) \
-	-f Makefile -f ../elf/rtld-Rules rtld-all \
-	rtld-modules='$(addprefix rtld-,$(rtld-$*))'
-endef
-
-# See subdir-target-args in ../Makefile for the model.
-subdir-args = subdir=$*$(if $($*-srcdir),\
-			    -C $($*-srcdir) ..=`pwd`/,\
-			    -C $(..)$* ..=../)
-
-FORCE:
-
-else
-
-# In this case we are being run by $(rtld-subdir-make), above.
-# Some other subdir's Makefile has provided all its normal rules,
-# and we just provide some additional definitions.
-
-rtld-compile-command.S = $(compile-command.S) $(rtld-CPPFLAGS)
-rtld-compile-command.s = $(compile-command.s) $(rtld-CPPFLAGS)
-rtld-compile-command.c = $(compile-command.c) $(rtld-CPPFLAGS) $(rtld-CFLAGS)
-
-# These are the basic compilation rules corresponding to the Makerules ones.
-# The sysd-rules generated makefile already defines pattern rules for rtld-%
-# targets built from sysdeps source files.
-$(objpfx)rtld-%.os: rtld-%.S $(before-compile)
-	$(rtld-compile-command.S)
-$(objpfx)rtld-%.os: rtld-%.s $(before-compile)
-	$(rtld-compile-command.s)
-$(objpfx)rtld-%.os: rtld-%.c $(before-compile)
-	$(rtld-compile-command.c)
-$(objpfx)rtld-%.os: %.S $(before-compile)
-	$(rtld-compile-command.S)
-$(objpfx)rtld-%.os: %.s $(before-compile)
-	$(rtld-compile-command.s)
-$(objpfx)rtld-%.os: %.c $(before-compile)
-	$(rtld-compile-command.c)
-
-# The rules for generated source files.
-$(objpfx)rtld-%.os: $(objpfx)rtld-%.S $(before-compile)
-	$(rtld-compile-command.S)
-$(objpfx)rtld-%.os: $(objpfx)rtld-%.s $(before-compile)
-	$(rtld-compile-command.s)
-$(objpfx)rtld-%.os: $(objpfx)rtld-%.c $(before-compile)
-	$(rtld-compile-command.c)
-$(objpfx)rtld-%.os: $(objpfx)%.S $(before-compile)
-	$(rtld-compile-command.S)
-$(objpfx)rtld-%.os: $(objpfx)%.s $(before-compile)
-	$(rtld-compile-command.s)
-$(objpfx)rtld-%.os: $(objpfx)%.c $(before-compile)
-	$(rtld-compile-command.c)
-
-# The command line setting of rtld-modules (see above) tells us
-# what we need to build, and that tells us what dependency files we need.
-rtld-all: $(addprefix $(objpfx),$(rtld-modules))
-
-# Figure out the dependency files we need.  After respecting the $(omit-deps)
-# list as applied to the names without the `rtld-', there may be none left.
-rtld-depfiles := $(patsubst %,$(objpfx)rtld-%.os.d,\
-			    $(filter-out $(omit-deps),\
-					 $(rtld-modules:rtld-%.os=%)))
-rtld-depfiles := $(strip $(wildcard $(rtld-depfiles)) \
-			 $(patsubst %.dt,%.d,\
-				    $(wildcard $(rtld-depfiles:.d=.dt))))
-ifdef rtld-depfiles
--include $(rtld-depfiles)
-endif
-
-# This here is the whole point of all the shenanigans.
-# Set libof-* for each routine.
-cpp-srcs-left := $(rtld-modules:%.os=%)
-lib := rtld
-include $(patsubst %,$(..)libof-iterator.mk,$(cpp-srcs-left))
-
-rtld-CFLAGS += $(no-stack-protector)
-
-endif
diff --git a/elf/rtld-debugger-interface.txt b/elf/rtld-debugger-interface.txt
deleted file mode 100644
index 61bc99e4b0..0000000000
--- a/elf/rtld-debugger-interface.txt
+++ /dev/null
@@ -1,122 +0,0 @@
-Standard debugger interface
-===========================
-
-The run-time linker exposes a rendezvous structure to allow debuggers
-to interface with it.  This structure, r_debug, is defined in link.h.
-If the executable's dynamic section has a DT_DEBUG element, the
-run-time linker sets that element's value to the address where this
-structure can be found.
-
-The r_debug structure contains (amongst others) the following fields:
-
-  struct link_map *r_map:
-    A linked list of loaded objects.
-
-  enum { RT_CONSISTENT, RT_ADD, RT_DELETE } r_state:
-    The current state of the r_map list.  RT_CONSISTENT means that r_map
-    is not currently being modified and may safely be inspected.  RT_ADD
-    means that an object is being added to r_map, and that the list is
-    not guaranteed to be consistent.  Likewise RT_DELETE means that an
-    object is being removed from the list.
-
-  ElfW(Addr) r_brk:
-    The address of a function internal to the run-time linker which is
-    called whenever r_state is changed.  The debugger should set a
-    breakpoint at this address if it wants to notice mapping changes.
-
-This protocol is widely supported, but somewhat limited in that it
-has no provision to provide access to multiple namespaces, and that
-the notifications (via r_brk) only refer to changes to r_map--the
-debugger is notified that a new object has been added, for instance,
-but there is no way for the debugger to discover whether any of the
-objects in the link-map have been relocated or not.
-
-
-Probe-based debugger interface
-==============================
-
-Systemtap is a dynamic tracing/instrumenting tool available on Linux.
-Probes that are not fired at run time have close to zero overhead.
-glibc contains a number of probes that debuggers can set breakpoints
-on in order to notice certain events.
-
-All rtld probes have the following arguments:
-
-  arg1: Lmid_t lmid:
-    The link-map ID of the link-map list that the object was loaded
-    into.  This will be LM_ID_BASE for the application's main link-map
-    list, or some other value for different namespaces.
-
-  arg2: struct r_debug *r_debug:
-    A pointer to the r_debug structure containing the link-map list
-    that the object was loaded into.  This will be the value stored in
-    DT_DEBUG for the application's main link-map list, or some other
-    value for different namespaces.
-
-map_complete and reloc_complete may have the following additional
-argument:
-
-  arg3: struct link_map *new:
-    A pointer which, if not NULL, points to the entry in the specified
-    r_debug structure's link-map list corresponding to the first new
-    object to have been mapped or relocated, with new->l_next pointing
-    to the link-map of the next new object to have been mapped or
-    relocated, and so on.  Note that because `new' is an entry in a
-    larger list, new->l_prev (if not NULL) will point to what was the
-    last link-map in the link-map list prior to the new objects being
-    mapped or relocated.
-
-The following probes are available:
-
-  init_start:
-    This is called once, when the linker is about to fill in the main
-    r_debug structure at application startup.  init_start always has
-    lmid set to LM_ID_BASE and r_debug set to the value stored in
-    DT_DEBUG.  r_debug is not guaranteed to be consistent until
-    init_complete is fired.
-
-  init_complete:
-    This is called once, when the linker has filled in the main
-    r_debug structure at application startup. init_complete always
-    has lmid set to LM_ID_BASE and r_debug set to the value stored
-    in DT_DEBUG.  The r_debug structure is consistent and may be
-    inspected, and all objects in the link-map are guaranteed to
-    have been relocated.
-
-  map_start:
-    The linker is about to map new objects into the specified
-    namespace.  The namespace's r_debug structure is not guaranteed
-    to be consistent until a corresponding map_complete is fired.
-
-  map_complete:
-    The linker has finished mapping new objects into the specified
-    namespace.  The namespace's r_debug structure is consistent and
-    may be inspected, although objects in the namespace's link-map
-    are not guaranteed to have been relocated.
-
-  map_failed:
-    The linker failed while attempting to map new objects into
-    the specified namespace.  The namespace's r_debug structure
-    is consistent and may be inspected.
-
-  reloc_start:
-    The linker is about to relocate all unrelocated objects in the
-    specified namespace.  The namespace's r_debug structure is not
-    guaranteed to be consistent until a corresponding reloc_complete
-    is fired.
-
-  reloc_complete:
-    The linker has relocated all objects in the specified namespace.
-    The namespace's r_debug structure is consistent and may be
-    inspected, and all objects in the namespace's link-map are
-    guaranteed to have been relocated.
-
-  unmap_start:
-    The linker is about to remove objects from the specified
-    namespace.  The namespace's r_debug structure is not guaranteed to
-    be consistent until a corresponding unmap_complete is fired.
-
-  unmap_complete:
-    The linker has finished removing objects into the specified
-    namespace.  The namespace's r_debug structure is consistent and
-    may be inspected.
diff --git a/elf/rtld.c b/elf/rtld.c
deleted file mode 100644
index 3746653afb..0000000000
--- a/elf/rtld.c
+++ /dev/null
@@ -1,2652 +0,0 @@
-/* Run time dynamic linker.
-   Copyright (C) 1995-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <dlfcn.h>
-#include <fcntl.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-#include <ldsodefs.h>
-#include <_itoa.h>
-#include <entry.h>
-#include <fpu_control.h>
-#include <hp-timing.h>
-#include <libc-lock.h>
-#include "dynamic-link.h"
-#include <dl-librecon.h>
-#include <unsecvars.h>
-#include <dl-cache.h>
-#include <dl-osinfo.h>
-#include <dl-procinfo.h>
-#include <tls.h>
-#include <stap-probe.h>
-#include <stackinfo.h>
-
-#include <assert.h>
-
-/* Avoid PLT use for our local calls at startup.  */
-extern __typeof (__mempcpy) __mempcpy attribute_hidden;
-
-/* GCC has mental blocks about _exit.  */
-extern __typeof (_exit) exit_internal asm ("_exit") attribute_hidden;
-#define _exit exit_internal
-
-/* Helper function to handle errors while resolving symbols.  */
-static void print_unresolved (int errcode, const char *objname,
-			      const char *errsting);
-
-/* Helper function to handle errors when a version is missing.  */
-static void print_missing_version (int errcode, const char *objname,
-				   const char *errsting);
-
-/* Print the various times we collected.  */
-static void print_statistics (hp_timing_t *total_timep);
-
-/* Add audit objects.  */
-static void process_dl_audit (char *str);
-
-/* This is a list of all the modes the dynamic loader can be in.  */
-enum mode { normal, list, verify, trace };
-
-/* Process all environments variables the dynamic linker must recognize.
-   Since all of them start with `LD_' we are a bit smarter while finding
-   all the entries.  */
-static void process_envvars (enum mode *modep);
-
-#ifdef DL_ARGV_NOT_RELRO
-int _dl_argc attribute_hidden;
-char **_dl_argv = NULL;
-/* Nonzero if we were run directly.  */
-unsigned int _dl_skip_args attribute_hidden;
-#else
-int _dl_argc attribute_relro attribute_hidden;
-char **_dl_argv attribute_relro = NULL;
-unsigned int _dl_skip_args attribute_relro attribute_hidden;
-#endif
-rtld_hidden_data_def (_dl_argv)
-
-#ifndef THREAD_SET_STACK_GUARD
-/* Only exported for architectures that don't store the stack guard canary
-   in thread local area.  */
-uintptr_t __stack_chk_guard attribute_relro;
-#endif
-
-/* Only exported for architectures that don't store the pointer guard
-   value in thread local area.  */
-uintptr_t __pointer_chk_guard_local
-     attribute_relro attribute_hidden __attribute__ ((nocommon));
-#ifndef THREAD_SET_POINTER_GUARD
-strong_alias (__pointer_chk_guard_local, __pointer_chk_guard)
-#endif
-
-
-/* List of auditing DSOs.  */
-static struct audit_list
-{
-  const char *name;
-  struct audit_list *next;
-} *audit_list;
-
-#ifndef HAVE_INLINED_SYSCALLS
-/* Set nonzero during loading and initialization of executable and
-   libraries, cleared before the executable's entry point runs.  This
-   must not be initialized to nonzero, because the unused dynamic
-   linker loaded in for libc.so's "ld.so.1" dep will provide the
-   definition seen by libc.so's initializer; that value must be zero,
-   and will be since that dynamic linker's _dl_start and dl_main will
-   never be called.  */
-int _dl_starting_up = 0;
-rtld_hidden_def (_dl_starting_up)
-#endif
-
-/* This is the structure which defines all variables global to ld.so
-   (except those which cannot be added for some reason).  */
-struct rtld_global _rtld_global =
-  {
-    /* Generally the default presumption without further information is an
-     * executable stack but this is not true for all platforms.  */
-    ._dl_stack_flags = DEFAULT_STACK_PERMS,
-#ifdef _LIBC_REENTRANT
-    ._dl_load_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
-    ._dl_load_write_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
-#endif
-    ._dl_nns = 1,
-    ._dl_ns =
-    {
-#ifdef _LIBC_REENTRANT
-      [LM_ID_BASE] = { ._ns_unique_sym_table
-		       = { .lock = _RTLD_LOCK_RECURSIVE_INITIALIZER } }
-#endif
-    }
-  };
-/* If we would use strong_alias here the compiler would see a
-   non-hidden definition.  This would undo the effect of the previous
-   declaration.  So spell out was strong_alias does plus add the
-   visibility attribute.  */
-extern struct rtld_global _rtld_local
-    __attribute__ ((alias ("_rtld_global"), visibility ("hidden")));
-
-
-/* This variable is similar to _rtld_local, but all values are
-   read-only after relocation.  */
-struct rtld_global_ro _rtld_global_ro attribute_relro =
-  {
-    /* Get architecture specific initializer.  */
-#include <dl-procinfo.c>
-#ifdef NEED_DL_SYSINFO
-    ._dl_sysinfo = DL_SYSINFO_DEFAULT,
-#endif
-    ._dl_debug_fd = STDERR_FILENO,
-    ._dl_use_load_bias = -2,
-    ._dl_correct_cache_id = _DL_CACHE_DEFAULT_ID,
-#if !HAVE_TUNABLES
-    ._dl_hwcap_mask = HWCAP_IMPORTANT,
-#endif
-    ._dl_lazy = 1,
-    ._dl_fpu_control = _FPU_DEFAULT,
-    ._dl_pagesize = EXEC_PAGESIZE,
-    ._dl_inhibit_cache = 0,
-
-    /* Function pointers.  */
-    ._dl_debug_printf = _dl_debug_printf,
-    ._dl_mcount = _dl_mcount,
-    ._dl_lookup_symbol_x = _dl_lookup_symbol_x,
-    ._dl_check_caller = _dl_check_caller,
-    ._dl_open = _dl_open,
-    ._dl_close = _dl_close,
-    ._dl_tls_get_addr_soft = _dl_tls_get_addr_soft,
-#ifdef HAVE_DL_DISCOVER_OSVERSION
-    ._dl_discover_osversion = _dl_discover_osversion
-#endif
-  };
-/* If we would use strong_alias here the compiler would see a
-   non-hidden definition.  This would undo the effect of the previous
-   declaration.  So spell out was strong_alias does plus add the
-   visibility attribute.  */
-extern struct rtld_global_ro _rtld_local_ro
-    __attribute__ ((alias ("_rtld_global_ro"), visibility ("hidden")));
-
-
-static void dl_main (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
-		     ElfW(Addr) *user_entry, ElfW(auxv_t) *auxv);
-
-/* These two variables cannot be moved into .data.rel.ro.  */
-static struct libname_list _dl_rtld_libname;
-static struct libname_list _dl_rtld_libname2;
-
-/* Variable for statistics.  */
-#ifndef HP_TIMING_NONAVAIL
-static hp_timing_t relocate_time;
-static hp_timing_t load_time attribute_relro;
-static hp_timing_t start_time attribute_relro;
-#endif
-
-/* Additional definitions needed by TLS initialization.  */
-#ifdef TLS_INIT_HELPER
-TLS_INIT_HELPER
-#endif
-
-/* Helper function for syscall implementation.  */
-#ifdef DL_SYSINFO_IMPLEMENTATION
-DL_SYSINFO_IMPLEMENTATION
-#endif
-
-/* Before ld.so is relocated we must not access variables which need
-   relocations.  This means variables which are exported.  Variables
-   declared as static are fine.  If we can mark a variable hidden this
-   is fine, too.  The latter is important here.  We can avoid setting
-   up a temporary link map for ld.so if we can mark _rtld_global as
-   hidden.  */
-#ifdef PI_STATIC_AND_HIDDEN
-# define DONT_USE_BOOTSTRAP_MAP	1
-#endif
-
-#ifdef DONT_USE_BOOTSTRAP_MAP
-static ElfW(Addr) _dl_start_final (void *arg);
-#else
-struct dl_start_final_info
-{
-  struct link_map l;
-#if !defined HP_TIMING_NONAVAIL && HP_TIMING_INLINE
-  hp_timing_t start_time;
-#endif
-};
-static ElfW(Addr) _dl_start_final (void *arg,
-				   struct dl_start_final_info *info);
-#endif
-
-/* These defined magically in the linker script.  */
-extern char _begin[] attribute_hidden;
-extern char _etext[] attribute_hidden;
-extern char _end[] attribute_hidden;
-
-
-#ifdef RTLD_START
-RTLD_START
-#else
-# error "sysdeps/MACHINE/dl-machine.h fails to define RTLD_START"
-#endif
-
-/* This is the second half of _dl_start (below).  It can be inlined safely
-   under DONT_USE_BOOTSTRAP_MAP, where it is careful not to make any GOT
-   references.  When the tools don't permit us to avoid using a GOT entry
-   for _dl_rtld_global (no attribute_hidden support), we must make sure
-   this function is not inlined (see below).  */
-
-#ifdef DONT_USE_BOOTSTRAP_MAP
-static inline ElfW(Addr) __attribute__ ((always_inline))
-_dl_start_final (void *arg)
-#else
-static ElfW(Addr) __attribute__ ((noinline))
-_dl_start_final (void *arg, struct dl_start_final_info *info)
-#endif
-{
-  ElfW(Addr) start_addr;
-
-  if (HP_SMALL_TIMING_AVAIL)
-    {
-      /* If it hasn't happen yet record the startup time.  */
-      if (! HP_TIMING_INLINE)
-	HP_TIMING_NOW (start_time);
-#if !defined DONT_USE_BOOTSTRAP_MAP && !defined HP_TIMING_NONAVAIL
-      else
-	start_time = info->start_time;
-#endif
-    }
-
-  /* Transfer data about ourselves to the permanent link_map structure.  */
-#ifndef DONT_USE_BOOTSTRAP_MAP
-  GL(dl_rtld_map).l_addr = info->l.l_addr;
-  GL(dl_rtld_map).l_ld = info->l.l_ld;
-  memcpy (GL(dl_rtld_map).l_info, info->l.l_info,
-	  sizeof GL(dl_rtld_map).l_info);
-  GL(dl_rtld_map).l_mach = info->l.l_mach;
-  GL(dl_rtld_map).l_relocated = 1;
-#endif
-  _dl_setup_hash (&GL(dl_rtld_map));
-  GL(dl_rtld_map).l_real = &GL(dl_rtld_map);
-  GL(dl_rtld_map).l_map_start = (ElfW(Addr)) _begin;
-  GL(dl_rtld_map).l_map_end = (ElfW(Addr)) _end;
-  GL(dl_rtld_map).l_text_end = (ElfW(Addr)) _etext;
-  /* Copy the TLS related data if necessary.  */
-#ifndef DONT_USE_BOOTSTRAP_MAP
-# if NO_TLS_OFFSET != 0
-  GL(dl_rtld_map).l_tls_offset = NO_TLS_OFFSET;
-# endif
-#endif
-
-  HP_TIMING_NOW (GL(dl_cpuclock_offset));
-
-  /* Initialize the stack end variable.  */
-  __libc_stack_end = __builtin_frame_address (0);
-
-  /* Call the OS-dependent function to set up life so we can do things like
-     file access.  It will call `dl_main' (below) to do all the real work
-     of the dynamic linker, and then unwind our frame and run the user
-     entry point on the same stack we entered on.  */
-  start_addr = _dl_sysdep_start (arg, &dl_main);
-
-#ifndef HP_TIMING_NONAVAIL
-  hp_timing_t rtld_total_time;
-  if (HP_SMALL_TIMING_AVAIL)
-    {
-      hp_timing_t end_time;
-
-      /* Get the current time.  */
-      HP_TIMING_NOW (end_time);
-
-      /* Compute the difference.  */
-      HP_TIMING_DIFF (rtld_total_time, start_time, end_time);
-    }
-#endif
-
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_STATISTICS))
-    {
-#ifndef HP_TIMING_NONAVAIL
-      print_statistics (&rtld_total_time);
-#else
-      print_statistics (NULL);
-#endif
-    }
-
-  return start_addr;
-}
-
-static ElfW(Addr) __attribute_used__ internal_function
-_dl_start (void *arg)
-{
-#ifdef DONT_USE_BOOTSTRAP_MAP
-# define bootstrap_map GL(dl_rtld_map)
-#else
-  struct dl_start_final_info info;
-# define bootstrap_map info.l
-#endif
-
-  /* This #define produces dynamic linking inline functions for
-     bootstrap relocation instead of general-purpose relocation.
-     Since ld.so must not have any undefined symbols the result
-     is trivial: always the map of ld.so itself.  */
-#define RTLD_BOOTSTRAP
-#define RESOLVE_MAP(sym, version, flags) (&bootstrap_map)
-#include "dynamic-link.h"
-
-  if (HP_TIMING_INLINE && HP_SMALL_TIMING_AVAIL)
-#ifdef DONT_USE_BOOTSTRAP_MAP
-    HP_TIMING_NOW (start_time);
-#else
-    HP_TIMING_NOW (info.start_time);
-#endif
-
-  /* Partly clean the `bootstrap_map' structure up.  Don't use
-     `memset' since it might not be built in or inlined and we cannot
-     make function calls at this point.  Use '__builtin_memset' if we
-     know it is available.  We do not have to clear the memory if we
-     do not have to use the temporary bootstrap_map.  Global variables
-     are initialized to zero by default.  */
-#ifndef DONT_USE_BOOTSTRAP_MAP
-# ifdef HAVE_BUILTIN_MEMSET
-  __builtin_memset (bootstrap_map.l_info, '\0', sizeof (bootstrap_map.l_info));
-# else
-  for (size_t cnt = 0;
-       cnt < sizeof (bootstrap_map.l_info) / sizeof (bootstrap_map.l_info[0]);
-       ++cnt)
-    bootstrap_map.l_info[cnt] = 0;
-# endif
-#endif
-
-  /* Figure out the run-time load address of the dynamic linker itself.  */
-  bootstrap_map.l_addr = elf_machine_load_address ();
-
-  /* Read our own dynamic section and fill in the info array.  */
-  bootstrap_map.l_ld = (void *) bootstrap_map.l_addr + elf_machine_dynamic ();
-  elf_get_dynamic_info (&bootstrap_map, NULL);
-
-#if NO_TLS_OFFSET != 0
-  bootstrap_map.l_tls_offset = NO_TLS_OFFSET;
-#endif
-
-#ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
-  ELF_MACHINE_BEFORE_RTLD_RELOC (bootstrap_map.l_info);
-#endif
-
-  if (bootstrap_map.l_addr || ! bootstrap_map.l_info[VALIDX(DT_GNU_PRELINKED)])
-    {
-      /* Relocate ourselves so we can do normal function calls and
-	 data access using the global offset table.  */
-
-      ELF_DYNAMIC_RELOCATE (&bootstrap_map, 0, 0, 0);
-    }
-  bootstrap_map.l_relocated = 1;
-
-  /* Please note that we don't allow profiling of this object and
-     therefore need not test whether we have to allocate the array
-     for the relocation results (as done in dl-reloc.c).  */
-
-  /* Now life is sane; we can call functions and access global data.
-     Set up to use the operating system facilities, and find out from
-     the operating system's program loader where to find the program
-     header table in core.  Put the rest of _dl_start into a separate
-     function, that way the compiler cannot put accesses to the GOT
-     before ELF_DYNAMIC_RELOCATE.  */
-  {
-#ifdef DONT_USE_BOOTSTRAP_MAP
-    ElfW(Addr) entry = _dl_start_final (arg);
-#else
-    ElfW(Addr) entry = _dl_start_final (arg, &info);
-#endif
-
-#ifndef ELF_MACHINE_START_ADDRESS
-# define ELF_MACHINE_START_ADDRESS(map, start) (start)
-#endif
-
-    return ELF_MACHINE_START_ADDRESS (GL(dl_ns)[LM_ID_BASE]._ns_loaded, entry);
-  }
-}
-
-
-
-/* Now life is peachy; we can do all normal operations.
-   On to the real work.  */
-
-/* Some helper functions.  */
-
-/* Arguments to relocate_doit.  */
-struct relocate_args
-{
-  struct link_map *l;
-  int reloc_mode;
-};
-
-struct map_args
-{
-  /* Argument to map_doit.  */
-  const char *str;
-  struct link_map *loader;
-  int mode;
-  /* Return value of map_doit.  */
-  struct link_map *map;
-};
-
-struct dlmopen_args
-{
-  const char *fname;
-  struct link_map *map;
-};
-
-struct lookup_args
-{
-  const char *name;
-  struct link_map *map;
-  void *result;
-};
-
-/* Arguments to version_check_doit.  */
-struct version_check_args
-{
-  int doexit;
-  int dotrace;
-};
-
-static void
-relocate_doit (void *a)
-{
-  struct relocate_args *args = (struct relocate_args *) a;
-
-  _dl_relocate_object (args->l, args->l->l_scope, args->reloc_mode, 0);
-}
-
-static void
-map_doit (void *a)
-{
-  struct map_args *args = (struct map_args *) a;
-  int type = (args->mode == __RTLD_OPENEXEC) ? lt_executable : lt_library;
-  args->map = _dl_map_object (args->loader, args->str, type, 0,
-			      args->mode, LM_ID_BASE);
-}
-
-static void
-dlmopen_doit (void *a)
-{
-  struct dlmopen_args *args = (struct dlmopen_args *) a;
-  args->map = _dl_open (args->fname,
-			(RTLD_LAZY | __RTLD_DLOPEN | __RTLD_AUDIT
-			 | __RTLD_SECURE),
-			dl_main, LM_ID_NEWLM, _dl_argc, _dl_argv,
-			__environ);
-}
-
-static void
-lookup_doit (void *a)
-{
-  struct lookup_args *args = (struct lookup_args *) a;
-  const ElfW(Sym) *ref = NULL;
-  args->result = NULL;
-  lookup_t l = _dl_lookup_symbol_x (args->name, args->map, &ref,
-				    args->map->l_local_scope, NULL, 0,
-				    DL_LOOKUP_RETURN_NEWEST, NULL);
-  if (ref != NULL)
-    args->result = DL_SYMBOL_ADDRESS (l, ref);
-}
-
-static void
-version_check_doit (void *a)
-{
-  struct version_check_args *args = (struct version_check_args *) a;
-  if (_dl_check_all_versions (GL(dl_ns)[LM_ID_BASE]._ns_loaded, 1,
-			      args->dotrace) && args->doexit)
-    /* We cannot start the application.  Abort now.  */
-    _exit (1);
-}
-
-
-static inline struct link_map *
-find_needed (const char *name)
-{
-  struct r_scope_elem *scope = &GL(dl_ns)[LM_ID_BASE]._ns_loaded->l_searchlist;
-  unsigned int n = scope->r_nlist;
-
-  while (n-- > 0)
-    if (_dl_name_match_p (name, scope->r_list[n]))
-      return scope->r_list[n];
-
-  /* Should never happen.  */
-  return NULL;
-}
-
-static int
-match_version (const char *string, struct link_map *map)
-{
-  const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
-  ElfW(Verdef) *def;
-
-#define VERDEFTAG (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERDEF))
-  if (map->l_info[VERDEFTAG] == NULL)
-    /* The file has no symbol versioning.  */
-    return 0;
-
-  def = (ElfW(Verdef) *) ((char *) map->l_addr
-			  + map->l_info[VERDEFTAG]->d_un.d_ptr);
-  while (1)
-    {
-      ElfW(Verdaux) *aux = (ElfW(Verdaux) *) ((char *) def + def->vd_aux);
-
-      /* Compare the version strings.  */
-      if (strcmp (string, strtab + aux->vda_name) == 0)
-	/* Bingo!  */
-	return 1;
-
-      /* If no more definitions we failed to find what we want.  */
-      if (def->vd_next == 0)
-	break;
-
-      /* Next definition.  */
-      def = (ElfW(Verdef) *) ((char *) def + def->vd_next);
-    }
-
-  return 0;
-}
-
-static bool tls_init_tp_called;
-
-static void *
-init_tls (void)
-{
-  /* Number of elements in the static TLS block.  */
-  GL(dl_tls_static_nelem) = GL(dl_tls_max_dtv_idx);
-
-  /* Do not do this twice.  The audit interface might have required
-     the DTV interfaces to be set up early.  */
-  if (GL(dl_initial_dtv) != NULL)
-    return NULL;
-
-  /* Allocate the array which contains the information about the
-     dtv slots.  We allocate a few entries more than needed to
-     avoid the need for reallocation.  */
-  size_t nelem = GL(dl_tls_max_dtv_idx) + 1 + TLS_SLOTINFO_SURPLUS;
-
-  /* Allocate.  */
-  GL(dl_tls_dtv_slotinfo_list) = (struct dtv_slotinfo_list *)
-    calloc (sizeof (struct dtv_slotinfo_list)
-	    + nelem * sizeof (struct dtv_slotinfo), 1);
-  /* No need to check the return value.  If memory allocation failed
-     the program would have been terminated.  */
-
-  struct dtv_slotinfo *slotinfo = GL(dl_tls_dtv_slotinfo_list)->slotinfo;
-  GL(dl_tls_dtv_slotinfo_list)->len = nelem;
-  GL(dl_tls_dtv_slotinfo_list)->next = NULL;
-
-  /* Fill in the information from the loaded modules.  No namespace
-     but the base one can be filled at this time.  */
-  assert (GL(dl_ns)[LM_ID_BASE + 1]._ns_loaded == NULL);
-  int i = 0;
-  for (struct link_map *l = GL(dl_ns)[LM_ID_BASE]._ns_loaded; l != NULL;
-       l = l->l_next)
-    if (l->l_tls_blocksize != 0)
-      {
-	/* This is a module with TLS data.  Store the map reference.
-	   The generation counter is zero.  */
-	slotinfo[i].map = l;
-	/* slotinfo[i].gen = 0; */
-	++i;
-      }
-  assert (i == GL(dl_tls_max_dtv_idx));
-
-  /* Compute the TLS offsets for the various blocks.  */
-  _dl_determine_tlsoffset ();
-
-  /* Construct the static TLS block and the dtv for the initial
-     thread.  For some platforms this will include allocating memory
-     for the thread descriptor.  The memory for the TLS block will
-     never be freed.  It should be allocated accordingly.  The dtv
-     array can be changed if dynamic loading requires it.  */
-  void *tcbp = _dl_allocate_tls_storage ();
-  if (tcbp == NULL)
-    _dl_fatal_printf ("\
-cannot allocate TLS data structures for initial thread");
-
-  /* Store for detection of the special case by __tls_get_addr
-     so it knows not to pass this dtv to the normal realloc.  */
-  GL(dl_initial_dtv) = GET_DTV (tcbp);
-
-  /* And finally install it for the main thread.  */
-  const char *lossage = TLS_INIT_TP (tcbp);
-  if (__glibc_unlikely (lossage != NULL))
-    _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage);
-  tls_init_tp_called = true;
-
-  return tcbp;
-}
-
-static unsigned int
-do_preload (const char *fname, struct link_map *main_map, const char *where)
-{
-  const char *objname;
-  const char *err_str = NULL;
-  struct map_args args;
-  bool malloced;
-
-  args.str = fname;
-  args.loader = main_map;
-  args.mode = __RTLD_SECURE;
-
-  unsigned int old_nloaded = GL(dl_ns)[LM_ID_BASE]._ns_nloaded;
-
-  (void) _dl_catch_error (&objname, &err_str, &malloced, map_doit, &args);
-  if (__glibc_unlikely (err_str != NULL))
-    {
-      _dl_error_printf ("\
-ERROR: ld.so: object '%s' from %s cannot be preloaded (%s): ignored.\n",
-			fname, where, err_str);
-      /* No need to call free, this is still before
-	 the libc's malloc is used.  */
-    }
-  else if (GL(dl_ns)[LM_ID_BASE]._ns_nloaded != old_nloaded)
-    /* It is no duplicate.  */
-    return 1;
-
-  /* Nothing loaded.  */
-  return 0;
-}
-
-#if defined SHARED && defined _LIBC_REENTRANT \
-    && defined __rtld_lock_default_lock_recursive
-static void
-rtld_lock_default_lock_recursive (void *lock)
-{
-  __rtld_lock_default_lock_recursive (lock);
-}
-
-static void
-rtld_lock_default_unlock_recursive (void *lock)
-{
-  __rtld_lock_default_unlock_recursive (lock);
-}
-#endif
-
-
-static void
-security_init (void)
-{
-  /* Set up the stack checker's canary.  */
-  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
-#ifdef THREAD_SET_STACK_GUARD
-  THREAD_SET_STACK_GUARD (stack_chk_guard);
-#else
-  __stack_chk_guard = stack_chk_guard;
-#endif
-
-  /* Set up the pointer guard as well, if necessary.  */
-  uintptr_t pointer_chk_guard
-    = _dl_setup_pointer_guard (_dl_random, stack_chk_guard);
-#ifdef THREAD_SET_POINTER_GUARD
-  THREAD_SET_POINTER_GUARD (pointer_chk_guard);
-#endif
-  __pointer_chk_guard_local = pointer_chk_guard;
-
-  /* We do not need the _dl_random value anymore.  The less
-     information we leave behind, the better, so clear the
-     variable.  */
-  _dl_random = NULL;
-}
-
-#include "setup-vdso.h"
-
-/* The library search path.  */
-static const char *library_path attribute_relro;
-/* The list preloaded objects.  */
-static const char *preloadlist attribute_relro;
-/* Nonzero if information about versions has to be printed.  */
-static int version_info attribute_relro;
-
-static void
-dl_main (const ElfW(Phdr) *phdr,
-	 ElfW(Word) phnum,
-	 ElfW(Addr) *user_entry,
-	 ElfW(auxv_t) *auxv)
-{
-  const ElfW(Phdr) *ph;
-  enum mode mode;
-  struct link_map *main_map;
-  size_t file_size;
-  char *file;
-  bool has_interp = false;
-  unsigned int i;
-  bool prelinked = false;
-  bool rtld_is_main = false;
-#ifndef HP_TIMING_NONAVAIL
-  hp_timing_t start;
-  hp_timing_t stop;
-  hp_timing_t diff;
-#endif
-  void *tcbp = NULL;
-
-  GL(dl_init_static_tls) = &_dl_nothread_init_static_tls;
-
-#if defined SHARED && defined _LIBC_REENTRANT \
-    && defined __rtld_lock_default_lock_recursive
-  GL(dl_rtld_lock_recursive) = rtld_lock_default_lock_recursive;
-  GL(dl_rtld_unlock_recursive) = rtld_lock_default_unlock_recursive;
-#endif
-
-  /* The explicit initialization here is cheaper than processing the reloc
-     in the _rtld_local definition's initializer.  */
-  GL(dl_make_stack_executable_hook) = &_dl_make_stack_executable;
-
-  /* Process the environment variable which control the behaviour.  */
-  process_envvars (&mode);
-
-#ifndef HAVE_INLINED_SYSCALLS
-  /* Set up a flag which tells we are just starting.  */
-  _dl_starting_up = 1;
-#endif
-
-  if (*user_entry == (ElfW(Addr)) ENTRY_POINT)
-    {
-      /* Ho ho.  We are not the program interpreter!  We are the program
-	 itself!  This means someone ran ld.so as a command.  Well, that
-	 might be convenient to do sometimes.  We support it by
-	 interpreting the args like this:
-
-	 ld.so PROGRAM ARGS...
-
-	 The first argument is the name of a file containing an ELF
-	 executable we will load and run with the following arguments.
-	 To simplify life here, PROGRAM is searched for using the
-	 normal rules for shared objects, rather than $PATH or anything
-	 like that.  We just load it and use its entry point; we don't
-	 pay attention to its PT_INTERP command (we are the interpreter
-	 ourselves).  This is an easy way to test a new ld.so before
-	 installing it.  */
-      rtld_is_main = true;
-
-      /* Note the place where the dynamic linker actually came from.  */
-      GL(dl_rtld_map).l_name = rtld_progname;
-
-      while (_dl_argc > 1)
-	if (! strcmp (_dl_argv[1], "--list"))
-	  {
-	    mode = list;
-	    GLRO(dl_lazy) = -1;	/* This means do no dependency analysis.  */
-
-	    ++_dl_skip_args;
-	    --_dl_argc;
-	    ++_dl_argv;
-	  }
-	else if (! strcmp (_dl_argv[1], "--verify"))
-	  {
-	    mode = verify;
-
-	    ++_dl_skip_args;
-	    --_dl_argc;
-	    ++_dl_argv;
-	  }
-	else if (! strcmp (_dl_argv[1], "--inhibit-cache"))
-	  {
-	    GLRO(dl_inhibit_cache) = 1;
-	    ++_dl_skip_args;
-	    --_dl_argc;
-	    ++_dl_argv;
-	  }
-	else if (! strcmp (_dl_argv[1], "--library-path")
-		 && _dl_argc > 2)
-	  {
-	    library_path = _dl_argv[2];
-
-	    _dl_skip_args += 2;
-	    _dl_argc -= 2;
-	    _dl_argv += 2;
-	  }
-	else if (! strcmp (_dl_argv[1], "--inhibit-rpath")
-		 && _dl_argc > 2)
-	  {
-	    GLRO(dl_inhibit_rpath) = _dl_argv[2];
-
-	    _dl_skip_args += 2;
-	    _dl_argc -= 2;
-	    _dl_argv += 2;
-	  }
-	else if (! strcmp (_dl_argv[1], "--audit") && _dl_argc > 2)
-	  {
-	    process_dl_audit (_dl_argv[2]);
-
-	    _dl_skip_args += 2;
-	    _dl_argc -= 2;
-	    _dl_argv += 2;
-	  }
-	else
-	  break;
-
-      /* If we have no further argument the program was called incorrectly.
-	 Grant the user some education.  */
-      if (_dl_argc < 2)
-	_dl_fatal_printf ("\
-Usage: ld.so [OPTION]... EXECUTABLE-FILE [ARGS-FOR-PROGRAM...]\n\
-You have invoked `ld.so', the helper program for shared library executables.\n\
-This program usually lives in the file `/lib/ld.so', and special directives\n\
-in executable files using ELF shared libraries tell the system's program\n\
-loader to load the helper program from this file.  This helper program loads\n\
-the shared libraries needed by the program executable, prepares the program\n\
-to run, and runs it.  You may invoke this helper program directly from the\n\
-command line to load and run an ELF executable file; this is like executing\n\
-that file itself, but always uses this helper program from the file you\n\
-specified, instead of the helper program file specified in the executable\n\
-file you run.  This is mostly of use for maintainers to test new versions\n\
-of this helper program; chances are you did not intend to run this program.\n\
-\n\
-  --list                list all dependencies and how they are resolved\n\
-  --verify              verify that given object really is a dynamically linked\n\
-			object we can handle\n\
-  --inhibit-cache       Do not use " LD_SO_CACHE "\n\
-  --library-path PATH   use given PATH instead of content of the environment\n\
-			variable LD_LIBRARY_PATH\n\
-  --inhibit-rpath LIST  ignore RUNPATH and RPATH information in object names\n\
-			in LIST\n\
-  --audit LIST          use objects named in LIST as auditors\n");
-
-      ++_dl_skip_args;
-      --_dl_argc;
-      ++_dl_argv;
-
-      /* The initialization of _dl_stack_flags done below assumes the
-	 executable's PT_GNU_STACK may have been honored by the kernel, and
-	 so a PT_GNU_STACK with PF_X set means the stack started out with
-	 execute permission.  However, this is not really true if the
-	 dynamic linker is the executable the kernel loaded.  For this
-	 case, we must reinitialize _dl_stack_flags to match the dynamic
-	 linker itself.  If the dynamic linker was built with a
-	 PT_GNU_STACK, then the kernel may have loaded us with a
-	 nonexecutable stack that we will have to make executable when we
-	 load the program below unless it has a PT_GNU_STACK indicating
-	 nonexecutable stack is ok.  */
-
-      for (ph = phdr; ph < &phdr[phnum]; ++ph)
-	if (ph->p_type == PT_GNU_STACK)
-	  {
-	    GL(dl_stack_flags) = ph->p_flags;
-	    break;
-	  }
-
-      if (__builtin_expect (mode, normal) == verify)
-	{
-	  const char *objname;
-	  const char *err_str = NULL;
-	  struct map_args args;
-	  bool malloced;
-
-	  args.str = rtld_progname;
-	  args.loader = NULL;
-	  args.mode = __RTLD_OPENEXEC;
-	  (void) _dl_catch_error (&objname, &err_str, &malloced, map_doit,
-				  &args);
-	  if (__glibc_unlikely (err_str != NULL))
-	    /* We don't free the returned string, the programs stops
-	       anyway.  */
-	    _exit (EXIT_FAILURE);
-	}
-      else
-	{
-	  HP_TIMING_NOW (start);
-	  _dl_map_object (NULL, rtld_progname, lt_executable, 0,
-			  __RTLD_OPENEXEC, LM_ID_BASE);
-	  HP_TIMING_NOW (stop);
-
-	  HP_TIMING_DIFF (load_time, start, stop);
-	}
-
-      /* Now the map for the main executable is available.  */
-      main_map = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
-
-      if (__builtin_expect (mode, normal) == normal
-	  && GL(dl_rtld_map).l_info[DT_SONAME] != NULL
-	  && main_map->l_info[DT_SONAME] != NULL
-	  && strcmp ((const char *) D_PTR (&GL(dl_rtld_map), l_info[DT_STRTAB])
-		     + GL(dl_rtld_map).l_info[DT_SONAME]->d_un.d_val,
-		     (const char *) D_PTR (main_map, l_info[DT_STRTAB])
-		     + main_map->l_info[DT_SONAME]->d_un.d_val) == 0)
-	_dl_fatal_printf ("loader cannot load itself\n");
-
-      phdr = main_map->l_phdr;
-      phnum = main_map->l_phnum;
-      /* We overwrite here a pointer to a malloc()ed string.  But since
-	 the malloc() implementation used at this point is the dummy
-	 implementations which has no real free() function it does not
-	 makes sense to free the old string first.  */
-      main_map->l_name = (char *) "";
-      *user_entry = main_map->l_entry;
-
-#ifdef HAVE_AUX_VECTOR
-      /* Adjust the on-stack auxiliary vector so that it looks like the
-	 binary was executed directly.  */
-      for (ElfW(auxv_t) *av = auxv; av->a_type != AT_NULL; av++)
-	switch (av->a_type)
-	  {
-	  case AT_PHDR:
-	    av->a_un.a_val = (uintptr_t) phdr;
-	    break;
-	  case AT_PHNUM:
-	    av->a_un.a_val = phnum;
-	    break;
-	  case AT_ENTRY:
-	    av->a_un.a_val = *user_entry;
-	    break;
-	  case AT_EXECFN:
-	    av->a_un.a_val = (uintptr_t) _dl_argv[0];
-	    break;
-	  }
-#endif
-    }
-  else
-    {
-      /* Create a link_map for the executable itself.
-	 This will be what dlopen on "" returns.  */
-      main_map = _dl_new_object ((char *) "", "", lt_executable, NULL,
-				 __RTLD_OPENEXEC, LM_ID_BASE);
-      assert (main_map != NULL);
-      main_map->l_phdr = phdr;
-      main_map->l_phnum = phnum;
-      main_map->l_entry = *user_entry;
-
-      /* Even though the link map is not yet fully initialized we can add
-	 it to the map list since there are no possible users running yet.  */
-      _dl_add_to_namespace_list (main_map, LM_ID_BASE);
-      assert (main_map == GL(dl_ns)[LM_ID_BASE]._ns_loaded);
-
-      /* At this point we are in a bit of trouble.  We would have to
-	 fill in the values for l_dev and l_ino.  But in general we
-	 do not know where the file is.  We also do not handle AT_EXECFD
-	 even if it would be passed up.
-
-	 We leave the values here defined to 0.  This is normally no
-	 problem as the program code itself is normally no shared
-	 object and therefore cannot be loaded dynamically.  Nothing
-	 prevent the use of dynamic binaries and in these situations
-	 we might get problems.  We might not be able to find out
-	 whether the object is already loaded.  But since there is no
-	 easy way out and because the dynamic binary must also not
-	 have an SONAME we ignore this program for now.  If it becomes
-	 a problem we can force people using SONAMEs.  */
-
-      /* We delay initializing the path structure until we got the dynamic
-	 information for the program.  */
-    }
-
-  main_map->l_map_end = 0;
-  main_map->l_text_end = 0;
-  /* Perhaps the executable has no PT_LOAD header entries at all.  */
-  main_map->l_map_start = ~0;
-  /* And it was opened directly.  */
-  ++main_map->l_direct_opencount;
-
-  /* Scan the program header table for the dynamic section.  */
-  for (ph = phdr; ph < &phdr[phnum]; ++ph)
-    switch (ph->p_type)
-      {
-      case PT_PHDR:
-	/* Find out the load address.  */
-	main_map->l_addr = (ElfW(Addr)) phdr - ph->p_vaddr;
-	break;
-      case PT_DYNAMIC:
-	/* This tells us where to find the dynamic section,
-	   which tells us everything we need to do.  */
-	main_map->l_ld = (void *) main_map->l_addr + ph->p_vaddr;
-	break;
-      case PT_INTERP:
-	/* This "interpreter segment" was used by the program loader to
-	   find the program interpreter, which is this program itself, the
-	   dynamic linker.  We note what name finds us, so that a future
-	   dlopen call or DT_NEEDED entry, for something that wants to link
-	   against the dynamic linker as a shared library, will know that
-	   the shared object is already loaded.  */
-	_dl_rtld_libname.name = ((const char *) main_map->l_addr
-				 + ph->p_vaddr);
-	/* _dl_rtld_libname.next = NULL;	Already zero.  */
-	GL(dl_rtld_map).l_libname = &_dl_rtld_libname;
-
-	/* Ordinarilly, we would get additional names for the loader from
-	   our DT_SONAME.  This can't happen if we were actually linked as
-	   a static executable (detect this case when we have no DYNAMIC).
-	   If so, assume the filename component of the interpreter path to
-	   be our SONAME, and add it to our name list.  */
-	if (GL(dl_rtld_map).l_ld == NULL)
-	  {
-	    const char *p = NULL;
-	    const char *cp = _dl_rtld_libname.name;
-
-	    /* Find the filename part of the path.  */
-	    while (*cp != '\0')
-	      if (*cp++ == '/')
-		p = cp;
-
-	    if (p != NULL)
-	      {
-		_dl_rtld_libname2.name = p;
-		/* _dl_rtld_libname2.next = NULL;  Already zero.  */
-		_dl_rtld_libname.next = &_dl_rtld_libname2;
-	      }
-	  }
-
-	has_interp = true;
-	break;
-      case PT_LOAD:
-	{
-	  ElfW(Addr) mapstart;
-	  ElfW(Addr) allocend;
-
-	  /* Remember where the main program starts in memory.  */
-	  mapstart = (main_map->l_addr
-		      + (ph->p_vaddr & ~(GLRO(dl_pagesize) - 1)));
-	  if (main_map->l_map_start > mapstart)
-	    main_map->l_map_start = mapstart;
-
-	  /* Also where it ends.  */
-	  allocend = main_map->l_addr + ph->p_vaddr + ph->p_memsz;
-	  if (main_map->l_map_end < allocend)
-	    main_map->l_map_end = allocend;
-	  if ((ph->p_flags & PF_X) && allocend > main_map->l_text_end)
-	    main_map->l_text_end = allocend;
-	}
-	break;
-
-      case PT_TLS:
-	if (ph->p_memsz > 0)
-	  {
-	    /* Note that in the case the dynamic linker we duplicate work
-	       here since we read the PT_TLS entry already in
-	       _dl_start_final.  But the result is repeatable so do not
-	       check for this special but unimportant case.  */
-	    main_map->l_tls_blocksize = ph->p_memsz;
-	    main_map->l_tls_align = ph->p_align;
-	    if (ph->p_align == 0)
-	      main_map->l_tls_firstbyte_offset = 0;
-	    else
-	      main_map->l_tls_firstbyte_offset = (ph->p_vaddr
-						  & (ph->p_align - 1));
-	    main_map->l_tls_initimage_size = ph->p_filesz;
-	    main_map->l_tls_initimage = (void *) ph->p_vaddr;
-
-	    /* This image gets the ID one.  */
-	    GL(dl_tls_max_dtv_idx) = main_map->l_tls_modid = 1;
-	  }
-	break;
-
-      case PT_GNU_STACK:
-	GL(dl_stack_flags) = ph->p_flags;
-	break;
-
-      case PT_GNU_RELRO:
-	main_map->l_relro_addr = ph->p_vaddr;
-	main_map->l_relro_size = ph->p_memsz;
-	break;
-      }
-
-  /* Adjust the address of the TLS initialization image in case
-     the executable is actually an ET_DYN object.  */
-  if (main_map->l_tls_initimage != NULL)
-    main_map->l_tls_initimage
-      = (char *) main_map->l_tls_initimage + main_map->l_addr;
-  if (! main_map->l_map_end)
-    main_map->l_map_end = ~0;
-  if (! main_map->l_text_end)
-    main_map->l_text_end = ~0;
-  if (! GL(dl_rtld_map).l_libname && GL(dl_rtld_map).l_name)
-    {
-      /* We were invoked directly, so the program might not have a
-	 PT_INTERP.  */
-      _dl_rtld_libname.name = GL(dl_rtld_map).l_name;
-      /* _dl_rtld_libname.next = NULL;	Already zero.  */
-      GL(dl_rtld_map).l_libname =  &_dl_rtld_libname;
-    }
-  else
-    assert (GL(dl_rtld_map).l_libname); /* How else did we get here?  */
-
-  /* If the current libname is different from the SONAME, add the
-     latter as well.  */
-  if (GL(dl_rtld_map).l_info[DT_SONAME] != NULL
-      && strcmp (GL(dl_rtld_map).l_libname->name,
-		 (const char *) D_PTR (&GL(dl_rtld_map), l_info[DT_STRTAB])
-		 + GL(dl_rtld_map).l_info[DT_SONAME]->d_un.d_val) != 0)
-    {
-      static struct libname_list newname;
-      newname.name = ((char *) D_PTR (&GL(dl_rtld_map), l_info[DT_STRTAB])
-		      + GL(dl_rtld_map).l_info[DT_SONAME]->d_un.d_ptr);
-      newname.next = NULL;
-      newname.dont_free = 1;
-
-      assert (GL(dl_rtld_map).l_libname->next == NULL);
-      GL(dl_rtld_map).l_libname->next = &newname;
-    }
-  /* The ld.so must be relocated since otherwise loading audit modules
-     will fail since they reuse the very same ld.so.  */
-  assert (GL(dl_rtld_map).l_relocated);
-
-  if (! rtld_is_main)
-    {
-      /* Extract the contents of the dynamic section for easy access.  */
-      elf_get_dynamic_info (main_map, NULL);
-      /* Set up our cache of pointers into the hash table.  */
-      _dl_setup_hash (main_map);
-    }
-
-  if (__builtin_expect (mode, normal) == verify)
-    {
-      /* We were called just to verify that this is a dynamic
-	 executable using us as the program interpreter.  Exit with an
-	 error if we were not able to load the binary or no interpreter
-	 is specified (i.e., this is no dynamically linked binary.  */
-      if (main_map->l_ld == NULL)
-	_exit (1);
-
-      /* We allow here some platform specific code.  */
-#ifdef DISTINGUISH_LIB_VERSIONS
-      DISTINGUISH_LIB_VERSIONS;
-#endif
-      _exit (has_interp ? 0 : 2);
-    }
-
-  struct link_map **first_preload = &GL(dl_rtld_map).l_next;
-  /* Set up the data structures for the system-supplied DSO early,
-     so they can influence _dl_init_paths.  */
-  setup_vdso (main_map, &first_preload);
-
-#ifdef DL_SYSDEP_OSCHECK
-  DL_SYSDEP_OSCHECK (_dl_fatal_printf);
-#endif
-
-  /* Initialize the data structures for the search paths for shared
-     objects.  */
-  _dl_init_paths (library_path);
-
-  /* Initialize _r_debug.  */
-  struct r_debug *r = _dl_debug_initialize (GL(dl_rtld_map).l_addr,
-					    LM_ID_BASE);
-  r->r_state = RT_CONSISTENT;
-
-  /* Put the link_map for ourselves on the chain so it can be found by
-     name.  Note that at this point the global chain of link maps contains
-     exactly one element, which is pointed to by dl_loaded.  */
-  if (! GL(dl_rtld_map).l_name)
-    /* If not invoked directly, the dynamic linker shared object file was
-       found by the PT_INTERP name.  */
-    GL(dl_rtld_map).l_name = (char *) GL(dl_rtld_map).l_libname->name;
-  GL(dl_rtld_map).l_type = lt_library;
-  main_map->l_next = &GL(dl_rtld_map);
-  GL(dl_rtld_map).l_prev = main_map;
-  ++GL(dl_ns)[LM_ID_BASE]._ns_nloaded;
-  ++GL(dl_load_adds);
-
-  /* If LD_USE_LOAD_BIAS env variable has not been seen, default
-     to not using bias for non-prelinked PIEs and libraries
-     and using it for executables or prelinked PIEs or libraries.  */
-  if (GLRO(dl_use_load_bias) == (ElfW(Addr)) -2)
-    GLRO(dl_use_load_bias) = main_map->l_addr == 0 ? -1 : 0;
-
-  /* Set up the program header information for the dynamic linker
-     itself.  It is needed in the dl_iterate_phdr callbacks.  */
-  const ElfW(Ehdr) *rtld_ehdr;
-
-  /* Starting from binutils-2.23, the linker will define the magic symbol
-     __ehdr_start to point to our own ELF header if it is visible in a
-     segment that also includes the phdrs.  If that's not available, we use
-     the old method that assumes the beginning of the file is part of the
-     lowest-addressed PT_LOAD segment.  */
-#ifdef HAVE_EHDR_START
-  extern const ElfW(Ehdr) __ehdr_start __attribute__ ((visibility ("hidden")));
-  rtld_ehdr = &__ehdr_start;
-#else
-  rtld_ehdr = (void *) GL(dl_rtld_map).l_map_start;
-#endif
-  assert (rtld_ehdr->e_ehsize == sizeof *rtld_ehdr);
-  assert (rtld_ehdr->e_phentsize == sizeof (ElfW(Phdr)));
-
-  const ElfW(Phdr) *rtld_phdr = (const void *) rtld_ehdr + rtld_ehdr->e_phoff;
-
-  GL(dl_rtld_map).l_phdr = rtld_phdr;
-  GL(dl_rtld_map).l_phnum = rtld_ehdr->e_phnum;
-
-
-  /* PT_GNU_RELRO is usually the last phdr.  */
-  size_t cnt = rtld_ehdr->e_phnum;
-  while (cnt-- > 0)
-    if (rtld_phdr[cnt].p_type == PT_GNU_RELRO)
-      {
-	GL(dl_rtld_map).l_relro_addr = rtld_phdr[cnt].p_vaddr;
-	GL(dl_rtld_map).l_relro_size = rtld_phdr[cnt].p_memsz;
-	break;
-      }
-
-  /* Add the dynamic linker to the TLS list if it also uses TLS.  */
-  if (GL(dl_rtld_map).l_tls_blocksize != 0)
-    /* Assign a module ID.  Do this before loading any audit modules.  */
-    GL(dl_rtld_map).l_tls_modid = _dl_next_tls_modid ();
-
-  /* If we have auditing DSOs to load, do it now.  */
-  if (__glibc_unlikely (audit_list != NULL))
-    {
-      /* Iterate over all entries in the list.  The order is important.  */
-      struct audit_ifaces *last_audit = NULL;
-      struct audit_list *al = audit_list->next;
-
-      /* Since we start using the auditing DSOs right away we need to
-	 initialize the data structures now.  */
-      tcbp = init_tls ();
-
-      /* Initialize security features.  We need to do it this early
-	 since otherwise the constructors of the audit libraries will
-	 use different values (especially the pointer guard) and will
-	 fail later on.  */
-      security_init ();
-
-      do
-	{
-	  int tls_idx = GL(dl_tls_max_dtv_idx);
-
-	  /* Now it is time to determine the layout of the static TLS
-	     block and allocate it for the initial thread.  Note that we
-	     always allocate the static block, we never defer it even if
-	     no DF_STATIC_TLS bit is set.  The reason is that we know
-	     glibc will use the static model.  */
-	  struct dlmopen_args dlmargs;
-	  dlmargs.fname = al->name;
-	  dlmargs.map = NULL;
-
-	  const char *objname;
-	  const char *err_str = NULL;
-	  bool malloced;
-	  (void) _dl_catch_error (&objname, &err_str, &malloced, dlmopen_doit,
-				  &dlmargs);
-	  if (__glibc_unlikely (err_str != NULL))
-	    {
-	    not_loaded:
-	      _dl_error_printf ("\
-ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
-				al->name, err_str);
-	      if (malloced)
-		free ((char *) err_str);
-	    }
-	  else
-	    {
-	      struct lookup_args largs;
-	      largs.name = "la_version";
-	      largs.map = dlmargs.map;
-
-	      /* Check whether the interface version matches.  */
-	      (void) _dl_catch_error (&objname, &err_str, &malloced,
-				      lookup_doit, &largs);
-
-	      unsigned int (*laversion) (unsigned int);
-	      unsigned int lav;
-	      if  (err_str == NULL
-		   && (laversion = largs.result) != NULL
-		   && (lav = laversion (LAV_CURRENT)) > 0
-		   && lav <= LAV_CURRENT)
-		{
-		  /* Allocate structure for the callback function pointers.
-		     This call can never fail.  */
-		  union
-		  {
-		    struct audit_ifaces ifaces;
-#define naudit_ifaces 8
-		    void (*fptr[naudit_ifaces]) (void);
-		  } *newp = malloc (sizeof (*newp));
-
-		  /* Names of the auditing interfaces.  All in one
-		     long string.  */
-		  static const char audit_iface_names[] =
-		    "la_activity\0"
-		    "la_objsearch\0"
-		    "la_objopen\0"
-		    "la_preinit\0"
-#if __ELF_NATIVE_CLASS == 32
-		    "la_symbind32\0"
-#elif __ELF_NATIVE_CLASS == 64
-		    "la_symbind64\0"
-#else
-# error "__ELF_NATIVE_CLASS must be defined"
-#endif
-#define STRING(s) __STRING (s)
-		    "la_" STRING (ARCH_LA_PLTENTER) "\0"
-		    "la_" STRING (ARCH_LA_PLTEXIT) "\0"
-		    "la_objclose\0";
-		  unsigned int cnt = 0;
-		  const char *cp = audit_iface_names;
-		  do
-		    {
-		      largs.name = cp;
-		      (void) _dl_catch_error (&objname, &err_str, &malloced,
-					      lookup_doit, &largs);
-
-		      /* Store the pointer.  */
-		      if (err_str == NULL && largs.result != NULL)
-			{
-			  newp->fptr[cnt] = largs.result;
-
-			  /* The dynamic linker link map is statically
-			     allocated, initialize the data now.   */
-			  GL(dl_rtld_map).l_audit[cnt].cookie
-			    = (intptr_t) &GL(dl_rtld_map);
-			}
-		      else
-			newp->fptr[cnt] = NULL;
-		      ++cnt;
-
-		      cp = (char *) rawmemchr (cp, '\0') + 1;
-		    }
-		  while (*cp != '\0');
-		  assert (cnt == naudit_ifaces);
-
-		  /* Now append the new auditing interface to the list.  */
-		  newp->ifaces.next = NULL;
-		  if (last_audit == NULL)
-		    last_audit = GLRO(dl_audit) = &newp->ifaces;
-		  else
-		    last_audit = last_audit->next = &newp->ifaces;
-		  ++GLRO(dl_naudit);
-
-		  /* Mark the DSO as being used for auditing.  */
-		  dlmargs.map->l_auditing = 1;
-		}
-	      else
-		{
-		  /* We cannot use the DSO, it does not have the
-		     appropriate interfaces or it expects something
-		     more recent.  */
-#ifndef NDEBUG
-		  Lmid_t ns = dlmargs.map->l_ns;
-#endif
-		  _dl_close (dlmargs.map);
-
-		  /* Make sure the namespace has been cleared entirely.  */
-		  assert (GL(dl_ns)[ns]._ns_loaded == NULL);
-		  assert (GL(dl_ns)[ns]._ns_nloaded == 0);
-
-		  GL(dl_tls_max_dtv_idx) = tls_idx;
-		  goto not_loaded;
-		}
-	    }
-
-	  al = al->next;
-	}
-      while (al != audit_list->next);
-
-      /* If we have any auditing modules, announce that we already
-	 have two objects loaded.  */
-      if (__glibc_unlikely (GLRO(dl_naudit) > 0))
-	{
-	  struct link_map *ls[2] = { main_map, &GL(dl_rtld_map) };
-
-	  for (unsigned int outer = 0; outer < 2; ++outer)
-	    {
-	      struct audit_ifaces *afct = GLRO(dl_audit);
-	      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-		{
-		  if (afct->objopen != NULL)
-		    {
-		      ls[outer]->l_audit[cnt].bindflags
-			= afct->objopen (ls[outer], LM_ID_BASE,
-					 &ls[outer]->l_audit[cnt].cookie);
-
-		      ls[outer]->l_audit_any_plt
-			|= ls[outer]->l_audit[cnt].bindflags != 0;
-		    }
-
-		  afct = afct->next;
-		}
-	    }
-	}
-    }
-
-  /* Keep track of the currently loaded modules to count how many
-     non-audit modules which use TLS are loaded.  */
-  size_t count_modids = _dl_count_modids ();
-
-  /* Set up debugging before the debugger is notified for the first time.  */
-#ifdef ELF_MACHINE_DEBUG_SETUP
-  /* Some machines (e.g. MIPS) don't use DT_DEBUG in this way.  */
-  ELF_MACHINE_DEBUG_SETUP (main_map, r);
-  ELF_MACHINE_DEBUG_SETUP (&GL(dl_rtld_map), r);
-#else
-  if (main_map->l_info[DT_DEBUG] != NULL)
-    /* There is a DT_DEBUG entry in the dynamic section.  Fill it in
-       with the run-time address of the r_debug structure  */
-    main_map->l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r;
-
-  /* Fill in the pointer in the dynamic linker's own dynamic section, in
-     case you run gdb on the dynamic linker directly.  */
-  if (GL(dl_rtld_map).l_info[DT_DEBUG] != NULL)
-    GL(dl_rtld_map).l_info[DT_DEBUG]->d_un.d_ptr = (ElfW(Addr)) r;
-#endif
-
-  /* We start adding objects.  */
-  r->r_state = RT_ADD;
-  _dl_debug_state ();
-  LIBC_PROBE (init_start, 2, LM_ID_BASE, r);
-
-  /* Auditing checkpoint: we are ready to signal that the initial map
-     is being constructed.  */
-  if (__glibc_unlikely (GLRO(dl_naudit) > 0))
-    {
-      struct audit_ifaces *afct = GLRO(dl_audit);
-      for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-	{
-	  if (afct->activity != NULL)
-	    afct->activity (&main_map->l_audit[cnt].cookie, LA_ACT_ADD);
-
-	  afct = afct->next;
-	}
-    }
-
-  /* We have two ways to specify objects to preload: via environment
-     variable and via the file /etc/ld.so.preload.  The latter can also
-     be used when security is enabled.  */
-  assert (*first_preload == NULL);
-  struct link_map **preloads = NULL;
-  unsigned int npreloads = 0;
-
-  if (__glibc_unlikely (preloadlist != NULL))
-    {
-      /* The LD_PRELOAD environment variable gives list of libraries
-	 separated by white space or colons that are loaded before the
-	 executable's dependencies and prepended to the global scope
-	 list.  If the binary is running setuid all elements
-	 containing a '/' are ignored since it is insecure.  */
-      char *list = strdupa (preloadlist);
-      char *p;
-
-      HP_TIMING_NOW (start);
-
-      /* Prevent optimizing strsep.  Speed is not important here.  */
-      while ((p = (strsep) (&list, " :")) != NULL)
-	if (p[0] != '\0'
-	    && (__builtin_expect (! __libc_enable_secure, 1)
-		|| strchr (p, '/') == NULL))
-	  npreloads += do_preload (p, main_map, "LD_PRELOAD");
-
-      HP_TIMING_NOW (stop);
-      HP_TIMING_DIFF (diff, start, stop);
-      HP_TIMING_ACCUM_NT (load_time, diff);
-    }
-
-  /* There usually is no ld.so.preload file, it should only be used
-     for emergencies and testing.  So the open call etc should usually
-     fail.  Using access() on a non-existing file is faster than using
-     open().  So we do this first.  If it succeeds we do almost twice
-     the work but this does not matter, since it is not for production
-     use.  */
-  static const char preload_file[] = "/etc/ld.so.preload";
-  if (__glibc_unlikely (__access (preload_file, R_OK) == 0))
-    {
-      /* Read the contents of the file.  */
-      file = _dl_sysdep_read_whole_file (preload_file, &file_size,
-					 PROT_READ | PROT_WRITE);
-      if (__glibc_unlikely (file != MAP_FAILED))
-	{
-	  /* Parse the file.  It contains names of libraries to be loaded,
-	     separated by white spaces or `:'.  It may also contain
-	     comments introduced by `#'.  */
-	  char *problem;
-	  char *runp;
-	  size_t rest;
-
-	  /* Eliminate comments.  */
-	  runp = file;
-	  rest = file_size;
-	  while (rest > 0)
-	    {
-	      char *comment = memchr (runp, '#', rest);
-	      if (comment == NULL)
-		break;
-
-	      rest -= comment - runp;
-	      do
-		*comment = ' ';
-	      while (--rest > 0 && *++comment != '\n');
-	    }
-
-	  /* We have one problematic case: if we have a name at the end of
-	     the file without a trailing terminating characters, we cannot
-	     place the \0.  Handle the case separately.  */
-	  if (file[file_size - 1] != ' ' && file[file_size - 1] != '\t'
-	      && file[file_size - 1] != '\n' && file[file_size - 1] != ':')
-	    {
-	      problem = &file[file_size];
-	      while (problem > file && problem[-1] != ' '
-		     && problem[-1] != '\t'
-		     && problem[-1] != '\n' && problem[-1] != ':')
-		--problem;
-
-	      if (problem > file)
-		problem[-1] = '\0';
-	    }
-	  else
-	    {
-	      problem = NULL;
-	      file[file_size - 1] = '\0';
-	    }
-
-	  HP_TIMING_NOW (start);
-
-	  if (file != problem)
-	    {
-	      char *p;
-	      runp = file;
-	      while ((p = strsep (&runp, ": \t\n")) != NULL)
-		if (p[0] != '\0')
-		  npreloads += do_preload (p, main_map, preload_file);
-	    }
-
-	  if (problem != NULL)
-	    {
-	      char *p = strndupa (problem, file_size - (problem - file));
-
-	      npreloads += do_preload (p, main_map, preload_file);
-	    }
-
-	  HP_TIMING_NOW (stop);
-	  HP_TIMING_DIFF (diff, start, stop);
-	  HP_TIMING_ACCUM_NT (load_time, diff);
-
-	  /* We don't need the file anymore.  */
-	  __munmap (file, file_size);
-	}
-    }
-
-  if (__glibc_unlikely (*first_preload != NULL))
-    {
-      /* Set up PRELOADS with a vector of the preloaded libraries.  */
-      struct link_map *l = *first_preload;
-      preloads = __alloca (npreloads * sizeof preloads[0]);
-      i = 0;
-      do
-	{
-	  preloads[i++] = l;
-	  l = l->l_next;
-	} while (l);
-      assert (i == npreloads);
-    }
-
-  /* Load all the libraries specified by DT_NEEDED entries.  If LD_PRELOAD
-     specified some libraries to load, these are inserted before the actual
-     dependencies in the executable's searchlist for symbol resolution.  */
-  HP_TIMING_NOW (start);
-  _dl_map_object_deps (main_map, preloads, npreloads, mode == trace, 0);
-  HP_TIMING_NOW (stop);
-  HP_TIMING_DIFF (diff, start, stop);
-  HP_TIMING_ACCUM_NT (load_time, diff);
-
-  /* Mark all objects as being in the global scope.  */
-  for (i = main_map->l_searchlist.r_nlist; i > 0; )
-    main_map->l_searchlist.r_list[--i]->l_global = 1;
-
-  /* Remove _dl_rtld_map from the chain.  */
-  GL(dl_rtld_map).l_prev->l_next = GL(dl_rtld_map).l_next;
-  if (GL(dl_rtld_map).l_next != NULL)
-    GL(dl_rtld_map).l_next->l_prev = GL(dl_rtld_map).l_prev;
-
-  for (i = 1; i < main_map->l_searchlist.r_nlist; ++i)
-    if (main_map->l_searchlist.r_list[i] == &GL(dl_rtld_map))
-      break;
-
-  bool rtld_multiple_ref = false;
-  if (__glibc_likely (i < main_map->l_searchlist.r_nlist))
-    {
-      /* Some DT_NEEDED entry referred to the interpreter object itself, so
-	 put it back in the list of visible objects.  We insert it into the
-	 chain in symbol search order because gdb uses the chain's order as
-	 its symbol search order.  */
-      rtld_multiple_ref = true;
-
-      GL(dl_rtld_map).l_prev = main_map->l_searchlist.r_list[i - 1];
-      if (__builtin_expect (mode, normal) == normal)
-	{
-	  GL(dl_rtld_map).l_next = (i + 1 < main_map->l_searchlist.r_nlist
-				    ? main_map->l_searchlist.r_list[i + 1]
-				    : NULL);
-#ifdef NEED_DL_SYSINFO_DSO
-	  if (GLRO(dl_sysinfo_map) != NULL
-	      && GL(dl_rtld_map).l_prev->l_next == GLRO(dl_sysinfo_map)
-	      && GL(dl_rtld_map).l_next != GLRO(dl_sysinfo_map))
-	    GL(dl_rtld_map).l_prev = GLRO(dl_sysinfo_map);
-#endif
-	}
-      else
-	/* In trace mode there might be an invisible object (which we
-	   could not find) after the previous one in the search list.
-	   In this case it doesn't matter much where we put the
-	   interpreter object, so we just initialize the list pointer so
-	   that the assertion below holds.  */
-	GL(dl_rtld_map).l_next = GL(dl_rtld_map).l_prev->l_next;
-
-      assert (GL(dl_rtld_map).l_prev->l_next == GL(dl_rtld_map).l_next);
-      GL(dl_rtld_map).l_prev->l_next = &GL(dl_rtld_map);
-      if (GL(dl_rtld_map).l_next != NULL)
-	{
-	  assert (GL(dl_rtld_map).l_next->l_prev == GL(dl_rtld_map).l_prev);
-	  GL(dl_rtld_map).l_next->l_prev = &GL(dl_rtld_map);
-	}
-    }
-
-  /* Now let us see whether all libraries are available in the
-     versions we need.  */
-  {
-    struct version_check_args args;
-    args.doexit = mode == normal;
-    args.dotrace = mode == trace;
-    _dl_receive_error (print_missing_version, version_check_doit, &args);
-  }
-
-  /* We do not initialize any of the TLS functionality unless any of the
-     initial modules uses TLS.  This makes dynamic loading of modules with
-     TLS impossible, but to support it requires either eagerly doing setup
-     now or lazily doing it later.  Doing it now makes us incompatible with
-     an old kernel that can't perform TLS_INIT_TP, even if no TLS is ever
-     used.  Trying to do it lazily is too hairy to try when there could be
-     multiple threads (from a non-TLS-using libpthread).  */
-  bool was_tls_init_tp_called = tls_init_tp_called;
-  if (tcbp == NULL)
-    tcbp = init_tls ();
-
-  if (__glibc_likely (audit_list == NULL))
-    /* Initialize security features.  But only if we have not done it
-       earlier.  */
-    security_init ();
-
-  if (__builtin_expect (mode, normal) != normal)
-    {
-      /* We were run just to list the shared libraries.  It is
-	 important that we do this before real relocation, because the
-	 functions we call below for output may no longer work properly
-	 after relocation.  */
-      struct link_map *l;
-
-      if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)
-	{
-	  struct r_scope_elem *scope = &main_map->l_searchlist;
-
-	  for (i = 0; i < scope->r_nlist; i++)
-	    {
-	      l = scope->r_list [i];
-	      if (l->l_faked)
-		{
-		  _dl_printf ("\t%s => not found\n", l->l_libname->name);
-		  continue;
-		}
-	      if (_dl_name_match_p (GLRO(dl_trace_prelink), l))
-		GLRO(dl_trace_prelink_map) = l;
-	      _dl_printf ("\t%s => %s (0x%0*Zx, 0x%0*Zx)",
-			  DSO_FILENAME (l->l_libname->name),
-			  DSO_FILENAME (l->l_name),
-			  (int) sizeof l->l_map_start * 2,
-			  (size_t) l->l_map_start,
-			  (int) sizeof l->l_addr * 2,
-			  (size_t) l->l_addr);
-
-	      if (l->l_tls_modid)
-		_dl_printf (" TLS(0x%Zx, 0x%0*Zx)\n", l->l_tls_modid,
-			    (int) sizeof l->l_tls_offset * 2,
-			    (size_t) l->l_tls_offset);
-	      else
-		_dl_printf ("\n");
-	    }
-	}
-      else if (GLRO(dl_debug_mask) & DL_DEBUG_UNUSED)
-	{
-	  /* Look through the dependencies of the main executable
-	     and determine which of them is not actually
-	     required.  */
-	  struct link_map *l = main_map;
-
-	  /* Relocate the main executable.  */
-	  struct relocate_args args = { .l = l,
-					.reloc_mode = ((GLRO(dl_lazy)
-						       ? RTLD_LAZY : 0)
-						       | __RTLD_NOIFUNC) };
-	  _dl_receive_error (print_unresolved, relocate_doit, &args);
-
-	  /* This loop depends on the dependencies of the executable to
-	     correspond in number and order to the DT_NEEDED entries.  */
-	  ElfW(Dyn) *dyn = main_map->l_ld;
-	  bool first = true;
-	  while (dyn->d_tag != DT_NULL)
-	    {
-	      if (dyn->d_tag == DT_NEEDED)
-		{
-		  l = l->l_next;
-#ifdef NEED_DL_SYSINFO_DSO
-		  /* Skip the VDSO since it's not part of the list
-		     of objects we brought in via DT_NEEDED entries.  */
-		  if (l == GLRO(dl_sysinfo_map))
-		    l = l->l_next;
-#endif
-		  if (!l->l_used)
-		    {
-		      if (first)
-			{
-			  _dl_printf ("Unused direct dependencies:\n");
-			  first = false;
-			}
-
-		      _dl_printf ("\t%s\n", l->l_name);
-		    }
-		}
-
-	      ++dyn;
-	    }
-
-	  _exit (first != true);
-	}
-      else if (! main_map->l_info[DT_NEEDED])
-	_dl_printf ("\tstatically linked\n");
-      else
-	{
-	  for (l = main_map->l_next; l; l = l->l_next)
-	    if (l->l_faked)
-	      /* The library was not found.  */
-	      _dl_printf ("\t%s => not found\n", l->l_libname->name);
-	    else if (strcmp (l->l_libname->name, l->l_name) == 0)
-	      _dl_printf ("\t%s (0x%0*Zx)\n", l->l_libname->name,
-			  (int) sizeof l->l_map_start * 2,
-			  (size_t) l->l_map_start);
-	    else
-	      _dl_printf ("\t%s => %s (0x%0*Zx)\n", l->l_libname->name,
-			  l->l_name, (int) sizeof l->l_map_start * 2,
-			  (size_t) l->l_map_start);
-	}
-
-      if (__builtin_expect (mode, trace) != trace)
-	for (i = 1; i < (unsigned int) _dl_argc; ++i)
-	  {
-	    const ElfW(Sym) *ref = NULL;
-	    ElfW(Addr) loadbase;
-	    lookup_t result;
-
-	    result = _dl_lookup_symbol_x (_dl_argv[i], main_map,
-					  &ref, main_map->l_scope,
-					  NULL, ELF_RTYPE_CLASS_PLT,
-					  DL_LOOKUP_ADD_DEPENDENCY, NULL);
-
-	    loadbase = LOOKUP_VALUE_ADDRESS (result);
-
-	    _dl_printf ("%s found at 0x%0*Zd in object at 0x%0*Zd\n",
-			_dl_argv[i],
-			(int) sizeof ref->st_value * 2,
-			(size_t) ref->st_value,
-			(int) sizeof loadbase * 2, (size_t) loadbase);
-	  }
-      else
-	{
-	  /* If LD_WARN is set, warn about undefined symbols.  */
-	  if (GLRO(dl_lazy) >= 0 && GLRO(dl_verbose))
-	    {
-	      /* We have to do symbol dependency testing.  */
-	      struct relocate_args args;
-	      unsigned int i;
-
-	      args.reloc_mode = ((GLRO(dl_lazy) ? RTLD_LAZY : 0)
-				 | __RTLD_NOIFUNC);
-
-	      i = main_map->l_searchlist.r_nlist;
-	      while (i-- > 0)
-		{
-		  struct link_map *l = main_map->l_initfini[i];
-		  if (l != &GL(dl_rtld_map) && ! l->l_faked)
-		    {
-		      args.l = l;
-		      _dl_receive_error (print_unresolved, relocate_doit,
-					 &args);
-		    }
-		}
-
-	      if ((GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)
-		  && rtld_multiple_ref)
-		{
-		  /* Mark the link map as not yet relocated again.  */
-		  GL(dl_rtld_map).l_relocated = 0;
-		  _dl_relocate_object (&GL(dl_rtld_map),
-				       main_map->l_scope, __RTLD_NOIFUNC, 0);
-		}
-	    }
-#define VERNEEDTAG (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (DT_VERNEED))
-	  if (version_info)
-	    {
-	      /* Print more information.  This means here, print information
-		 about the versions needed.  */
-	      int first = 1;
-	      struct link_map *map;
-
-	      for (map = main_map; map != NULL; map = map->l_next)
-		{
-		  const char *strtab;
-		  ElfW(Dyn) *dyn = map->l_info[VERNEEDTAG];
-		  ElfW(Verneed) *ent;
-
-		  if (dyn == NULL)
-		    continue;
-
-		  strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
-		  ent = (ElfW(Verneed) *) (map->l_addr + dyn->d_un.d_ptr);
-
-		  if (first)
-		    {
-		      _dl_printf ("\n\tVersion information:\n");
-		      first = 0;
-		    }
-
-		  _dl_printf ("\t%s:\n", DSO_FILENAME (map->l_name));
-
-		  while (1)
-		    {
-		      ElfW(Vernaux) *aux;
-		      struct link_map *needed;
-
-		      needed = find_needed (strtab + ent->vn_file);
-		      aux = (ElfW(Vernaux) *) ((char *) ent + ent->vn_aux);
-
-		      while (1)
-			{
-			  const char *fname = NULL;
-
-			  if (needed != NULL
-			      && match_version (strtab + aux->vna_name,
-						needed))
-			    fname = needed->l_name;
-
-			  _dl_printf ("\t\t%s (%s) %s=> %s\n",
-				      strtab + ent->vn_file,
-				      strtab + aux->vna_name,
-				      aux->vna_flags & VER_FLG_WEAK
-				      ? "[WEAK] " : "",
-				      fname ?: "not found");
-
-			  if (aux->vna_next == 0)
-			    /* No more symbols.  */
-			    break;
-
-			  /* Next symbol.  */
-			  aux = (ElfW(Vernaux) *) ((char *) aux
-						   + aux->vna_next);
-			}
-
-		      if (ent->vn_next == 0)
-			/* No more dependencies.  */
-			break;
-
-		      /* Next dependency.  */
-		      ent = (ElfW(Verneed) *) ((char *) ent + ent->vn_next);
-		    }
-		}
-	    }
-	}
-
-      _exit (0);
-    }
-
-  if (main_map->l_info[ADDRIDX (DT_GNU_LIBLIST)]
-      && ! __builtin_expect (GLRO(dl_profile) != NULL, 0)
-      && ! __builtin_expect (GLRO(dl_dynamic_weak), 0))
-    {
-      ElfW(Lib) *liblist, *liblistend;
-      struct link_map **r_list, **r_listend, *l;
-      const char *strtab = (const void *) D_PTR (main_map, l_info[DT_STRTAB]);
-
-      assert (main_map->l_info[VALIDX (DT_GNU_LIBLISTSZ)] != NULL);
-      liblist = (ElfW(Lib) *)
-		main_map->l_info[ADDRIDX (DT_GNU_LIBLIST)]->d_un.d_ptr;
-      liblistend = (ElfW(Lib) *)
-		   ((char *) liblist +
-		    main_map->l_info[VALIDX (DT_GNU_LIBLISTSZ)]->d_un.d_val);
-      r_list = main_map->l_searchlist.r_list;
-      r_listend = r_list + main_map->l_searchlist.r_nlist;
-
-      for (; r_list < r_listend && liblist < liblistend; r_list++)
-	{
-	  l = *r_list;
-
-	  if (l == main_map)
-	    continue;
-
-	  /* If the library is not mapped where it should, fail.  */
-	  if (l->l_addr)
-	    break;
-
-	  /* Next, check if checksum matches.  */
-	  if (l->l_info [VALIDX(DT_CHECKSUM)] == NULL
-	      || l->l_info [VALIDX(DT_CHECKSUM)]->d_un.d_val
-		 != liblist->l_checksum)
-	    break;
-
-	  if (l->l_info [VALIDX(DT_GNU_PRELINKED)] == NULL
-	      || l->l_info [VALIDX(DT_GNU_PRELINKED)]->d_un.d_val
-		 != liblist->l_time_stamp)
-	    break;
-
-	  if (! _dl_name_match_p (strtab + liblist->l_name, l))
-	    break;
-
-	  ++liblist;
-	}
-
-
-      if (r_list == r_listend && liblist == liblistend)
-	prelinked = true;
-
-      if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_LIBS))
-	_dl_debug_printf ("\nprelink checking: %s\n",
-			  prelinked ? "ok" : "failed");
-    }
-
-
-  /* Now set up the variable which helps the assembler startup code.  */
-  GL(dl_ns)[LM_ID_BASE]._ns_main_searchlist = &main_map->l_searchlist;
-
-  /* Save the information about the original global scope list since
-     we need it in the memory handling later.  */
-  GLRO(dl_initial_searchlist) = *GL(dl_ns)[LM_ID_BASE]._ns_main_searchlist;
-
-  /* Remember the last search directory added at startup, now that
-     malloc will no longer be the one from dl-minimal.c.  */
-  GLRO(dl_init_all_dirs) = GL(dl_all_dirs);
-
-  /* Print scope information.  */
-  if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES))
-    {
-      _dl_debug_printf ("\nInitial object scopes\n");
-
-      for (struct link_map *l = main_map; l != NULL; l = l->l_next)
-	_dl_show_scope (l, 0);
-    }
-
-  if (prelinked)
-    {
-      if (main_map->l_info [ADDRIDX (DT_GNU_CONFLICT)] != NULL)
-	{
-	  ElfW(Rela) *conflict, *conflictend;
-#ifndef HP_TIMING_NONAVAIL
-	  hp_timing_t start;
-	  hp_timing_t stop;
-#endif
-
-	  HP_TIMING_NOW (start);
-	  assert (main_map->l_info [VALIDX (DT_GNU_CONFLICTSZ)] != NULL);
-	  conflict = (ElfW(Rela) *)
-	    main_map->l_info [ADDRIDX (DT_GNU_CONFLICT)]->d_un.d_ptr;
-	  conflictend = (ElfW(Rela) *)
-	    ((char *) conflict
-	     + main_map->l_info [VALIDX (DT_GNU_CONFLICTSZ)]->d_un.d_val);
-	  _dl_resolve_conflicts (main_map, conflict, conflictend);
-	  HP_TIMING_NOW (stop);
-	  HP_TIMING_DIFF (relocate_time, start, stop);
-	}
-
-
-      /* Mark all the objects so we know they have been already relocated.  */
-      for (struct link_map *l = main_map; l != NULL; l = l->l_next)
-	{
-	  l->l_relocated = 1;
-	  if (l->l_relro_size)
-	    _dl_protect_relro (l);
-
-	  /* Add object to slot information data if necessasy.  */
-	  if (l->l_tls_blocksize != 0 && tls_init_tp_called)
-	    _dl_add_to_slotinfo (l);
-	}
-    }
-  else
-    {
-      /* Now we have all the objects loaded.  Relocate them all except for
-	 the dynamic linker itself.  We do this in reverse order so that copy
-	 relocs of earlier objects overwrite the data written by later
-	 objects.  We do not re-relocate the dynamic linker itself in this
-	 loop because that could result in the GOT entries for functions we
-	 call being changed, and that would break us.  It is safe to relocate
-	 the dynamic linker out of order because it has no copy relocs (we
-	 know that because it is self-contained).  */
-
-      int consider_profiling = GLRO(dl_profile) != NULL;
-#ifndef HP_TIMING_NONAVAIL
-      hp_timing_t start;
-      hp_timing_t stop;
-#endif
-
-      /* If we are profiling we also must do lazy reloaction.  */
-      GLRO(dl_lazy) |= consider_profiling;
-
-      HP_TIMING_NOW (start);
-      unsigned i = main_map->l_searchlist.r_nlist;
-      while (i-- > 0)
-	{
-	  struct link_map *l = main_map->l_initfini[i];
-
-	  /* While we are at it, help the memory handling a bit.  We have to
-	     mark some data structures as allocated with the fake malloc()
-	     implementation in ld.so.  */
-	  struct libname_list *lnp = l->l_libname->next;
-
-	  while (__builtin_expect (lnp != NULL, 0))
-	    {
-	      lnp->dont_free = 1;
-	      lnp = lnp->next;
-	    }
-	  /* Also allocated with the fake malloc().  */
-	  l->l_free_initfini = 0;
-
-	  if (l != &GL(dl_rtld_map))
-	    _dl_relocate_object (l, l->l_scope, GLRO(dl_lazy) ? RTLD_LAZY : 0,
-				 consider_profiling);
-
-	  /* Add object to slot information data if necessasy.  */
-	  if (l->l_tls_blocksize != 0 && tls_init_tp_called)
-	    _dl_add_to_slotinfo (l);
-	}
-      HP_TIMING_NOW (stop);
-
-      HP_TIMING_DIFF (relocate_time, start, stop);
-
-      /* Now enable profiling if needed.  Like the previous call,
-	 this has to go here because the calls it makes should use the
-	 rtld versions of the functions (particularly calloc()), but it
-	 needs to have _dl_profile_map set up by the relocator.  */
-      if (__glibc_unlikely (GL(dl_profile_map) != NULL))
-	/* We must prepare the profiling.  */
-	_dl_start_profile ();
-    }
-
-  if ((!was_tls_init_tp_called && GL(dl_tls_max_dtv_idx) > 0)
-      || count_modids != _dl_count_modids ())
-    ++GL(dl_tls_generation);
-
-  /* Now that we have completed relocation, the initializer data
-     for the TLS blocks has its final values and we can copy them
-     into the main thread's TLS area, which we allocated above.  */
-  _dl_allocate_tls_init (tcbp);
-
-  /* And finally install it for the main thread.  */
-  if (! tls_init_tp_called)
-    {
-      const char *lossage = TLS_INIT_TP (tcbp);
-      if (__glibc_unlikely (lossage != NULL))
-	_dl_fatal_printf ("cannot set up thread-local storage: %s\n",
-			  lossage);
-    }
-
-  /* Make sure no new search directories have been added.  */
-  assert (GLRO(dl_init_all_dirs) == GL(dl_all_dirs));
-
-  if (! prelinked && rtld_multiple_ref)
-    {
-      /* There was an explicit ref to the dynamic linker as a shared lib.
-	 Re-relocate ourselves with user-controlled symbol definitions.
-
-	 We must do this after TLS initialization in case after this
-	 re-relocation, we might call a user-supplied function
-	 (e.g. calloc from _dl_relocate_object) that uses TLS data.  */
-
-#ifndef HP_TIMING_NONAVAIL
-      hp_timing_t start;
-      hp_timing_t stop;
-      hp_timing_t add;
-#endif
-
-      HP_TIMING_NOW (start);
-      /* Mark the link map as not yet relocated again.  */
-      GL(dl_rtld_map).l_relocated = 0;
-      _dl_relocate_object (&GL(dl_rtld_map), main_map->l_scope, 0, 0);
-      HP_TIMING_NOW (stop);
-      HP_TIMING_DIFF (add, start, stop);
-      HP_TIMING_ACCUM_NT (relocate_time, add);
-    }
-
-  /* Do any necessary cleanups for the startup OS interface code.
-     We do these now so that no calls are made after rtld re-relocation
-     which might be resolved to different functions than we expect.
-     We cannot do this before relocating the other objects because
-     _dl_relocate_object might need to call `mprotect' for DT_TEXTREL.  */
-  _dl_sysdep_start_cleanup ();
-
-#ifdef SHARED
-  /* Auditing checkpoint: we have added all objects.  */
-  if (__glibc_unlikely (GLRO(dl_naudit) > 0))
-    {
-      struct link_map *head = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
-      /* Do not call the functions for any auditing object.  */
-      if (head->l_auditing == 0)
-	{
-	  struct audit_ifaces *afct = GLRO(dl_audit);
-	  for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
-	    {
-	      if (afct->activity != NULL)
-		afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT);
-
-	      afct = afct->next;
-	    }
-	}
-    }
-#endif
-
-  /* Notify the debugger all new objects are now ready to go.  We must re-get
-     the address since by now the variable might be in another object.  */
-  r = _dl_debug_initialize (0, LM_ID_BASE);
-  r->r_state = RT_CONSISTENT;
-  _dl_debug_state ();
-  LIBC_PROBE (init_complete, 2, LM_ID_BASE, r);
-
-#if defined USE_LDCONFIG && !defined MAP_COPY
-  /* We must munmap() the cache file.  */
-  _dl_unload_cache ();
-#endif
-
-  /* Once we return, _dl_sysdep_start will invoke
-     the DT_INIT functions and then *USER_ENTRY.  */
-}
-
-/* This is a little helper function for resolving symbols while
-   tracing the binary.  */
-static void
-print_unresolved (int errcode __attribute__ ((unused)), const char *objname,
-		  const char *errstring)
-{
-  if (objname[0] == '\0')
-    objname = RTLD_PROGNAME;
-  _dl_error_printf ("%s	(%s)\n", errstring, objname);
-}
-
-/* This is a little helper function for resolving symbols while
-   tracing the binary.  */
-static void
-print_missing_version (int errcode __attribute__ ((unused)),
-		       const char *objname, const char *errstring)
-{
-  _dl_error_printf ("%s: %s: %s\n", RTLD_PROGNAME,
-		    objname, errstring);
-}
-
-/* Nonzero if any of the debugging options is enabled.  */
-static int any_debug attribute_relro;
-
-/* Process the string given as the parameter which explains which debugging
-   options are enabled.  */
-static void
-process_dl_debug (const char *dl_debug)
-{
-  /* When adding new entries make sure that the maximal length of a name
-     is correctly handled in the LD_DEBUG_HELP code below.  */
-  static const struct
-  {
-    unsigned char len;
-    const char name[10];
-    const char helptext[41];
-    unsigned short int mask;
-  } debopts[] =
-    {
-#define LEN_AND_STR(str) sizeof (str) - 1, str
-      { LEN_AND_STR ("libs"), "display library search paths",
-	DL_DEBUG_LIBS | DL_DEBUG_IMPCALLS },
-      { LEN_AND_STR ("reloc"), "display relocation processing",
-	DL_DEBUG_RELOC | DL_DEBUG_IMPCALLS },
-      { LEN_AND_STR ("files"), "display progress for input file",
-	DL_DEBUG_FILES | DL_DEBUG_IMPCALLS },
-      { LEN_AND_STR ("symbols"), "display symbol table processing",
-	DL_DEBUG_SYMBOLS | DL_DEBUG_IMPCALLS },
-      { LEN_AND_STR ("bindings"), "display information about symbol binding",
-	DL_DEBUG_BINDINGS | DL_DEBUG_IMPCALLS },
-      { LEN_AND_STR ("versions"), "display version dependencies",
-	DL_DEBUG_VERSIONS | DL_DEBUG_IMPCALLS },
-      { LEN_AND_STR ("scopes"), "display scope information",
-	DL_DEBUG_SCOPES },
-      { LEN_AND_STR ("all"), "all previous options combined",
-	DL_DEBUG_LIBS | DL_DEBUG_RELOC | DL_DEBUG_FILES | DL_DEBUG_SYMBOLS
-	| DL_DEBUG_BINDINGS | DL_DEBUG_VERSIONS | DL_DEBUG_IMPCALLS
-	| DL_DEBUG_SCOPES },
-      { LEN_AND_STR ("statistics"), "display relocation statistics",
-	DL_DEBUG_STATISTICS },
-      { LEN_AND_STR ("unused"), "determined unused DSOs",
-	DL_DEBUG_UNUSED },
-      { LEN_AND_STR ("help"), "display this help message and exit",
-	DL_DEBUG_HELP },
-    };
-#define ndebopts (sizeof (debopts) / sizeof (debopts[0]))
-
-  /* Skip separating white spaces and commas.  */
-  while (*dl_debug != '\0')
-    {
-      if (*dl_debug != ' ' && *dl_debug != ',' && *dl_debug != ':')
-	{
-	  size_t cnt;
-	  size_t len = 1;
-
-	  while (dl_debug[len] != '\0' && dl_debug[len] != ' '
-		 && dl_debug[len] != ',' && dl_debug[len] != ':')
-	    ++len;
-
-	  for (cnt = 0; cnt < ndebopts; ++cnt)
-	    if (debopts[cnt].len == len
-		&& memcmp (dl_debug, debopts[cnt].name, len) == 0)
-	      {
-		GLRO(dl_debug_mask) |= debopts[cnt].mask;
-		any_debug = 1;
-		break;
-	      }
-
-	  if (cnt == ndebopts)
-	    {
-	      /* Display a warning and skip everything until next
-		 separator.  */
-	      char *copy = strndupa (dl_debug, len);
-	      _dl_error_printf ("\
-warning: debug option `%s' unknown; try LD_DEBUG=help\n", copy);
-	    }
-
-	  dl_debug += len;
-	  continue;
-	}
-
-      ++dl_debug;
-    }
-
-  if (GLRO(dl_debug_mask) & DL_DEBUG_UNUSED)
-    {
-      /* In order to get an accurate picture of whether a particular
-	 DT_NEEDED entry is actually used we have to process both
-	 the PLT and non-PLT relocation entries.  */
-      GLRO(dl_lazy) = 0;
-    }
-
-  if (GLRO(dl_debug_mask) & DL_DEBUG_HELP)
-    {
-      size_t cnt;
-
-      _dl_printf ("\
-Valid options for the LD_DEBUG environment variable are:\n\n");
-
-      for (cnt = 0; cnt < ndebopts; ++cnt)
-	_dl_printf ("  %.*s%s%s\n", debopts[cnt].len, debopts[cnt].name,
-		    "         " + debopts[cnt].len - 3,
-		    debopts[cnt].helptext);
-
-      _dl_printf ("\n\
-To direct the debugging output into a file instead of standard output\n\
-a filename can be specified using the LD_DEBUG_OUTPUT environment variable.\n");
-      _exit (0);
-    }
-}
-
-static void
-process_dl_audit (char *str)
-{
-  /* The parameter is a colon separated list of DSO names.  */
-  char *p;
-
-  while ((p = (strsep) (&str, ":")) != NULL)
-    if (p[0] != '\0'
-	&& (__builtin_expect (! __libc_enable_secure, 1)
-	    || strchr (p, '/') == NULL))
-      {
-	/* This is using the local malloc, not the system malloc.  The
-	   memory can never be freed.  */
-	struct audit_list *newp = malloc (sizeof (*newp));
-	newp->name = p;
-
-	if (audit_list == NULL)
-	  audit_list = newp->next = newp;
-	else
-	  {
-	    newp->next = audit_list->next;
-	    audit_list = audit_list->next = newp;
-	  }
-      }
-}
-
-/* Process all environments variables the dynamic linker must recognize.
-   Since all of them start with `LD_' we are a bit smarter while finding
-   all the entries.  */
-extern char **_environ attribute_hidden;
-
-
-static void
-process_envvars (enum mode *modep)
-{
-  char **runp = _environ;
-  char *envline;
-  enum mode mode = normal;
-  char *debug_output = NULL;
-
-  /* This is the default place for profiling data file.  */
-  GLRO(dl_profile_output)
-    = &"/var/tmp\0/var/profile"[__libc_enable_secure ? 9 : 0];
-
-  while ((envline = _dl_next_ld_env_entry (&runp)) != NULL)
-    {
-      size_t len = 0;
-
-      while (envline[len] != '\0' && envline[len] != '=')
-	++len;
-
-      if (envline[len] != '=')
-	/* This is a "LD_" variable at the end of the string without
-	   a '=' character.  Ignore it since otherwise we will access
-	   invalid memory below.  */
-	continue;
-
-      switch (len)
-	{
-	case 4:
-	  /* Warning level, verbose or not.  */
-	  if (memcmp (envline, "WARN", 4) == 0)
-	    GLRO(dl_verbose) = envline[5] != '\0';
-	  break;
-
-	case 5:
-	  /* Debugging of the dynamic linker?  */
-	  if (memcmp (envline, "DEBUG", 5) == 0)
-	    {
-	      process_dl_debug (&envline[6]);
-	      break;
-	    }
-	  if (memcmp (envline, "AUDIT", 5) == 0)
-	    process_dl_audit (&envline[6]);
-	  break;
-
-	case 7:
-	  /* Print information about versions.  */
-	  if (memcmp (envline, "VERBOSE", 7) == 0)
-	    {
-	      version_info = envline[8] != '\0';
-	      break;
-	    }
-
-	  /* List of objects to be preloaded.  */
-	  if (memcmp (envline, "PRELOAD", 7) == 0)
-	    {
-	      preloadlist = &envline[8];
-	      break;
-	    }
-
-	  /* Which shared object shall be profiled.  */
-	  if (memcmp (envline, "PROFILE", 7) == 0 && envline[8] != '\0')
-	    GLRO(dl_profile) = &envline[8];
-	  break;
-
-	case 8:
-	  /* Do we bind early?  */
-	  if (memcmp (envline, "BIND_NOW", 8) == 0)
-	    {
-	      GLRO(dl_lazy) = envline[9] == '\0';
-	      break;
-	    }
-	  if (memcmp (envline, "BIND_NOT", 8) == 0)
-	    GLRO(dl_bind_not) = envline[9] != '\0';
-	  break;
-
-	case 9:
-	  /* Test whether we want to see the content of the auxiliary
-	     array passed up from the kernel.  */
-	  if (!__libc_enable_secure
-	      && memcmp (envline, "SHOW_AUXV", 9) == 0)
-	    _dl_show_auxv ();
-	  break;
-
-#if !HAVE_TUNABLES
-	case 10:
-	  /* Mask for the important hardware capabilities.  */
-	  if (!__libc_enable_secure
-	      && memcmp (envline, "HWCAP_MASK", 10) == 0)
-	    GLRO(dl_hwcap_mask) = __strtoul_internal (&envline[11], NULL,
-						      0, 0);
-	  break;
-#endif
-
-	case 11:
-	  /* Path where the binary is found.  */
-	  if (!__libc_enable_secure
-	      && memcmp (envline, "ORIGIN_PATH", 11) == 0)
-	    GLRO(dl_origin_path) = &envline[12];
-	  break;
-
-	case 12:
-	  /* The library search path.  */
-	  if (memcmp (envline, "LIBRARY_PATH", 12) == 0)
-	    {
-	      library_path = &envline[13];
-	      break;
-	    }
-
-	  /* Where to place the profiling data file.  */
-	  if (memcmp (envline, "DEBUG_OUTPUT", 12) == 0)
-	    {
-	      debug_output = &envline[13];
-	      break;
-	    }
-
-	  if (!__libc_enable_secure
-	      && memcmp (envline, "DYNAMIC_WEAK", 12) == 0)
-	    GLRO(dl_dynamic_weak) = 1;
-	  break;
-
-	case 13:
-	  /* We might have some extra environment variable with length 13
-	     to handle.  */
-#ifdef EXTRA_LD_ENVVARS_13
-	  EXTRA_LD_ENVVARS_13
-#endif
-	  if (!__libc_enable_secure
-	      && memcmp (envline, "USE_LOAD_BIAS", 13) == 0)
-	    {
-	      GLRO(dl_use_load_bias) = envline[14] == '1' ? -1 : 0;
-	      break;
-	    }
-	  break;
-
-	case 14:
-	  /* Where to place the profiling data file.  */
-	  if (!__libc_enable_secure
-	      && memcmp (envline, "PROFILE_OUTPUT", 14) == 0
-	      && envline[15] != '\0')
-	    GLRO(dl_profile_output) = &envline[15];
-	  break;
-
-	case 16:
-	  /* The mode of the dynamic linker can be set.  */
-	  if (memcmp (envline, "TRACE_PRELINKING", 16) == 0)
-	    {
-	      mode = trace;
-	      GLRO(dl_verbose) = 1;
-	      GLRO(dl_debug_mask) |= DL_DEBUG_PRELINK;
-	      GLRO(dl_trace_prelink) = &envline[17];
-	    }
-	  break;
-
-	case 20:
-	  /* The mode of the dynamic linker can be set.  */
-	  if (memcmp (envline, "TRACE_LOADED_OBJECTS", 20) == 0)
-	    mode = trace;
-	  break;
-
-	  /* We might have some extra environment variable to handle.  This
-	     is tricky due to the pre-processing of the length of the name
-	     in the switch statement here.  The code here assumes that added
-	     environment variables have a different length.  */
-#ifdef EXTRA_LD_ENVVARS
-	  EXTRA_LD_ENVVARS
-#endif
-	}
-    }
-
-  /* The caller wants this information.  */
-  *modep = mode;
-
-  /* Extra security for SUID binaries.  Remove all dangerous environment
-     variables.  */
-  if (__builtin_expect (__libc_enable_secure, 0))
-    {
-      static const char unsecure_envvars[] =
-#ifdef EXTRA_UNSECURE_ENVVARS
-	EXTRA_UNSECURE_ENVVARS
-#endif
-	UNSECURE_ENVVARS;
-      const char *nextp;
-
-      nextp = unsecure_envvars;
-      do
-	{
-	  unsetenv (nextp);
-	  /* We could use rawmemchr but this need not be fast.  */
-	  nextp = (char *) (strchr) (nextp, '\0') + 1;
-	}
-      while (*nextp != '\0');
-
-      if (__access ("/etc/suid-debug", F_OK) != 0)
-	{
-#if !HAVE_TUNABLES
-	  unsetenv ("MALLOC_CHECK_");
-#endif
-	  GLRO(dl_debug_mask) = 0;
-	}
-
-      if (mode != normal)
-	_exit (5);
-    }
-  /* If we have to run the dynamic linker in debugging mode and the
-     LD_DEBUG_OUTPUT environment variable is given, we write the debug
-     messages to this file.  */
-  else if (any_debug && debug_output != NULL)
-    {
-      const int flags = O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW;
-      size_t name_len = strlen (debug_output);
-      char buf[name_len + 12];
-      char *startp;
-
-      buf[name_len + 11] = '\0';
-      startp = _itoa (__getpid (), &buf[name_len + 11], 10, 0);
-      *--startp = '.';
-      startp = memcpy (startp - name_len, debug_output, name_len);
-
-      GLRO(dl_debug_fd) = __open (startp, flags, DEFFILEMODE);
-      if (GLRO(dl_debug_fd) == -1)
-	/* We use standard output if opening the file failed.  */
-	GLRO(dl_debug_fd) = STDOUT_FILENO;
-    }
-}
-
-
-/* Print the various times we collected.  */
-static void
-__attribute ((noinline))
-print_statistics (hp_timing_t *rtld_total_timep)
-{
-#ifndef HP_TIMING_NONAVAIL
-  char buf[200];
-  char *cp;
-  char *wp;
-
-  /* Total time rtld used.  */
-  if (HP_SMALL_TIMING_AVAIL)
-    {
-      HP_TIMING_PRINT (buf, sizeof (buf), *rtld_total_timep);
-      _dl_debug_printf ("\nruntime linker statistics:\n"
-			"  total startup time in dynamic loader: %s\n", buf);
-
-      /* Print relocation statistics.  */
-      char pbuf[30];
-      HP_TIMING_PRINT (buf, sizeof (buf), relocate_time);
-      cp = _itoa ((1000ULL * relocate_time) / *rtld_total_timep,
-		  pbuf + sizeof (pbuf), 10, 0);
-      wp = pbuf;
-      switch (pbuf + sizeof (pbuf) - cp)
-	{
-	case 3:
-	  *wp++ = *cp++;
-	case 2:
-	  *wp++ = *cp++;
-	case 1:
-	  *wp++ = '.';
-	  *wp++ = *cp++;
-	}
-      *wp = '\0';
-      _dl_debug_printf ("\
-	    time needed for relocation: %s (%s%%)\n", buf, pbuf);
-    }
-#endif
-
-  unsigned long int num_relative_relocations = 0;
-  for (Lmid_t ns = 0; ns < GL(dl_nns); ++ns)
-    {
-      if (GL(dl_ns)[ns]._ns_loaded == NULL)
-	continue;
-
-      struct r_scope_elem *scope = &GL(dl_ns)[ns]._ns_loaded->l_searchlist;
-
-      for (unsigned int i = 0; i < scope->r_nlist; i++)
-	{
-	  struct link_map *l = scope->r_list [i];
-
-	  if (l->l_addr != 0 && l->l_info[VERSYMIDX (DT_RELCOUNT)])
-	    num_relative_relocations
-	      += l->l_info[VERSYMIDX (DT_RELCOUNT)]->d_un.d_val;
-#ifndef ELF_MACHINE_REL_RELATIVE
-	  /* Relative relocations are processed on these architectures if
-	     library is loaded to different address than p_vaddr or
-	     if not prelinked.  */
-	  if ((l->l_addr != 0 || !l->l_info[VALIDX(DT_GNU_PRELINKED)])
-	      && l->l_info[VERSYMIDX (DT_RELACOUNT)])
-#else
-	  /* On e.g. IA-64 or Alpha, relative relocations are processed
-	     only if library is loaded to different address than p_vaddr.  */
-	  if (l->l_addr != 0 && l->l_info[VERSYMIDX (DT_RELACOUNT)])
-#endif
-	    num_relative_relocations
-	      += l->l_info[VERSYMIDX (DT_RELACOUNT)]->d_un.d_val;
-	}
-    }
-
-  _dl_debug_printf ("                 number of relocations: %lu\n"
-		    "      number of relocations from cache: %lu\n"
-		    "        number of relative relocations: %lu\n",
-		    GL(dl_num_relocations),
-		    GL(dl_num_cache_relocations),
-		    num_relative_relocations);
-
-#ifndef HP_TIMING_NONAVAIL
-  /* Time spend while loading the object and the dependencies.  */
-  if (HP_SMALL_TIMING_AVAIL)
-    {
-      char pbuf[30];
-      HP_TIMING_PRINT (buf, sizeof (buf), load_time);
-      cp = _itoa ((1000ULL * load_time) / *rtld_total_timep,
-		  pbuf + sizeof (pbuf), 10, 0);
-      wp = pbuf;
-      switch (pbuf + sizeof (pbuf) - cp)
-	{
-	case 3:
-	  *wp++ = *cp++;
-	case 2:
-	  *wp++ = *cp++;
-	case 1:
-	  *wp++ = '.';
-	  *wp++ = *cp++;
-	}
-      *wp = '\0';
-      _dl_debug_printf ("\
-	   time needed to load objects: %s (%s%%)\n",
-				buf, pbuf);
-    }
-#endif
-}
diff --git a/elf/setup-vdso.h b/elf/setup-vdso.h
deleted file mode 100644
index 2db597eba3..0000000000
--- a/elf/setup-vdso.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/* Set up the data structures for the system-supplied DSO.
-   Copyright (C) 2012-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-static inline void __attribute__ ((always_inline))
-setup_vdso (struct link_map *main_map __attribute__ ((unused)),
-	    struct link_map ***first_preload __attribute__ ((unused)))
-{
-#ifdef NEED_DL_SYSINFO_DSO
-  if (GLRO(dl_sysinfo_dso) == NULL)
-    return;
-
-  /* Do an abridged version of the work _dl_map_object_from_fd would do
-     to map in the object.  It's already mapped and prelinked (and
-     better be, since it's read-only and so we couldn't relocate it).
-     We just want our data structures to describe it as if we had just
-     mapped and relocated it normally.  */
-  struct link_map *l = _dl_new_object ((char *) "", "", lt_library, NULL,
-				       0, LM_ID_BASE);
-  if (__glibc_likely (l != NULL))
-    {
-      static ElfW(Dyn) dyn_temp[DL_RO_DYN_TEMP_CNT] attribute_relro;
-
-      l->l_phdr = ((const void *) GLRO(dl_sysinfo_dso)
-		   + GLRO(dl_sysinfo_dso)->e_phoff);
-      l->l_phnum = GLRO(dl_sysinfo_dso)->e_phnum;
-      for (uint_fast16_t i = 0; i < l->l_phnum; ++i)
-	{
-	  const ElfW(Phdr) *const ph = &l->l_phdr[i];
-	  if (ph->p_type == PT_DYNAMIC)
-	    {
-	      l->l_ld = (void *) ph->p_vaddr;
-	      l->l_ldnum = ph->p_memsz / sizeof (ElfW(Dyn));
-	    }
-	  else if (ph->p_type == PT_LOAD)
-	    {
-	      if (! l->l_addr)
-		l->l_addr = ph->p_vaddr;
-	      if (ph->p_vaddr + ph->p_memsz >= l->l_map_end)
-		l->l_map_end = ph->p_vaddr + ph->p_memsz;
-	      if ((ph->p_flags & PF_X)
-		  && ph->p_vaddr + ph->p_memsz >= l->l_text_end)
-		l->l_text_end = ph->p_vaddr + ph->p_memsz;
-	    }
-	  else
-	    /* There must be no TLS segment.  */
-	    assert (ph->p_type != PT_TLS);
-	}
-      l->l_map_start = (ElfW(Addr)) GLRO(dl_sysinfo_dso);
-      l->l_addr = l->l_map_start - l->l_addr;
-      l->l_map_end += l->l_addr;
-      l->l_text_end += l->l_addr;
-      l->l_ld = (void *) ((ElfW(Addr)) l->l_ld + l->l_addr);
-      elf_get_dynamic_info (l, dyn_temp);
-      _dl_setup_hash (l);
-      l->l_relocated = 1;
-
-      /* The vDSO is always used.  */
-      l->l_used = 1;
-
-      /* Initialize l_local_scope to contain just this map.  This allows
-	 the use of dl_lookup_symbol_x to resolve symbols within the vdso.
-	 So we create a single entry list pointing to l_real as its only
-	 element */
-      l->l_local_scope[0]->r_nlist = 1;
-      l->l_local_scope[0]->r_list = &l->l_real;
-
-      /* Now that we have the info handy, use the DSO image's soname
-	 so this object can be looked up by name.  Note that we do not
-	 set l_name here.  That field gives the file name of the DSO,
-	 and this DSO is not associated with any file.  */
-      if (l->l_info[DT_SONAME] != NULL)
-	{
-	  /* Work around a kernel problem.  The kernel cannot handle
-	     addresses in the vsyscall DSO pages in writev() calls.  */
-	  const char *dsoname = ((char *) D_PTR (l, l_info[DT_STRTAB])
-				 + l->l_info[DT_SONAME]->d_un.d_val);
-	  size_t len = strlen (dsoname) + 1;
-	  char *copy = malloc (len);
-	  if (copy == NULL)
-	    _dl_fatal_printf ("out of memory\n");
-	  l->l_libname->name = l->l_name = memcpy (copy, dsoname, len);
-	}
-
-      /* Add the vDSO to the object list.  */
-      _dl_add_to_namespace_list (l, LM_ID_BASE);
-
-# if IS_IN (rtld)
-      /* Rearrange the list so this DSO appears after rtld_map.  */
-      assert (l->l_next == NULL);
-      assert (l->l_prev == main_map);
-      GL(dl_rtld_map).l_next = l;
-      l->l_prev = &GL(dl_rtld_map);
-      *first_preload = &l->l_next;
-# else
-      GL(dl_nns) = 1;
-# endif
-
-      /* We have a prelinked DSO preloaded by the system.  */
-      GLRO(dl_sysinfo_map) = l;
-# ifdef NEED_DL_SYSINFO
-      if (GLRO(dl_sysinfo) == DL_SYSINFO_DEFAULT)
-	GLRO(dl_sysinfo) = GLRO(dl_sysinfo_dso)->e_entry + l->l_addr;
-# endif
-    }
-#endif
-}
diff --git a/elf/sln.c b/elf/sln.c
deleted file mode 100644
index af2d0de164..0000000000
--- a/elf/sln.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/* `sln' program to create symbolic links between files.
-   Copyright (C) 1998-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <error.h>
-#include <errno.h>
-#include <libintl.h>
-#include <locale.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <errno.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <limits.h>
-
-#include "../version.h"
-
-#define PACKAGE _libc_intl_domainname
-
-static int makesymlink (const char *src, const char *dest);
-static int makesymlinks (const char *file);
-static void usage (void);
-
-int
-main (int argc, char **argv)
-{
-  /* Set locale via LC_ALL.  */
-  setlocale (LC_ALL, "");
-
-  /* Set the text message domain.  */
-  textdomain (PACKAGE);
-
-  switch (argc)
-    {
-    case 2:
-      if (strcmp (argv[1], "--version") == 0) {
-	printf ("sln %s%s\n", PKGVERSION, VERSION);
-	return 0;
-      } else if (strcmp (argv[1], "--help") == 0) {
-	usage ();
-	return 0;
-      }
-      return makesymlinks (argv [1]);
-      break;
-
-    case 3:
-      return makesymlink (argv [1], argv [2]);
-      break;
-
-    default:
-      usage ();
-      return 1;
-      break;
-    }
-}
-
-static void
-usage (void)
-{
-  printf (_("Usage: sln src dest|file\n\n"));
-  printf (_("For bug reporting instructions, please see:\n\
-%s.\n"), REPORT_BUGS_TO);
-}
-
-static int
-makesymlinks (const char *file)
-{
-  char *buffer = NULL;
-  size_t bufferlen = 0;
-  int ret;
-  int lineno;
-  FILE *fp;
-
-  if (strcmp (file, "-") == 0)
-    fp = stdin;
-  else
-    {
-      fp = fopen (file, "r");
-      if (fp == NULL)
-	{
-	  fprintf (stderr, _("%s: file open error: %m\n"), file);
-	  return 1;
-	}
-    }
-
-  ret = 0;
-  lineno = 0;
-  while (!feof_unlocked (fp))
-    {
-      ssize_t n = getline (&buffer, &bufferlen, fp);
-      char *src;
-      char *dest;
-      char *cp = buffer;
-
-      if (n < 0)
-	break;
-      if (buffer[n - 1] == '\n')
-	buffer[n - 1] = '\0';
-
-      ++lineno;
-      while (isspace (*cp))
-	++cp;
-      if (*cp == '\0')
-	/* Ignore empty lines.  */
-	continue;
-      src = cp;
-
-      do
-	++cp;
-      while (*cp != '\0' && ! isspace (*cp));
-      if (*cp != '\0')
-	*cp++ = '\0';
-
-      while (isspace (*cp))
-	++cp;
-      if (*cp == '\0')
-	{
-	  fprintf (stderr, _("No target in line %d\n"), lineno);
-	  ret = 1;
-	  continue;
-	}
-      dest = cp;
-
-      do
-	++cp;
-      while (*cp != '\0' && ! isspace (*cp));
-      if (*cp != '\0')
-	*cp++ = '\0';
-
-      ret |= makesymlink (src, dest);
-    }
-  fclose (fp);
-
-  return ret;
-}
-
-static int
-makesymlink (const char *src, const char *dest)
-{
-  struct stat64 stats;
-  const char *error;
-
-  /* Destination must not be a directory. */
-  if (lstat64 (dest, &stats) == 0)
-    {
-      if (S_ISDIR (stats.st_mode))
-	{
-	  fprintf (stderr, _("%s: destination must not be a directory\n"),
-		   dest);
-	  return 1;
-	}
-      else if (unlink (dest) && errno != ENOENT)
-	{
-	  fprintf (stderr, _("%s: failed to remove the old destination\n"),
-		   dest);
-	  return 1;
-	}
-    }
-  else if (errno != ENOENT)
-    {
-      error = strerror (errno);
-      fprintf (stderr, _("%s: invalid destination: %s\n"), dest, error);
-      return -1;
-    }
-
-  if (symlink (src, dest) == 0)
-    {
-      /* Destination must exist by now. */
-      if (access (dest, F_OK))
-        {
-	  error = strerror (errno);
-	  unlink (dest);
-	  fprintf (stderr, _("Invalid link from \"%s\" to \"%s\": %s\n"),
-		   src, dest, error);
-	  return 1;
-	}
-      return 0;
-    }
-  else
-    {
-      error = strerror (errno);
-      fprintf (stderr, _("Invalid link from \"%s\" to \"%s\": %s\n"),
-	       src, dest, error);
-      return 1;
-    }
-}
diff --git a/elf/sofini.c b/elf/sofini.c
deleted file mode 100644
index 13e74b7903..0000000000
--- a/elf/sofini.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Finalizer module for ELF shared C library.  This provides terminating
-   null pointer words in the `.ctors' and `.dtors' sections.  */
-
-#ifndef NO_CTORS_DTORS_SECTIONS
-static void (*const __CTOR_END__[1]) (void)
-     __attribute__ ((used, section (".ctors")))
-     = { 0 };
-static void (*const __DTOR_END__[1]) (void)
-     __attribute__ ((used, section (".dtors")))
-     = { 0 };
-#endif
-
-/* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
-   this would be the 'length' field in a real FDE.  */
-
-typedef unsigned int ui32 __attribute__ ((mode (SI)));
-static const ui32 __FRAME_END__[1]
-  __attribute__ ((used, section (".eh_frame")))
-  = { 0 };
diff --git a/elf/soinit.c b/elf/soinit.c
deleted file mode 100644
index fe9935732b..0000000000
--- a/elf/soinit.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Initializer module for building the ELF shared C library.  This file and
-   sofini.c do the work normally done by crtbeginS.o and crtendS.o, to wrap
-   the `.ctors' and `.dtors' sections so the lists are terminated, and
-   calling those lists of functions.  */
-
-#ifndef NO_CTORS_DTORS_SECTIONS
-# include <stdlib.h>
-
-static void (*const __CTOR_LIST__[1]) (void)
-  __attribute__ ((used, section (".ctors")))
-  = { (void (*) (void)) -1 };
-static void (*const __DTOR_LIST__[1]) (void)
-  __attribute__ ((used, section (".dtors")))
-  = { (void (*) (void)) -1 };
-
-static inline void
-run_hooks (void (*const list[]) (void))
-{
-  while (*++list)
-    (**list) ();
-}
-
-/* This function will be called from _init in init-first.c.  */
-void
-__libc_global_ctors (void)
-{
-  /* Call constructor functions.  */
-  run_hooks (__CTOR_LIST__);
-}
-
-
-/* This function becomes the DT_FINI termination function
-   for the C library.  */
-void
-__libc_fini (void)
-{
-  /* Call destructor functions.  */
-  run_hooks (__DTOR_LIST__);
-}
-
-void (*_fini_ptr) (void) __attribute__ ((section (".fini_array")))
-     = &__libc_fini;
-#endif
diff --git a/elf/sotruss-lib.c b/elf/sotruss-lib.c
deleted file mode 100644
index da2fedd52a..0000000000
--- a/elf/sotruss-lib.c
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Trace calls through PLTs and show caller, callee, and parameters.
-   Copyright (C) 2011-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@gmail.com>, 2011.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <error.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/param.h>
-#include <sys/uio.h>
-
-#include <ldsodefs.h>
-
-
-extern const char *__progname;
-extern const char *__progname_full;
-
-
-/* List of objects to trace calls from.  */
-static const char *fromlist;
-/* List of objects to trace calls to.  */
-static const char *tolist;
-
-/* If non-zero, also trace returns of the calls.  */
-static int do_exit;
-/* If non-zero print PID for each line.  */
-static int print_pid;
-
-/* The output stream to use.  */
-static FILE *out_file;
-
-
-static int
-match_pid (pid_t pid, const char *which)
-{
-  if (which == NULL || which[0] == '\0')
-    {
-      print_pid = 1;
-      return 1;
-    }
-
-  char *endp;
-  unsigned long n = strtoul (which, &endp, 0);
-  return *endp == '\0' && n == pid;
-}
-
-
-static void
-init (void)
-{
-  fromlist = getenv ("SOTRUSS_FROMLIST");
-  if (fromlist != NULL && fromlist[0] == '\0')
-    fromlist = NULL;
-  tolist = getenv ("SOTRUSS_TOLIST");
-  if (tolist != NULL && tolist[0] == '\0')
-    tolist = NULL;
-  do_exit = (getenv ("SOTRUSS_EXIT") ?: "")[0] != '\0';
-
-  /* Determine whether this process is supposed to be traced and if
-     yes, whether we should print into a file.  */
-  const char *which_process = getenv ("SOTRUSS_WHICH");
-  pid_t pid = getpid ();
-  int out_fd = -1;
-  if (match_pid (pid, which_process))
-    {
-      const char *out_filename = getenv ("SOTRUSS_OUTNAME");
-
-      if (out_filename != NULL && out_filename[0] != 0)
-	{
-	  size_t out_filename_len = strlen (out_filename) + 13;
-	  char fullname[out_filename_len];
-	  char *endp = stpcpy (fullname, out_filename);
-	  if (which_process == NULL || which_process[0] == '\0')
-	    snprintf (endp, 13, ".%ld", (long int) pid);
-
-	  out_fd = open (fullname, O_RDWR | O_CREAT | O_TRUNC, 0666);
-	  if (out_fd != -1)
-	    print_pid = 0;
-	}
-    }
-
-  /* If we do not write into a file write to stderr.  Duplicate the
-     descriptor so that we can keep printing in case the program
-     closes stderr.  Try first to allocate a descriptor with a value
-     usually not used as to minimize interference with the
-     program.  */
-  if (out_fd == -1)
-    {
-      out_fd = fcntl (STDERR_FILENO, F_DUPFD, 1000);
-      if (out_fd == -1)
-	out_fd = dup (STDERR_FILENO);
-    }
-
-  if (out_fd != -1)
-    {
-      /* Convert file descriptor into a stream.  */
-      out_file = fdopen (out_fd, "w");
-      if (out_file != NULL)
-	setlinebuf (out_file);
-    }
-}
-
-
-/* Audit interface verification.  We also initialize everything if
-   everything checks out OK.  */
-unsigned int
-la_version (unsigned int v)
-{
-  if (v != LAV_CURRENT)
-    error (1, 0, "cannot handle interface version %u", v);
-
-  init ();
-
-  return v;
-}
-
-
-/* Check whether a file name is on the colon-separated list of file
-   names.  */
-static unsigned int
-match_file (const char *list, const char *name, size_t name_len,
-	    unsigned int mask)
-{
-  if (list[0] == '\0')
-    return 0;
-
-  const char *cp = list;
-  while (1)
-    {
-      if (strncmp (cp, name, name_len) == 0
-	  && (cp[name_len] == ':' || cp[name_len] == '\0'))
-	return mask;
-
-      cp = strchr (cp, ':');
-      if (cp == NULL)
-	return 0;
-      ++cp;
-    }
-}
-
-
-unsigned int
-la_objopen (struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
-{
-  if (out_file == NULL)
-    return 0;
-
-  const char *full_name = map->l_name ?: "";
-  if (full_name[0] == '\0')
-    full_name = __progname_full;
-  size_t full_name_len = strlen (full_name);
-  const char *base_name = basename (full_name);
-  if (base_name[0] == '\0')
-    base_name = __progname;
-  size_t base_name_len = strlen (base_name);
-
-  int result = 0;
-  const char *print_name = NULL;
-  for (struct libname_list *l = map->l_libname; l != NULL; l = l->next)
-    {
-      if (print_name == NULL || (print_name[0] == '/' && l->name[0] != '/'))
-	print_name = l->name;
-
-      if (fromlist != NULL)
-	result |= match_file (fromlist, l->name, strlen (l->name),
-			      LA_FLG_BINDFROM);
-
-      if (tolist != NULL)
-	result |= match_file (tolist, l->name, strlen (l->name),LA_FLG_BINDTO);
-    }
-
-  if (print_name == NULL)
-    print_name = base_name;
-  if (print_name[0] == '\0')
-    print_name = __progname;
-
-  /* We cannot easily get to the object name in the PLT handling
-     functions.  Use the cookie to get the string pointer passed back
-     to us.  */
-  *cookie = (uintptr_t) print_name;
-
-  /* The object name has to be on the list of objects to trace calls
-     from or that list must be empty.  In the latter case we trace
-     only calls from the main binary.  */
-  if (fromlist == NULL)
-    result |= map->l_name[0] == '\0' ? LA_FLG_BINDFROM : 0;
-  else
-    result |= (match_file (fromlist, full_name, full_name_len,
-			   LA_FLG_BINDFROM)
-	       | match_file (fromlist, base_name, base_name_len,
-			     LA_FLG_BINDFROM));
-
-  /* The object name has to be on the list of objects to trace calls
-     to or that list must be empty.  In the latter case we trace
-     calls toall objects.  */
-  if (tolist == NULL)
-    result |= LA_FLG_BINDTO;
-  else
-    result |= (match_file (tolist, full_name, full_name_len, LA_FLG_BINDTO)
-	       | match_file (tolist, base_name, base_name_len, LA_FLG_BINDTO));
-
-  return result;
-}
-
-
-#if __ELF_NATIVE_CLASS == 32
-# define la_symbind la_symbind32
-typedef Elf32_Sym Elf_Sym;
-#else
-# define la_symbind la_symbind64
-typedef Elf64_Sym Elf_Sym;
-#endif
-
-uintptr_t
-la_symbind (Elf_Sym *sym, unsigned int ndx, uintptr_t *refcook,
-	    uintptr_t *defcook, unsigned int *flags, const char *symname)
-{
-  if (!do_exit)
-    *flags = LA_SYMB_NOPLTEXIT;
-
-  return sym->st_value;
-}
-
-
-static void
-print_enter (uintptr_t *refcook, uintptr_t *defcook, const char *symname,
-	     unsigned long int reg1, unsigned long int reg2,
-	     unsigned long int reg3, unsigned int flags)
-{
-  char buf[3 * sizeof (pid_t) + 3];
-  buf[0] = '\0';
-  if (print_pid)
-    snprintf (buf, sizeof (buf), "%5ld: ", (long int) getpid ());
-
-  fprintf (out_file, "%s%15s -> %-15s:%s%s(0x%lx, 0x%lx, 0x%lx)\n",
-	   buf, (char *) *refcook, (char *) *defcook,
-	   (flags & LA_SYMB_NOPLTEXIT) ? "*" : " ", symname, reg1, reg2, reg3);
-}
-
-
-#ifdef __i386__
-Elf32_Addr
-la_i86_gnu_pltenter (Elf32_Sym *sym __attribute__ ((unused)),
-		     unsigned int ndx __attribute__ ((unused)),
-		     uintptr_t *refcook, uintptr_t *defcook,
-		     La_i86_regs *regs, unsigned int *flags,
-		     const char *symname, long int *framesizep)
-{
-  unsigned long int *sp = (unsigned long int *) regs->lr_esp;
-
-  print_enter (refcook, defcook, symname, sp[1], sp[2], sp[3], *flags);
-
-  /* No need to copy anything, we will not need the parameters in any case.  */
-  *framesizep = 0;
-
-  return sym->st_value;
-}
-#elif defined __x86_64__
-Elf64_Addr
-la_x86_64_gnu_pltenter (Elf64_Sym *sym __attribute__ ((unused)),
-			unsigned int ndx __attribute__ ((unused)),
-			uintptr_t *refcook, uintptr_t *defcook,
-			La_x86_64_regs *regs, unsigned int *flags,
-			const char *symname, long int *framesizep)
-{
-  print_enter (refcook, defcook, symname,
-	       regs->lr_rdi, regs->lr_rsi, regs->lr_rdx, *flags);
-
-  /* No need to copy anything, we will not need the parameters in any case.  */
-  *framesizep = 0;
-
-  return sym->st_value;
-}
-#elif defined __sparc__ && !defined __arch64__
-Elf32_Addr
-la_sparc32_gnu_pltenter (Elf32_Sym *sym __attribute__ ((unused)),
-			 unsigned int ndx __attribute__ ((unused)),
-			 uintptr_t *refcook, uintptr_t *defcook,
-			 La_sparc32_regs *regs, unsigned int *flags,
-			 const char *symname, long int *framesizep)
-{
-  print_enter (refcook, defcook, symname,
-	       regs->lr_reg[0], regs->lr_reg[1], regs->lr_reg[2],
-	       *flags);
-
-  /* No need to copy anything, we will not need the parameters in any case.  */
-  *framesizep = 0;
-
-  return sym->st_value;
-}
-#elif defined __sparc__ && defined __arch64__
-Elf64_Addr
-la_sparc64_gnu_pltenter (Elf64_Sym *sym __attribute__ ((unused)),
-			 unsigned int ndx __attribute__ ((unused)),
-			 uintptr_t *refcook, uintptr_t *defcook,
-			 La_sparc64_regs *regs, unsigned int *flags,
-			 const char *symname, long int *framesizep)
-{
-  print_enter (refcook, defcook, symname,
-	       regs->lr_reg[0], regs->lr_reg[1], regs->lr_reg[2],
-	       *flags);
-
-  /* No need to copy anything, we will not need the parameters in any case.  */
-  *framesizep = 0;
-
-  return sym->st_value;
-}
-#elif !defined HAVE_ARCH_PLTENTER
-# warning "pltenter for architecture not supported"
-#endif
-
-
-static void
-print_exit (uintptr_t *refcook, uintptr_t *defcook, const char *symname,
-	    unsigned long int reg)
-{
-  char buf[3 * sizeof (pid_t) + 3];
-  buf[0] = '\0';
-  if (print_pid)
-    snprintf (buf, sizeof (buf), "%5ld: ", (long int) getpid ());
-
-  fprintf (out_file, "%s%15s -> %-15s:%s%s - 0x%lx\n",
-	   buf, (char *) *refcook, (char *) *defcook, " ", symname, reg);
-}
-
-
-#ifdef __i386__
-unsigned int
-la_i86_gnu_pltexit (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
-		    uintptr_t *defcook, const struct La_i86_regs *inregs,
-		    struct La_i86_retval *outregs, const char *symname)
-{
-  print_exit (refcook, defcook, symname, outregs->lrv_eax);
-
-  return 0;
-}
-#elif defined __x86_64__
-unsigned int
-la_x86_64_gnu_pltexit (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
-		       uintptr_t *defcook, const struct La_x86_64_regs *inregs,
-		       struct La_x86_64_retval *outregs, const char *symname)
-{
-  print_exit (refcook, defcook, symname, outregs->lrv_rax);
-
-  return 0;
-}
-#elif defined __sparc__ && !defined __arch64__
-unsigned int
-la_sparc32_gnu_pltexit (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
-			uintptr_t *defcook, const struct La_sparc32_regs *inregs,
-			struct La_sparc32_retval *outregs, const char *symname)
-{
-  print_exit (refcook, defcook, symname, outregs->lrv_reg[0]);
-
-  return 0;
-}
-#elif defined __sparc__ && defined __arch64__
-unsigned int
-la_sparc64_gnu_pltexit (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
-			uintptr_t *defcook, const struct La_sparc64_regs *inregs,
-			struct La_sparc64_retval *outregs, const char *symname)
-{
-  print_exit (refcook, defcook, symname, outregs->lrv_reg[0]);
-
-  return 0;
-}
-#elif !defined HAVE_ARCH_PLTEXIT
-# warning "pltexit for architecture not supported"
-#endif
diff --git a/elf/sotruss.sh b/elf/sotruss.sh
deleted file mode 100755
index c83e837e0e..0000000000
--- a/elf/sotruss.sh
+++ /dev/null
@@ -1,152 +0,0 @@
-#! @BASH@
-# Copyright (C) 2011-2017 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, see
-# <http://www.gnu.org/licenses/>.
-
-# We should be able to find the translation right at the beginning.
-TEXTDOMAIN=libc
-TEXTDOMAINDIR=@TEXTDOMAINDIR@
-
-unset SOTRUSS_FROMLIST
-unset SOTRUSS_TOLIST
-unset SOTRUSS_OUTNAME
-unset SOTRUSS_EXIT
-unset SOTRUSS_NOINDENT
-SOTRUSS_WHICH=$$
-lib='@PREFIX@/$LIB/audit/sotruss-lib.so'
-
-do_help() {
-  echo $"Usage: sotruss [OPTION...] [--] EXECUTABLE [EXECUTABLE-OPTION...]
-  -F, --from FROMLIST     Trace calls from objects on FROMLIST
-  -T, --to TOLIST         Trace calls to objects on TOLIST
-
-  -e, --exit              Also show exits from the function calls
-  -f, --follow            Trace child processes
-  -o, --output FILENAME   Write output to FILENAME (or FILENAME.$PID in case
-			  -f is also used) instead of standard error
-
-  -?, --help              Give this help list
-      --usage             Give a short usage message
-      --version           Print program version"
-
-  echo
-  printf $"Mandatory arguments to long options are also mandatory for any corresponding\nshort options.\n"
-  echo
-
-  printf $"For bug reporting instructions, please see:\\n%s.\\n" \
-    "@REPORT_BUGS_TO@"
-  exit 0
-}
-
-do_missing_arg() {
-  printf >&2 $"%s: option requires an argument -- '%s'\n" sotruss "$1"
-  printf >&2 $"Try \`%s --help' or \`%s --usage' for more information.\n" sotruss sotruss
-  exit 1
-}
-
-do_ambiguous() {
-  printf >&2 $"%s: option is ambiguous; possibilities:"
-  while test $# -gt 0; do
-    printf >&2 " '%s'" $1
-    shift
-  done
-  printf >&2 "\n"
-  printf >&2 $"Try \`%s --help' or \`%s --usage' for more information.\n" sotruss sotruss
-  exit 1
-}
-
-while test $# -gt 0; do
-  case "$1" in
-  --v | --ve | --ver | --vers | --versi | --versio | --version)
-    echo "sotruss @PKGVERSION@@VERSION@"
-    printf $"Copyright (C) %s 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.
-" "2017"
-    printf $"Written by %s.\n" "Ulrich Drepper"
-    exit 0
-    ;;
-  -\? | --h | --he | --hel | --help)
-    do_help
-    ;;
-  --u | --us | --usa | --usag | --usage)
-    printf $"Usage: %s [-ef] [-F FROMLIST] [-o FILENAME] [-T TOLIST] [--exit]
-	    [--follow] [--from FROMLIST] [--output FILENAME] [--to TOLIST]
-	    [--help] [--usage] [--version] [--]
-	    EXECUTABLE [EXECUTABLE-OPTION...]\n" sotruss
-    exit 0
-    ;;
-  -F | --fr | --fro | --from)
-    if test $# -eq 1; then
-      do_missing_arg "$1"
-    fi
-    shift
-    SOTRUSS_FROMLIST="$1"
-    ;;
-  -T | --t | --to)
-    if test $# -eq 1; then
-      do_missing_arg "$1"
-    fi
-    shift
-    SOTRUSS_TOLIST="$1"
-    ;;
-  -o | --o | --ou | --out | --outp | --outpu | --output)
-    if test $# -eq 1; then
-      do_missing_arg "$1"
-    fi
-    shift
-    SOTRUSS_OUTNAME="$1"
-    ;;
-  -f | --fo | --fol | --foll | --follo | --follow)
-    unset SOTRUSS_WHICH
-    ;;
-  -l | --l | --li | --lib)
-    if test $# -eq 1; then
-      do_missing_arg "$1"
-    fi
-    shift
-    lib="$1"
-    ;;
-  -e | --e | --ex | --exi | --exit)
-    SOTRUSS_EXIT=1
-    ;;
-  --f)
-    do_ambiguous '--from' '--follow'
-    ;;
-  --)
-    shift
-    break
-    ;;
-  -*)
-    printf >&2 $"%s: unrecognized option '%c%s'\n" sotruss '-' ${1#-}
-    printf >&2 $"Try \`%s --help' or \`%s --usage' for more information.\n" sotruss sotruss
-    exit 1
-    ;;
-  *)
-    break
-    ;;
-  esac
-  shift
-done
-
-export SOTRUSS_FROMLIST
-export SOTRUSS_TOLIST
-export SOTRUSS_OUTNAME
-export SOTRUSS_WHICH
-export SOTRUSS_EXIT
-export LD_AUDIT="$lib"
-
-exec "$@"
diff --git a/elf/sprof.c b/elf/sprof.c
deleted file mode 100644
index 85c4975360..0000000000
--- a/elf/sprof.c
+++ /dev/null
@@ -1,1436 +0,0 @@
-/* Read and display shared object profiling data.
-   Copyright (C) 1997-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <argp.h>
-#include <dlfcn.h>
-#include <elf.h>
-#include <error.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <libintl.h>
-#include <locale.h>
-#include <obstack.h>
-#include <search.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <ldsodefs.h>
-#include <sys/gmon.h>
-#include <sys/gmon_out.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <sys/stat.h>
-
-/* Get libc version number.  */
-#include "../version.h"
-
-#define PACKAGE _libc_intl_domainname
-
-
-#include <endian.h>
-#if BYTE_ORDER == BIG_ENDIAN
-# define byteorder ELFDATA2MSB
-# define byteorder_name "big-endian"
-#elif BYTE_ORDER == LITTLE_ENDIAN
-# define byteorder ELFDATA2LSB
-# define byteorder_name "little-endian"
-#else
-# error "Unknown BYTE_ORDER " BYTE_ORDER
-# define byteorder ELFDATANONE
-#endif
-
-#ifndef PATH_MAX
-# define PATH_MAX 1024
-#endif
-
-
-extern int __profile_frequency (void);
-
-/* Name and version of program.  */
-static void print_version (FILE *stream, struct argp_state *state);
-void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
-
-#define OPT_TEST	1
-
-/* Definitions of arguments for argp functions.  */
-static const struct argp_option options[] =
-{
-  { NULL, 0, NULL, 0, N_("Output selection:") },
-  { "call-pairs", 'c', NULL, 0,
-    N_("print list of count paths and their number of use") },
-  { "flat-profile", 'p', NULL, 0,
-    N_("generate flat profile with counts and ticks") },
-  { "graph", 'q', NULL, 0, N_("generate call graph") },
-
-  { "test", OPT_TEST, NULL, OPTION_HIDDEN, NULL },
-  { NULL, 0, NULL, 0, NULL }
-};
-
-/* Short description of program.  */
-static const char doc[] = N_("Read and display shared object profiling data.");
-//For bug reporting instructions, please see:\n
-//<http://www.gnu.org/software/libc/bugs.html>.\n");
-
-/* Strings for arguments in help texts.  */
-static const char args_doc[] = N_("SHOBJ [PROFDATA]");
-
-/* Prototype for option handler.  */
-static error_t parse_opt (int key, char *arg, struct argp_state *state);
-
-/* Function to print some extra text in the help message.  */
-static char *more_help (int key, const char *text, void *input);
-
-/* Data structure to communicate with argp functions.  */
-static struct argp argp =
-{
-  options, parse_opt, args_doc, doc, NULL, more_help
-};
-
-
-/* Operation modes.  */
-static enum
-{
-  NONE = 0,
-  FLAT_MODE = 1 << 0,
-  CALL_GRAPH_MODE = 1 << 1,
-  CALL_PAIRS = 1 << 2,
-
-  DEFAULT_MODE = FLAT_MODE | CALL_GRAPH_MODE
-} mode;
-
-/* Nozero for testing.  */
-static int do_test;
-
-/* Strcuture describing calls.  */
-struct here_fromstruct
-{
-  struct here_cg_arc_record volatile *here;
-  uint16_t link;
-};
-
-/* We define a special type to address the elements of the arc table.
-   This is basically the `gmon_cg_arc_record' format but it includes
-   the room for the tag and it uses real types.  */
-struct here_cg_arc_record
-{
-  uintptr_t from_pc;
-  uintptr_t self_pc;
-  uint32_t count;
-} __attribute__ ((packed));
-
-
-struct known_symbol;
-struct arc_list
-{
-  size_t idx;
-  uintmax_t count;
-
-  struct arc_list *next;
-};
-
-static struct obstack ob_list;
-
-
-struct known_symbol
-{
-  const char *name;
-  uintptr_t addr;
-  size_t size;
-  bool weak;
-  bool hidden;
-
-  uintmax_t ticks;
-  uintmax_t calls;
-
-  struct arc_list *froms;
-  struct arc_list *tos;
-};
-
-
-struct shobj
-{
-  const char *name;		/* User-provided name.  */
-
-  struct link_map *map;
-  const char *dynstrtab;	/* Dynamic string table of shared object.  */
-  const char *soname;		/* Soname of shared object.  */
-
-  uintptr_t lowpc;
-  uintptr_t highpc;
-  unsigned long int kcountsize;
-  size_t expected_size;		/* Expected size of profiling file.  */
-  size_t tossize;
-  size_t fromssize;
-  size_t fromlimit;
-  unsigned int hashfraction;
-  int s_scale;
-
-  void *symbol_map;
-  size_t symbol_mapsize;
-  const ElfW(Sym) *symtab;
-  size_t symtab_size;
-  const char *strtab;
-
-  struct obstack ob_str;
-  struct obstack ob_sym;
-};
-
-
-struct real_gmon_hist_hdr
-{
-  char *low_pc;
-  char *high_pc;
-  int32_t hist_size;
-  int32_t prof_rate;
-  char dimen[15];
-  char dimen_abbrev;
-};
-
-
-struct profdata
-{
-  void *addr;
-  off_t size;
-
-  char *hist;
-  struct real_gmon_hist_hdr *hist_hdr;
-  uint16_t *kcount;
-  uint32_t narcs;		/* Number of arcs in toset.  */
-  struct here_cg_arc_record *data;
-  uint16_t *tos;
-  struct here_fromstruct *froms;
-};
-
-/* Search tree for symbols.  */
-static void *symroot;
-static struct known_symbol **sortsym;
-static size_t symidx;
-static uintmax_t total_ticks;
-
-/* Prototypes for local functions.  */
-static struct shobj *load_shobj (const char *name);
-static void unload_shobj (struct shobj *shobj);
-static struct profdata *load_profdata (const char *name, struct shobj *shobj);
-static void unload_profdata (struct profdata *profdata);
-static void count_total_ticks (struct shobj *shobj, struct profdata *profdata);
-static void count_calls (struct shobj *shobj, struct profdata *profdata);
-static void read_symbols (struct shobj *shobj);
-static void add_arcs (struct profdata *profdata);
-static void generate_flat_profile (struct profdata *profdata);
-static void generate_call_graph (struct profdata *profdata);
-static void generate_call_pair_list (struct profdata *profdata);
-
-
-int
-main (int argc, char *argv[])
-{
-  const char *shobj;
-  const char *profdata;
-  struct shobj *shobj_handle;
-  struct profdata *profdata_handle;
-  int remaining;
-
-  setlocale (LC_ALL, "");
-
-  /* Initialize the message catalog.  */
-  textdomain (_libc_intl_domainname);
-
-  /* Parse and process arguments.  */
-  argp_parse (&argp, argc, argv, 0, &remaining, NULL);
-
-  if (argc - remaining == 0 || argc - remaining > 2)
-    {
-      /* We need exactly two non-option parameter.  */
-      argp_help (&argp, stdout, ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR,
-		 program_invocation_short_name);
-      exit (1);
-    }
-
-  /* Get parameters.  */
-  shobj = argv[remaining];
-  if (argc - remaining == 2)
-    profdata = argv[remaining + 1];
-  else
-    /* No filename for the profiling data given.  We will determine it
-       from the soname of the shobj, later.  */
-    profdata = NULL;
-
-  /* First see whether we can load the shared object.  */
-  shobj_handle = load_shobj (shobj);
-  if (shobj_handle == NULL)
-    exit (1);
-
-  /* We can now determine the filename for the profiling data, if
-     nececessary.  */
-  if (profdata == NULL)
-    {
-      char *newp;
-      const char *soname;
-      size_t soname_len;
-
-      soname = shobj_handle->soname ?: basename (shobj);
-      soname_len = strlen (soname);
-      newp = (char *) alloca (soname_len + sizeof ".profile");
-      stpcpy (mempcpy (newp, soname, soname_len), ".profile");
-      profdata = newp;
-    }
-
-  /* Now see whether the profiling data file matches the given object.   */
-  profdata_handle = load_profdata (profdata, shobj_handle);
-  if (profdata_handle == NULL)
-    {
-      unload_shobj (shobj_handle);
-
-      exit (1);
-    }
-
-  read_symbols (shobj_handle);
-
-  /* Count the ticks.  */
-  count_total_ticks (shobj_handle, profdata_handle);
-
-  /* Count the calls.  */
-  count_calls (shobj_handle, profdata_handle);
-
-  /* Add the arc information.  */
-  add_arcs (profdata_handle);
-
-  /* If no mode is specified fall back to the default mode.  */
-  if (mode == NONE)
-    mode = DEFAULT_MODE;
-
-  /* Do some work.  */
-  if (mode & FLAT_MODE)
-    generate_flat_profile (profdata_handle);
-
-  if (mode & CALL_GRAPH_MODE)
-    generate_call_graph (profdata_handle);
-
-  if (mode & CALL_PAIRS)
-    generate_call_pair_list (profdata_handle);
-
-  /* Free the resources.  */
-  unload_shobj (shobj_handle);
-  unload_profdata (profdata_handle);
-
-  return 0;
-}
-
-
-/* Handle program arguments.  */
-static error_t
-parse_opt (int key, char *arg, struct argp_state *state)
-{
-  switch (key)
-    {
-    case 'c':
-      mode |= CALL_PAIRS;
-      break;
-    case 'p':
-      mode |= FLAT_MODE;
-      break;
-    case 'q':
-      mode |= CALL_GRAPH_MODE;
-      break;
-    case OPT_TEST:
-      do_test = 1;
-      break;
-    default:
-      return ARGP_ERR_UNKNOWN;
-    }
-  return 0;
-}
-
-
-static char *
-more_help (int key, const char *text, void *input)
-{
-  char *tp = NULL;
-  switch (key)
-    {
-    case ARGP_KEY_HELP_EXTRA:
-      /* We print some extra information.  */
-      if (asprintf (&tp, gettext ("\
-For bug reporting instructions, please see:\n\
-%s.\n"), REPORT_BUGS_TO) < 0)
-	return NULL;
-      return tp;
-    default:
-      break;
-    }
-  return (char *) text;
-}
-
-
-/* Print the version information.  */
-static void
-print_version (FILE *stream, struct argp_state *state)
-{
-  fprintf (stream, "sprof %s%s\n", PKGVERSION, VERSION);
-  fprintf (stream, gettext ("\
-Copyright (C) %s Free Software Foundation, Inc.\n\
-This is free software; see the source for copying conditions.  There is NO\n\
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"),
-	   "2017");
-  fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
-}
-
-
-/* Note that we must not use `dlopen' etc.  The shobj object must not
-   be loaded for use.  */
-static struct shobj *
-load_shobj (const char *name)
-{
-  struct link_map *map = NULL;
-  struct shobj *result;
-  ElfW(Addr) mapstart = ~((ElfW(Addr)) 0);
-  ElfW(Addr) mapend = 0;
-  const ElfW(Phdr) *ph;
-  size_t textsize;
-  ElfW(Ehdr) *ehdr;
-  int fd;
-  ElfW(Shdr) *shdr;
-  size_t pagesize = getpagesize ();
-
-  /* Since we use dlopen() we must be prepared to work around the sometimes
-     strange lookup rules for the shared objects.  If we have a file foo.so
-     in the current directory and the user specfies foo.so on the command
-     line (without specifying a directory) we should load the file in the
-     current directory even if a normal dlopen() call would read the other
-     file.  We do this by adding a directory portion to the name.  */
-  if (strchr (name, '/') == NULL)
-    {
-      char *load_name = (char *) alloca (strlen (name) + 3);
-      stpcpy (stpcpy (load_name, "./"), name);
-
-      map = (struct link_map *) dlopen (load_name, RTLD_LAZY | __RTLD_SPROF);
-    }
-  if (map == NULL)
-    {
-      map = (struct link_map *) dlopen (name, RTLD_LAZY | __RTLD_SPROF);
-      if (map == NULL)
-	{
-	  error (0, errno, _("failed to load shared object `%s'"), name);
-	  return NULL;
-	}
-    }
-
-  /* Prepare the result.  */
-  result = (struct shobj *) calloc (1, sizeof (struct shobj));
-  if (result == NULL)
-    {
-      error (0, errno, _("cannot create internal descriptor"));
-      dlclose (map);
-      return NULL;
-    }
-  result->name = name;
-  result->map = map;
-
-  /* Compute the size of the sections which contain program code.
-     This must match the code in dl-profile.c (_dl_start_profile).  */
-  for (ph = map->l_phdr; ph < &map->l_phdr[map->l_phnum]; ++ph)
-    if (ph->p_type == PT_LOAD && (ph->p_flags & PF_X))
-      {
-	ElfW(Addr) start = (ph->p_vaddr & ~(pagesize - 1));
-	ElfW(Addr) end = ((ph->p_vaddr + ph->p_memsz + pagesize - 1)
-			  & ~(pagesize - 1));
-
-	if (start < mapstart)
-	  mapstart = start;
-	if (end > mapend)
-	  mapend = end;
-      }
-
-  result->lowpc = ROUNDDOWN ((uintptr_t) (mapstart + map->l_addr),
-			     HISTFRACTION * sizeof (HISTCOUNTER));
-  result->highpc = ROUNDUP ((uintptr_t) (mapend + map->l_addr),
-			    HISTFRACTION * sizeof (HISTCOUNTER));
-  if (do_test)
-    printf ("load addr: %0#*" PRIxPTR "\n"
-	    "lower bound PC: %0#*" PRIxPTR "\n"
-	    "upper bound PC: %0#*" PRIxPTR "\n",
-	    __ELF_NATIVE_CLASS == 32 ? 10 : 18, map->l_addr,
-	    __ELF_NATIVE_CLASS == 32 ? 10 : 18, result->lowpc,
-	    __ELF_NATIVE_CLASS == 32 ? 10 : 18, result->highpc);
-
-  textsize = result->highpc - result->lowpc;
-  result->kcountsize = textsize / HISTFRACTION;
-  result->hashfraction = HASHFRACTION;
-  if (do_test)
-    printf ("hashfraction = %d\ndivider = %Zu\n",
-	    result->hashfraction,
-	    result->hashfraction * sizeof (struct here_fromstruct));
-  result->tossize = textsize / HASHFRACTION;
-  result->fromlimit = textsize * ARCDENSITY / 100;
-  if (result->fromlimit < MINARCS)
-    result->fromlimit = MINARCS;
-  if (result->fromlimit > MAXARCS)
-    result->fromlimit = MAXARCS;
-  result->fromssize = result->fromlimit * sizeof (struct here_fromstruct);
-
-  result->expected_size = (sizeof (struct gmon_hdr)
-			   + 4 + sizeof (struct gmon_hist_hdr)
-			   + result->kcountsize
-			   + 4 + 4
-			   + (result->fromssize
-			      * sizeof (struct here_cg_arc_record)));
-
-  if (do_test)
-    printf ("expected size: %Zd\n", result->expected_size);
-
-#define SCALE_1_TO_1	0x10000L
-
-  if (result->kcountsize < result->highpc - result->lowpc)
-    {
-      size_t range = result->highpc - result->lowpc;
-      size_t quot = range / result->kcountsize;
-
-      if (quot >= SCALE_1_TO_1)
-	result->s_scale = 1;
-      else if (quot >= SCALE_1_TO_1 / 256)
-	result->s_scale = SCALE_1_TO_1 / quot;
-      else if (range > ULONG_MAX / 256)
-	result->s_scale = ((SCALE_1_TO_1 * 256)
-			   / (range / (result->kcountsize / 256)));
-      else
-	result->s_scale = ((SCALE_1_TO_1 * 256)
-			   / ((range * 256) / result->kcountsize));
-    }
-  else
-    result->s_scale = SCALE_1_TO_1;
-
-  if (do_test)
-    printf ("s_scale: %d\n", result->s_scale);
-
-  /* Determine the dynamic string table.  */
-  if (map->l_info[DT_STRTAB] == NULL)
-    result->dynstrtab = NULL;
-  else
-    result->dynstrtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
-  if (do_test)
-    printf ("string table: %p\n", result->dynstrtab);
-
-  /* Determine the soname.  */
-  if (map->l_info[DT_SONAME] == NULL)
-    result->soname = NULL;
-  else
-    result->soname = result->dynstrtab + map->l_info[DT_SONAME]->d_un.d_val;
-  if (do_test && result->soname != NULL)
-    printf ("soname: %s\n", result->soname);
-
-  /* Now we have to load the symbol table.
-
-     First load the section header table.  */
-  ehdr = (ElfW(Ehdr) *) map->l_map_start;
-
-  /* Make sure we are on the right party.  */
-  if (ehdr->e_shentsize != sizeof (ElfW(Shdr)))
-    abort ();
-
-  /* And we need the shared object file descriptor again.  */
-  fd = open (map->l_name, O_RDONLY);
-  if (fd == -1)
-    /* Dooh, this really shouldn't happen.  We know the file is available.  */
-    error (EXIT_FAILURE, errno, _("Reopening shared object `%s' failed"),
-	   map->l_name);
-
-  /* Map the section header.  */
-  size_t size = ehdr->e_shnum * sizeof (ElfW(Shdr));
-  shdr = (ElfW(Shdr) *) alloca (size);
-  if (pread (fd, shdr, size, ehdr->e_shoff) != size)
-    error (EXIT_FAILURE, errno, _("reading of section headers failed"));
-
-  /* Get the section header string table.  */
-  char *shstrtab = (char *) alloca (shdr[ehdr->e_shstrndx].sh_size);
-  if (pread (fd, shstrtab, shdr[ehdr->e_shstrndx].sh_size,
-	     shdr[ehdr->e_shstrndx].sh_offset)
-      != shdr[ehdr->e_shstrndx].sh_size)
-    error (EXIT_FAILURE, errno,
-	   _("reading of section header string table failed"));
-
-  /* Search for the ".symtab" section.  */
-  ElfW(Shdr) *symtab_entry = NULL;
-  ElfW(Shdr) *debuglink_entry = NULL;
-  for (int idx = 0; idx < ehdr->e_shnum; ++idx)
-    if (shdr[idx].sh_type == SHT_SYMTAB
-	&& strcmp (shstrtab + shdr[idx].sh_name, ".symtab") == 0)
-      {
-	symtab_entry = &shdr[idx];
-	break;
-      }
-    else if (shdr[idx].sh_type == SHT_PROGBITS
-	     && strcmp (shstrtab + shdr[idx].sh_name, ".gnu_debuglink") == 0)
-      debuglink_entry = &shdr[idx];
-
-  /* Get the file name of the debuginfo file if necessary.  */
-  int symfd = fd;
-  if (symtab_entry == NULL && debuglink_entry != NULL)
-    {
-      size_t size = debuglink_entry->sh_size;
-      char *debuginfo_fname = (char *) alloca (size + 1);
-      debuginfo_fname[size] = '\0';
-      if (pread (fd, debuginfo_fname, size, debuglink_entry->sh_offset)
-	  != size)
-	{
-	  fprintf (stderr, _("*** Cannot read debuginfo file name: %m\n"));
-	  goto no_debuginfo;
-	}
-
-      static const char procpath[] = "/proc/self/fd/%d";
-      char origprocname[sizeof (procpath) + sizeof (int) * 3];
-      snprintf (origprocname, sizeof (origprocname), procpath, fd);
-      char *origlink = (char *) alloca (PATH_MAX);
-      ssize_t n = readlink (origprocname, origlink, PATH_MAX - 1);
-      if (n == -1)
-	goto no_debuginfo;
-      origlink[n] = '\0';
-
-      /* Try to find the actual file.  There are three places:
-	 1. the same directory the DSO is in
-	 2. in a subdir named .debug of the directory the DSO is in
-	 3. in /usr/lib/debug/PATH-OF-DSO
-      */
-      char *realname = canonicalize_file_name (origlink);
-      char *cp = NULL;
-      if (realname == NULL || (cp = strrchr (realname, '/')) == NULL)
-	error (EXIT_FAILURE, errno, _("cannot determine file name"));
-
-      /* Leave the last slash in place.  */
-      *++cp = '\0';
-
-      /* First add the debuginfo file name only.  */
-      static const char usrlibdebug[]= "/usr/lib/debug/";
-      char *workbuf = (char *) alloca (sizeof (usrlibdebug)
-				       + (cp - realname)
-				       + strlen (debuginfo_fname));
-      strcpy (stpcpy (workbuf, realname), debuginfo_fname);
-
-      int fd2 = open (workbuf, O_RDONLY);
-      if (fd2 == -1)
-	{
-	  strcpy (stpcpy (stpcpy (workbuf, realname), ".debug/"),
-		  debuginfo_fname);
-	  fd2 = open (workbuf, O_RDONLY);
-	  if (fd2 == -1)
-	    {
-	      strcpy (stpcpy (stpcpy (workbuf, usrlibdebug), realname),
-		      debuginfo_fname);
-	      fd2 = open (workbuf, O_RDONLY);
-	    }
-	}
-
-      if (fd2 != -1)
-	{
-	  ElfW(Ehdr) ehdr2;
-
-	  /* Read the ELF header.  */
-	  if (pread (fd2, &ehdr2, sizeof (ehdr2), 0) != sizeof (ehdr2))
-	    error (EXIT_FAILURE, errno,
-		   _("reading of ELF header failed"));
-
-	  /* Map the section header.  */
-	  size_t size = ehdr2.e_shnum * sizeof (ElfW(Shdr));
-	  ElfW(Shdr) *shdr2 = (ElfW(Shdr) *) alloca (size);
-	  if (pread (fd2, shdr2, size, ehdr2.e_shoff) != size)
-	    error (EXIT_FAILURE, errno,
-		   _("reading of section headers failed"));
-
-	  /* Get the section header string table.  */
-	  shstrtab = (char *) alloca (shdr2[ehdr2.e_shstrndx].sh_size);
-	  if (pread (fd2, shstrtab, shdr2[ehdr2.e_shstrndx].sh_size,
-		     shdr2[ehdr2.e_shstrndx].sh_offset)
-	      != shdr2[ehdr2.e_shstrndx].sh_size)
-	    error (EXIT_FAILURE, errno,
-		   _("reading of section header string table failed"));
-
-	  /* Search for the ".symtab" section.  */
-	  for (int idx = 0; idx < ehdr2.e_shnum; ++idx)
-	    if (shdr2[idx].sh_type == SHT_SYMTAB
-		&& strcmp (shstrtab + shdr2[idx].sh_name, ".symtab") == 0)
-	      {
-		symtab_entry = &shdr2[idx];
-		shdr = shdr2;
-		symfd = fd2;
-		break;
-	      }
-
-	  if  (fd2 != symfd)
-	    close (fd2);
-	}
-    }
-
- no_debuginfo:
-  if (symtab_entry == NULL)
-    {
-      fprintf (stderr, _("\
-*** The file `%s' is stripped: no detailed analysis possible\n"),
-	      name);
-      result->symtab = NULL;
-      result->strtab = NULL;
-    }
-  else
-    {
-      ElfW(Off) min_offset, max_offset;
-      ElfW(Shdr) *strtab_entry;
-
-      strtab_entry = &shdr[symtab_entry->sh_link];
-
-      /* Find the minimum and maximum offsets that include both the symbol
-	 table and the string table.  */
-      if (symtab_entry->sh_offset < strtab_entry->sh_offset)
-	{
-	  min_offset = symtab_entry->sh_offset & ~(pagesize - 1);
-	  max_offset = strtab_entry->sh_offset + strtab_entry->sh_size;
-	}
-      else
-	{
-	  min_offset = strtab_entry->sh_offset & ~(pagesize - 1);
-	  max_offset = symtab_entry->sh_offset + symtab_entry->sh_size;
-	}
-
-      result->symbol_map = mmap (NULL, max_offset - min_offset,
-				 PROT_READ, MAP_SHARED|MAP_FILE, symfd,
-				 min_offset);
-      if (result->symbol_map == MAP_FAILED)
-	error (EXIT_FAILURE, errno, _("failed to load symbol data"));
-
-      result->symtab
-	= (const ElfW(Sym) *) ((const char *) result->symbol_map
-			       + (symtab_entry->sh_offset - min_offset));
-      result->symtab_size = symtab_entry->sh_size;
-      result->strtab = ((const char *) result->symbol_map
-			+ (strtab_entry->sh_offset - min_offset));
-      result->symbol_mapsize = max_offset - min_offset;
-    }
-
-  /* Free the descriptor for the shared object.  */
-  close (fd);
-  if (symfd != fd)
-    close (symfd);
-
-  return result;
-}
-
-
-static void
-unload_shobj (struct shobj *shobj)
-{
-  munmap (shobj->symbol_map, shobj->symbol_mapsize);
-  dlclose (shobj->map);
-}
-
-
-static struct profdata *
-load_profdata (const char *name, struct shobj *shobj)
-{
-  struct profdata *result;
-  int fd;
-  struct stat64 st;
-  void *addr;
-  uint32_t *narcsp;
-  size_t fromlimit;
-  struct here_cg_arc_record *data;
-  struct here_fromstruct *froms;
-  uint16_t *tos;
-  size_t fromidx;
-  size_t idx;
-
-  fd = open (name, O_RDONLY);
-  if (fd == -1)
-    {
-      char *ext_name;
-
-      if (errno != ENOENT || strchr (name, '/') != NULL)
-	/* The file exists but we are not allowed to read it or the
-	   file does not exist and the name includes a path
-	   specification..  */
-	return NULL;
-
-      /* A file with the given name does not exist in the current
-	 directory, try it in the default location where the profiling
-	 files are created.  */
-      ext_name = (char *) alloca (strlen (name) + sizeof "/var/tmp/");
-      stpcpy (stpcpy (ext_name, "/var/tmp/"), name);
-      name = ext_name;
-
-      fd = open (ext_name, O_RDONLY);
-      if (fd == -1)
-	{
-	  /* Even this file does not exist.  */
-	  error (0, errno, _("cannot load profiling data"));
-	  return NULL;
-	}
-    }
-
-  /* We have found the file, now make sure it is the right one for the
-     data file.  */
-  if (fstat64 (fd, &st) < 0)
-    {
-      error (0, errno, _("while stat'ing profiling data file"));
-      close (fd);
-      return NULL;
-    }
-
-  if ((size_t) st.st_size != shobj->expected_size)
-    {
-      error (0, 0,
-	     _("profiling data file `%s' does not match shared object `%s'"),
-	     name, shobj->name);
-      close (fd);
-      return NULL;
-    }
-
-  /* The data file is most probably the right one for our shared
-     object.  Map it now.  */
-  addr = mmap (NULL, st.st_size, PROT_READ, MAP_SHARED|MAP_FILE, fd, 0);
-  if (addr == MAP_FAILED)
-    {
-      error (0, errno, _("failed to mmap the profiling data file"));
-      close (fd);
-      return NULL;
-    }
-
-  /* We don't need the file desriptor anymore.  */
-  if (close (fd) < 0)
-    {
-      error (0, errno, _("error while closing the profiling data file"));
-      munmap (addr, st.st_size);
-      return NULL;
-    }
-
-  /* Prepare the result.  */
-  result = (struct profdata *) calloc (1, sizeof (struct profdata));
-  if (result == NULL)
-    {
-      error (0, errno, _("cannot create internal descriptor"));
-      munmap (addr, st.st_size);
-      return NULL;
-    }
-
-  /* Store the address and size so that we can later free the resources.  */
-  result->addr = addr;
-  result->size = st.st_size;
-
-  /* Pointer to data after the header.  */
-  result->hist = (char *) ((struct gmon_hdr *) addr + 1);
-  result->hist_hdr = (struct real_gmon_hist_hdr *) ((char *) result->hist
-						    + sizeof (uint32_t));
-  result->kcount = (uint16_t *) ((char *) result->hist + sizeof (uint32_t)
-				 + sizeof (struct real_gmon_hist_hdr));
-
-  /* Compute pointer to array of the arc information.  */
-  narcsp = (uint32_t *) ((char *) result->kcount + shobj->kcountsize
-			 + sizeof (uint32_t));
-  result->narcs = *narcsp;
-  result->data = (struct here_cg_arc_record *) ((char *) narcsp
-						+ sizeof (uint32_t));
-
-  /* Create the gmon_hdr we expect or write.  */
-  struct real_gmon_hdr
-  {
-    char cookie[4];
-    int32_t version;
-    char spare[3 * 4];
-  } gmon_hdr;
-  if (sizeof (gmon_hdr) != sizeof (struct gmon_hdr)
-      || (offsetof (struct real_gmon_hdr, cookie)
-	  != offsetof (struct gmon_hdr, cookie))
-      || (offsetof (struct real_gmon_hdr, version)
-	  != offsetof (struct gmon_hdr, version)))
-    abort ();
-
-  memcpy (&gmon_hdr.cookie[0], GMON_MAGIC, sizeof (gmon_hdr.cookie));
-  gmon_hdr.version = GMON_SHOBJ_VERSION;
-  memset (gmon_hdr.spare, '\0', sizeof (gmon_hdr.spare));
-
-  /* Create the hist_hdr we expect or write.  */
-  struct real_gmon_hist_hdr hist_hdr;
-  if (sizeof (hist_hdr) != sizeof (struct gmon_hist_hdr)
-      || (offsetof (struct real_gmon_hist_hdr, low_pc)
-	  != offsetof (struct gmon_hist_hdr, low_pc))
-      || (offsetof (struct real_gmon_hist_hdr, high_pc)
-	  != offsetof (struct gmon_hist_hdr, high_pc))
-      || (offsetof (struct real_gmon_hist_hdr, hist_size)
-	  != offsetof (struct gmon_hist_hdr, hist_size))
-      || (offsetof (struct real_gmon_hist_hdr, prof_rate)
-	  != offsetof (struct gmon_hist_hdr, prof_rate))
-      || (offsetof (struct real_gmon_hist_hdr, dimen)
-	  != offsetof (struct gmon_hist_hdr, dimen))
-      || (offsetof (struct real_gmon_hist_hdr, dimen_abbrev)
-	  != offsetof (struct gmon_hist_hdr, dimen_abbrev)))
-    abort ();
-
-  hist_hdr.low_pc = (char *) shobj->lowpc - shobj->map->l_addr;
-  hist_hdr.high_pc = (char *) shobj->highpc - shobj->map->l_addr;
-  if (do_test)
-    printf ("low_pc = %p\nhigh_pc = %p\n", hist_hdr.low_pc, hist_hdr.high_pc);
-  hist_hdr.hist_size = shobj->kcountsize / sizeof (HISTCOUNTER);
-  hist_hdr.prof_rate = __profile_frequency ();
-  strncpy (hist_hdr.dimen, "seconds", sizeof (hist_hdr.dimen));
-  hist_hdr.dimen_abbrev = 's';
-
-  /* Test whether the header of the profiling data is ok.  */
-  if (memcmp (addr, &gmon_hdr, sizeof (struct gmon_hdr)) != 0
-      || *(uint32_t *) result->hist != GMON_TAG_TIME_HIST
-      || memcmp (result->hist_hdr, &hist_hdr,
-		 sizeof (struct gmon_hist_hdr)) != 0
-      || narcsp[-1] != GMON_TAG_CG_ARC)
-    {
-      error (0, 0, _("`%s' is no correct profile data file for `%s'"),
-	     name, shobj->name);
-      if (do_test)
-	{
-	  if (memcmp (addr, &gmon_hdr, sizeof (struct gmon_hdr)) != 0)
-	    puts ("gmon_hdr differs");
-	  if (*(uint32_t *) result->hist != GMON_TAG_TIME_HIST)
-	    puts ("result->hist differs");
-	  if (memcmp (result->hist_hdr, &hist_hdr,
-		      sizeof (struct gmon_hist_hdr)) != 0)
-	    puts ("hist_hdr differs");
-	  if (narcsp[-1] != GMON_TAG_CG_ARC)
-	    puts ("narcsp[-1] differs");
-	}
-      free (result);
-      munmap (addr, st.st_size);
-      return NULL;
-    }
-
-  /* We are pretty sure now that this is a correct input file.  Set up
-     the remaining information in the result structure and return.  */
-  result->tos = (uint16_t *) calloc (shobj->tossize + shobj->fromssize, 1);
-  if (result->tos == NULL)
-    {
-      error (0, errno, _("cannot create internal descriptor"));
-      munmap (addr, st.st_size);
-      free (result);
-      return NULL;
-    }
-
-  result->froms = (struct here_fromstruct *) ((char *) result->tos
-					      + shobj->tossize);
-  fromidx = 0;
-
-  /* Now we have to process all the arc count entries.  */
-  fromlimit = shobj->fromlimit;
-  data = result->data;
-  froms = result->froms;
-  tos = result->tos;
-  for (idx = 0; idx < MIN (*narcsp, fromlimit); ++idx)
-    {
-      size_t to_index;
-      size_t newfromidx;
-      to_index = (data[idx].self_pc / (shobj->hashfraction * sizeof (*tos)));
-      newfromidx = fromidx++;
-      froms[newfromidx].here = &data[idx];
-      froms[newfromidx].link = tos[to_index];
-      tos[to_index] = newfromidx;
-    }
-
-  return result;
-}
-
-
-static void
-unload_profdata (struct profdata *profdata)
-{
-  free (profdata->tos);
-  munmap (profdata->addr, profdata->size);
-  free (profdata);
-}
-
-
-static void
-count_total_ticks (struct shobj *shobj, struct profdata *profdata)
-{
-  volatile uint16_t *kcount = profdata->kcount;
-  size_t maxkidx = shobj->kcountsize;
-  size_t factor = 2 * (65536 / shobj->s_scale);
-  size_t kidx = 0;
-  size_t sidx = 0;
-
-  while (sidx < symidx)
-    {
-      uintptr_t start = sortsym[sidx]->addr;
-      uintptr_t end = start + sortsym[sidx]->size;
-
-      while (kidx < maxkidx && factor * kidx < start)
-	++kidx;
-      if (kidx == maxkidx)
-	break;
-
-      while (kidx < maxkidx && factor * kidx < end)
-	sortsym[sidx]->ticks += kcount[kidx++];
-      if (kidx == maxkidx)
-	break;
-
-      total_ticks += sortsym[sidx++]->ticks;
-    }
-}
-
-
-static size_t
-find_symbol (uintptr_t addr)
-{
-  size_t sidx = 0;
-
-  while (sidx < symidx)
-    {
-      uintptr_t start = sortsym[sidx]->addr;
-      uintptr_t end = start + sortsym[sidx]->size;
-
-      if (addr >= start && addr < end)
-	return sidx;
-
-      if (addr < start)
-	break;
-
-      ++sidx;
-    }
-
-  return (size_t) -1l;
-}
-
-
-static void
-count_calls (struct shobj *shobj, struct profdata *profdata)
-{
-  struct here_cg_arc_record *data = profdata->data;
-  uint32_t narcs = profdata->narcs;
-  uint32_t cnt;
-
-  for (cnt = 0; cnt < narcs; ++cnt)
-    {
-      uintptr_t here = data[cnt].self_pc;
-      size_t symbol_idx;
-
-      /* Find the symbol for this address.  */
-      symbol_idx = find_symbol (here);
-      if (symbol_idx != (size_t) -1l)
-	sortsym[symbol_idx]->calls += data[cnt].count;
-    }
-}
-
-
-static int
-symorder (const void *o1, const void *o2)
-{
-  const struct known_symbol *p1 = (const struct known_symbol *) o1;
-  const struct known_symbol *p2 = (const struct known_symbol *) o2;
-
-  return p1->addr - p2->addr;
-}
-
-
-static void
-printsym (const void *node, VISIT value, int level)
-{
-  if (value == leaf || value == postorder)
-    sortsym[symidx++] = *(struct known_symbol **) node;
-}
-
-
-static void
-read_symbols (struct shobj *shobj)
-{
-  int n = 0;
-
-  /* Initialize the obstacks.  */
-#define obstack_chunk_alloc malloc
-#define obstack_chunk_free free
-  obstack_init (&shobj->ob_str);
-  obstack_init (&shobj->ob_sym);
-  obstack_init (&ob_list);
-
-  /* Process the symbols.  */
-  if (shobj->symtab != NULL)
-    {
-      const ElfW(Sym) *sym = shobj->symtab;
-      const ElfW(Sym) *sym_end
-	= (const ElfW(Sym) *) ((const char *) sym + shobj->symtab_size);
-      for (; sym < sym_end; sym++)
-	if ((ELFW(ST_TYPE) (sym->st_info) == STT_FUNC
-	     || ELFW(ST_TYPE) (sym->st_info) == STT_NOTYPE)
-	    && sym->st_size != 0)
-	  {
-	    struct known_symbol **existp;
-	    struct known_symbol *newsym
-	      = (struct known_symbol *) obstack_alloc (&shobj->ob_sym,
-						       sizeof (*newsym));
-	    if (newsym == NULL)
-	      error (EXIT_FAILURE, errno, _("cannot allocate symbol data"));
-
-	    newsym->name = &shobj->strtab[sym->st_name];
-	    newsym->addr = sym->st_value;
-	    newsym->size = sym->st_size;
-	    newsym->weak = ELFW(ST_BIND) (sym->st_info) == STB_WEAK;
-	    newsym->hidden = (ELFW(ST_VISIBILITY) (sym->st_other)
-			      != STV_DEFAULT);
-	    newsym->ticks = 0;
-	    newsym->calls = 0;
-
-	    existp = tfind (newsym, &symroot, symorder);
-	    if (existp == NULL)
-	      {
-		/* New function.  */
-		tsearch (newsym, &symroot, symorder);
-		++n;
-	      }
-	    else
-	      {
-		/* The function is already defined.  See whether we have
-		   a better name here.  */
-		if (((*existp)->hidden && !newsym->hidden)
-		    || ((*existp)->name[0] == '_' && newsym->name[0] != '_')
-		    || ((*existp)->name[0] != '_' && newsym->name[0] != '_'
-			&& ((*existp)->weak && !newsym->weak)))
-		  *existp = newsym;
-		else
-		  /* We don't need the allocated memory.  */
-		  obstack_free (&shobj->ob_sym, newsym);
-	      }
-	  }
-    }
-  else
-    {
-      /* Blarg, the binary is stripped.  We have to rely on the
-	 information contained in the dynamic section of the object.  */
-      const ElfW(Sym) *symtab = (ElfW(Sym) *) D_PTR (shobj->map,
-						     l_info[DT_SYMTAB]);
-      const char *strtab = (const char *) D_PTR (shobj->map,
-						 l_info[DT_STRTAB]);
-
-      /* We assume that the string table follows the symbol table,
-	 because there is no way in ELF to know the size of the
-	 dynamic symbol table without looking at the section headers.  */
-      while ((void *) symtab < (void *) strtab)
-	{
-	  if ((ELFW(ST_TYPE)(symtab->st_info) == STT_FUNC
-	       || ELFW(ST_TYPE)(symtab->st_info) == STT_NOTYPE)
-	      && symtab->st_size != 0)
-	    {
-	      struct known_symbol *newsym;
-	      struct known_symbol **existp;
-
-	      newsym =
-		(struct known_symbol *) obstack_alloc (&shobj->ob_sym,
-						       sizeof (*newsym));
-	      if (newsym == NULL)
-		error (EXIT_FAILURE, errno, _("cannot allocate symbol data"));
-
-	      newsym->name = &strtab[symtab->st_name];
-	      newsym->addr = symtab->st_value;
-	      newsym->size = symtab->st_size;
-	      newsym->weak = ELFW(ST_BIND) (symtab->st_info) == STB_WEAK;
-	      newsym->hidden = (ELFW(ST_VISIBILITY) (symtab->st_other)
-				!= STV_DEFAULT);
-	      newsym->ticks = 0;
-	      newsym->froms = NULL;
-	      newsym->tos = NULL;
-
-	      existp = tfind (newsym, &symroot, symorder);
-	      if (existp == NULL)
-		{
-		  /* New function.  */
-		  tsearch (newsym, &symroot, symorder);
-		  ++n;
-		}
-	      else
-		{
-		  /* The function is already defined.  See whether we have
-		     a better name here.  */
-		  if (((*existp)->hidden && !newsym->hidden)
-		      || ((*existp)->name[0] == '_' && newsym->name[0] != '_')
-		      || ((*existp)->name[0] != '_' && newsym->name[0] != '_'
-			  && ((*existp)->weak && !newsym->weak)))
-		    *existp = newsym;
-		  else
-		    /* We don't need the allocated memory.  */
-		    obstack_free (&shobj->ob_sym, newsym);
-		}
-	    }
-
-	  ++symtab;
-	}
-    }
-
-  sortsym = malloc (n * sizeof (struct known_symbol *));
-  if (sortsym == NULL)
-    abort ();
-
-  twalk (symroot, printsym);
-}
-
-
-static void
-add_arcs (struct profdata *profdata)
-{
-  uint32_t narcs = profdata->narcs;
-  struct here_cg_arc_record *data = profdata->data;
-  uint32_t cnt;
-
-  for (cnt = 0; cnt < narcs; ++cnt)
-    {
-      /* First add the incoming arc.  */
-      size_t sym_idx = find_symbol (data[cnt].self_pc);
-
-      if (sym_idx != (size_t) -1l)
-	{
-	  struct known_symbol *sym = sortsym[sym_idx];
-	  struct arc_list *runp = sym->froms;
-
-	  while (runp != NULL
-		 && ((data[cnt].from_pc == 0 && runp->idx != (size_t) -1l)
-		     || (data[cnt].from_pc != 0
-			 && (runp->idx == (size_t) -1l
-			     || data[cnt].from_pc < sortsym[runp->idx]->addr
-			     || (data[cnt].from_pc
-				 >= (sortsym[runp->idx]->addr
-				     + sortsym[runp->idx]->size))))))
-	    runp = runp->next;
-
-	  if (runp == NULL)
-	    {
-	      /* We need a new entry.  */
-	      struct arc_list *newp = (struct arc_list *)
-		obstack_alloc (&ob_list, sizeof (struct arc_list));
-
-	      if (data[cnt].from_pc == 0)
-		newp->idx = (size_t) -1l;
-	      else
-		newp->idx = find_symbol (data[cnt].from_pc);
-	      newp->count = data[cnt].count;
-	      newp->next = sym->froms;
-	      sym->froms = newp;
-	    }
-	  else
-	    /* Increment the counter for the found entry.  */
-	    runp->count += data[cnt].count;
-	}
-
-      /* Now add it to the appropriate outgoing list.  */
-      sym_idx = find_symbol (data[cnt].from_pc);
-      if (sym_idx != (size_t) -1l)
-	{
-	  struct known_symbol *sym = sortsym[sym_idx];
-	  struct arc_list *runp = sym->tos;
-
-	  while (runp != NULL
-		 && (runp->idx == (size_t) -1l
-		     || data[cnt].self_pc < sortsym[runp->idx]->addr
-		     || data[cnt].self_pc >= (sortsym[runp->idx]->addr
-					      + sortsym[runp->idx]->size)))
-	    runp = runp->next;
-
-	  if (runp == NULL)
-	    {
-	      /* We need a new entry.  */
-	      struct arc_list *newp = (struct arc_list *)
-		obstack_alloc (&ob_list, sizeof (struct arc_list));
-
-	      newp->idx = find_symbol (data[cnt].self_pc);
-	      newp->count = data[cnt].count;
-	      newp->next = sym->tos;
-	      sym->tos = newp;
-	    }
-	  else
-	    /* Increment the counter for the found entry.  */
-	    runp->count += data[cnt].count;
-	}
-    }
-}
-
-
-static int
-countorder (const void *p1, const void *p2)
-{
-  struct known_symbol *s1 = (struct known_symbol *) p1;
-  struct known_symbol *s2 = (struct known_symbol *) p2;
-
-  if (s1->ticks != s2->ticks)
-    return (int) (s2->ticks - s1->ticks);
-
-  if (s1->calls != s2->calls)
-    return (int) (s2->calls - s1->calls);
-
-  return strcmp (s1->name, s2->name);
-}
-
-
-static double tick_unit;
-static uintmax_t cumu_ticks;
-
-static void
-printflat (const void *node, VISIT value, int level)
-{
-  if (value == leaf || value == postorder)
-    {
-      struct known_symbol *s = *(struct known_symbol **) node;
-
-      cumu_ticks += s->ticks;
-
-      printf ("%6.2f%10.2f%9.2f%9" PRIdMAX "%9.2f           %s\n",
-	      total_ticks ? (100.0 * s->ticks) / total_ticks : 0.0,
-	      tick_unit * cumu_ticks,
-	      tick_unit * s->ticks,
-	      s->calls,
-	      s->calls ? (s->ticks * 1000000) * tick_unit / s->calls : 0,
-	      /* FIXME: don't know about called functions.  */
-	      s->name);
-    }
-}
-
-
-/* ARGUSED */
-static void
-freenoop (void *p)
-{
-}
-
-
-static void
-generate_flat_profile (struct profdata *profdata)
-{
-  size_t n;
-  void *data = NULL;
-
-  tick_unit = 1.0 / profdata->hist_hdr->prof_rate;
-
-  printf ("Flat profile:\n\n"
-	  "Each sample counts as %g %s.\n",
-	  tick_unit, profdata->hist_hdr->dimen);
-  fputs ("  %   cumulative   self              self     total\n"
-	 " time   seconds   seconds    calls  us/call  us/call  name\n",
-	 stdout);
-
-  for (n = 0; n < symidx; ++n)
-    if (sortsym[n]->calls != 0 || sortsym[n]->ticks != 0)
-      tsearch (sortsym[n], &data, countorder);
-
-  twalk (data, printflat);
-
-  tdestroy (data, freenoop);
-}
-
-
-static void
-generate_call_graph (struct profdata *profdata)
-{
-  size_t cnt;
-
-  puts ("\nindex % time    self  children    called     name\n");
-
-  for (cnt = 0; cnt < symidx; ++cnt)
-    if (sortsym[cnt]->froms != NULL || sortsym[cnt]->tos != NULL)
-      {
-	struct arc_list *runp;
-	size_t n;
-
-	/* First print the from-information.  */
-	runp = sortsym[cnt]->froms;
-	while (runp != NULL)
-	  {
-	    printf ("            %8.2f%8.2f%9" PRIdMAX "/%-9" PRIdMAX "   %s",
-		    (runp->idx != (size_t) -1l
-		     ? sortsym[runp->idx]->ticks * tick_unit : 0.0),
-		    0.0, /* FIXME: what's time for the children, recursive */
-		    runp->count, sortsym[cnt]->calls,
-		    (runp->idx != (size_t) -1l ?
-		     sortsym[runp->idx]->name : "<UNKNOWN>"));
-
-	    if (runp->idx != (size_t) -1l)
-	      printf (" [%Zd]", runp->idx);
-	    putchar_unlocked ('\n');
-
-	    runp = runp->next;
-	  }
-
-	/* Info about the function itself.  */
-	n = printf ("[%Zu]", cnt);
-	printf ("%*s%5.1f%8.2f%8.2f%9" PRIdMAX "         %s [%Zd]\n",
-		(int) (7 - n), " ",
-		total_ticks ? (100.0 * sortsym[cnt]->ticks) / total_ticks : 0,
-		sortsym[cnt]->ticks * tick_unit,
-		0.0, /* FIXME: what's time for the children, recursive */
-		sortsym[cnt]->calls,
-		sortsym[cnt]->name, cnt);
-
-	/* Info about the functions this function calls.  */
-	runp = sortsym[cnt]->tos;
-	while (runp != NULL)
-	  {
-	    printf ("            %8.2f%8.2f%9" PRIdMAX "/",
-		    (runp->idx != (size_t) -1l
-		     ? sortsym[runp->idx]->ticks * tick_unit : 0.0),
-		    0.0, /* FIXME: what's time for the children, recursive */
-		    runp->count);
-
-	    if (runp->idx != (size_t) -1l)
-	      printf ("%-9" PRIdMAX "   %s [%Zd]\n",
-		      sortsym[runp->idx]->calls,
-		      sortsym[runp->idx]->name,
-		      runp->idx);
-	    else
-	      fputs ("???         <UNKNOWN>\n\n", stdout);
-
-	    runp = runp->next;
-	  }
-
-	fputs ("-----------------------------------------------\n", stdout);
-      }
-}
-
-
-static void
-generate_call_pair_list (struct profdata *profdata)
-{
-  size_t cnt;
-
-  for (cnt = 0; cnt < symidx; ++cnt)
-    if (sortsym[cnt]->froms != NULL || sortsym[cnt]->tos != NULL)
-      {
-	struct arc_list *runp;
-
-	/* First print the incoming arcs.  */
-	runp = sortsym[cnt]->froms;
-	while (runp != NULL)
-	  {
-	    if (runp->idx == (size_t) -1l)
-	      printf ("\
-<UNKNOWN>                          %-34s %9" PRIdMAX "\n",
-		      sortsym[cnt]->name, runp->count);
-	    runp = runp->next;
-	  }
-
-	/* Next the outgoing arcs.  */
-	runp = sortsym[cnt]->tos;
-	while (runp != NULL)
-	  {
-	    printf ("%-34s %-34s %9" PRIdMAX "\n",
-		    sortsym[cnt]->name,
-		    (runp->idx != (size_t) -1l
-		     ? sortsym[runp->idx]->name : "<UNKNOWN>"),
-		    runp->count);
-	    runp = runp->next;
-	  }
-      }
-}
diff --git a/elf/static-stubs.c b/elf/static-stubs.c
deleted file mode 100644
index f81d5b792b..0000000000
--- a/elf/static-stubs.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Stub implementations of functions to link into statically linked
-   programs without needing libgcc_eh.
-   Copyright (C) 2012-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* Avoid backtrace (and so _Unwind_Backtrace) dependencies from
-   sysdeps/unix/sysv/linux/libc_fatal.c.  */
-#include <sysdeps/posix/libc_fatal.c>
-
-#include <stdlib.h>
-#include <unwind.h>
-
-/* These programs do not use thread cancellation, so _Unwind_Resume
-   and the personality routine are never actually called.  */
-
-void
-_Unwind_Resume (struct _Unwind_Exception *exc __attribute__ ((unused)))
-{
-  abort ();
-}
-
-_Unwind_Reason_Code
-__gcc_personality_v0 (int version __attribute__ ((unused)),
-		      _Unwind_Action actions __attribute__ ((unused)),
-		      _Unwind_Exception_Class exception_class
-		      __attribute__ ((unused)),
-		      struct _Unwind_Exception *ue_header
-		      __attribute__ ((unused)),
-		      struct _Unwind_Context *context __attribute__ ((unused)))
-{
-  abort ();
-}
diff --git a/elf/testobj.h b/elf/testobj.h
deleted file mode 100644
index 1707ae340e..0000000000
--- a/elf/testobj.h
+++ /dev/null
@@ -1,28 +0,0 @@
-extern int preload (int a);
-
-extern int foo (int);
-
-extern int obj1func1 (int);
-
-extern int obj1func2 (int);
-
-extern int obj2func1 (int);
-
-extern int obj2func2 (int);
-
-extern int obj3func1 (int);
-
-extern int obj3func2 (int);
-
-extern int obj4func1 (int);
-
-extern int obj4func2 (int);
-
-extern int obj5func1 (int);
-
-extern int obj5func2 (int);
-
-extern int obj6func1 (int);
-
-extern int obj6func2 (int);
-
diff --git a/elf/testobj1.c b/elf/testobj1.c
deleted file mode 100644
index 5ab20efd62..0000000000
--- a/elf/testobj1.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <dlfcn.h>
-#include <stdlib.h>
-
-#include "testobj.h"
-
-int
-obj1func1 (int a __attribute__ ((unused)))
-{
-  return 42;
-}
-
-int
-obj1func2 (int a)
-{
-  return foo (a) + 10;
-}
-
-int
-preload (int a)
-{
-  int (*fp) (int) = dlsym (RTLD_NEXT, "preload");
-  if (fp != NULL)
-    return fp (a) + 10;
-  return 10;
-}
diff --git a/elf/testobj1_1.c b/elf/testobj1_1.c
deleted file mode 100644
index 2541a5ad1b..0000000000
--- a/elf/testobj1_1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include "testobj.h"
-
-int
-obj1func1 (int a)
-{
-  return 42 + obj1func2 (a);
-}
diff --git a/elf/testobj2.c b/elf/testobj2.c
deleted file mode 100644
index 7e4b610982..0000000000
--- a/elf/testobj2.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "testobj.h"
-
-int
-obj2func1 (int a __attribute__ ((unused)))
-{
-  return 43;
-}
-
-int
-obj2func2 (int a)
-{
-  return obj1func1 (a) + 10;
-}
-
-int
-preload (int a)
-{
-  int (*fp) (int) = dlsym (RTLD_NEXT, "preload");
-  if (fp != NULL)
-    return fp (a) + 10;
-  return 10;
-}
-
-void
-p (void)
-{
-  puts ("hello world");
-}
diff --git a/elf/testobj3.c b/elf/testobj3.c
deleted file mode 100644
index c025ff631a..0000000000
--- a/elf/testobj3.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <dlfcn.h>
-#include <stdlib.h>
-
-#include "testobj.h"
-
-
-int
-obj3func1 (int a __attribute__ ((unused)))
-{
-  return 44;
-}
-
-int
-obj3func2 (int a)
-{
-  return foo (a) + 42;
-}
-
-int
-preload (int a)
-{
-  int (*fp) (int) = dlsym (RTLD_NEXT, "preload");
-  if (fp != NULL)
-    return fp (a) + 10;
-  return 10;
-}
diff --git a/elf/testobj4.c b/elf/testobj4.c
deleted file mode 100644
index 2729ba32be..0000000000
--- a/elf/testobj4.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <dlfcn.h>
-#include <stdlib.h>
-
-#include "testobj.h"
-
-int
-obj4func1 (int a __attribute__ ((unused)))
-{
-  return 55;
-}
-
-int
-obj4func2 (int a)
-{
-  return foo (a) + 43;
-}
-
-int
-preload (int a)
-{
-  int (*fp) (int) = dlsym (RTLD_NEXT, "preload");
-  if (fp != NULL)
-    return fp (a) + 10;
-  return 10;
-}
diff --git a/elf/testobj5.c b/elf/testobj5.c
deleted file mode 100644
index 9675cad88d..0000000000
--- a/elf/testobj5.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <dlfcn.h>
-#include <stdlib.h>
-
-#include "testobj.h"
-
-
-int
-obj5func1 (int a __attribute__ ((unused)))
-{
-  return 66;
-}
-
-int
-obj5func2 (int a)
-{
-  return foo (a) + 44;
-}
-
-int
-preload (int a)
-{
-  int (*fp) (int) = dlsym (RTLD_NEXT, "preload");
-  if (fp != NULL)
-    return fp (a) + 10;
-  return 10;
-}
diff --git a/elf/testobj6.c b/elf/testobj6.c
deleted file mode 100644
index fcba01631d..0000000000
--- a/elf/testobj6.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "testobj.h"
-
-int
-obj6func1 (int a __attribute__ ((unused)))
-{
-  return 77;
-}
-
-int
-obj6func2 (int a)
-{
-  return foo (a) + 46;
-}
-
-int
-preload (int a)
-{
-  return a;
-}
diff --git a/elf/tls-macros.h b/elf/tls-macros.h
deleted file mode 100644
index e25e33b0f0..0000000000
--- a/elf/tls-macros.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Macros to support TLS testing in times of missing compiler support.  */
-
-#define COMMON_INT_DEF(x) \
-  asm (".tls_common " #x ",4,4")
-/* XXX Until we get compiler support we don't need declarations.  */
-#define COMMON_INT_DECL(x)
-
-/* XXX This definition will probably be machine specific, too.  */
-#define VAR_INT_DEF(x) \
-  asm (".section .tdata\n\t"						      \
-       ".globl " #x "\n"						      \
-       ".balign 4\n"							      \
-       #x ":\t.long 0\n\t"						      \
-       ".size " #x ",4\n\t"						      \
-       ".previous")
-/* XXX Until we get compiler support we don't need declarations.  */
-#define VAR_INT_DECL(x)
-
-#include_next <tls-macros.h>
-
-  /* XXX Each architecture must have its own asm for now.  */
-#if !defined TLS_LE || !defined TLS_IE \
-      || !defined TLS_LD || !defined TLS_GD
-# error "No support for this architecture so far."
-#endif
diff --git a/elf/tlsdeschtab.h b/elf/tlsdeschtab.h
deleted file mode 100644
index 3091d8b420..0000000000
--- a/elf/tlsdeschtab.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/* Hash table for TLS descriptors.
-   Copyright (C) 2005-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Alexandre Oliva  <aoliva@redhat.com>
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef TLSDESCHTAB_H
-# define TLSDESCHTAB_H 1
-
-#include <atomic.h>
-
-# ifdef SHARED
-
-#  include <inline-hashtab.h>
-
-inline static int
-hash_tlsdesc (void *p)
-{
-  struct tlsdesc_dynamic_arg *td = p;
-
-  /* We know all entries are for the same module, so ti_offset is the
-     only distinguishing entry.  */
-  return td->tlsinfo.ti_offset;
-}
-
-inline static int
-eq_tlsdesc (void *p, void *q)
-{
-  struct tlsdesc_dynamic_arg *tdp = p, *tdq = q;
-
-  return tdp->tlsinfo.ti_offset == tdq->tlsinfo.ti_offset;
-}
-
-inline static size_t
-map_generation (struct link_map *map)
-{
-  size_t idx = map->l_tls_modid;
-  struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
-
-  /* Find the place in the dtv slotinfo list.  */
-  do
-    {
-      /* Does it fit in the array of this list element?  */
-      if (idx < listp->len)
-	{
-	  /* We should never get here for a module in static TLS, so
-	     we can assume that, if the generation count is zero, we
-	     still haven't determined the generation count for this
-	     module.  */
-	  if (listp->slotinfo[idx].map == map && listp->slotinfo[idx].gen)
-	    return listp->slotinfo[idx].gen;
-	  else
-	    break;
-	}
-      idx -= listp->len;
-      listp = listp->next;
-    }
-  while (listp != NULL);
-
-  /* If we get to this point, the module still hasn't been assigned an
-     entry in the dtv slotinfo data structures, and it will when we're
-     done with relocations.  At that point, the module will get a
-     generation number that is one past the current generation, so
-     return exactly that.  */
-  return GL(dl_tls_generation) + 1;
-}
-
-void *
-internal_function
-_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset)
-{
-  struct hashtab *ht;
-  void **entry;
-  struct tlsdesc_dynamic_arg *td, test;
-
-  /* FIXME: We could use a per-map lock here, but is it worth it?  */
-  __rtld_lock_lock_recursive (GL(dl_load_lock));
-
-  ht = map->l_mach.tlsdesc_table;
-  if (! ht)
-    {
-      ht = htab_create ();
-      if (! ht)
-	{
-	  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-	  return 0;
-	}
-      map->l_mach.tlsdesc_table = ht;
-    }
-
-  test.tlsinfo.ti_module = map->l_tls_modid;
-  test.tlsinfo.ti_offset = ti_offset;
-  entry = htab_find_slot (ht, &test, 1, hash_tlsdesc, eq_tlsdesc);
-  if (! entry)
-    {
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
-      return 0;
-    }
-
-  if (*entry)
-    {
-      td = *entry;
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
-      return td;
-    }
-
-  *entry = td = malloc (sizeof (struct tlsdesc_dynamic_arg));
-  /* This may be higher than the map's generation, but it doesn't
-     matter much.  Worst case, we'll have one extra DTV update per
-     thread.  */
-  td->gen_count = map_generation (map);
-  td->tlsinfo = test.tlsinfo;
-
-  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-  return td;
-}
-
-# endif /* SHARED */
-
-/* The idea of the following two functions is to stop multiple threads
-   from attempting to resolve the same TLS descriptor without busy
-   waiting.  Ideally, we should be able to release the lock right
-   after changing td->entry, and then using say a condition variable
-   or a futex wake to wake up any waiting threads, but let's try to
-   avoid introducing such dependencies.  */
-
-static int
-_dl_tlsdesc_resolve_early_return_p (struct tlsdesc volatile *td, void *caller)
-{
-  if (caller != atomic_load_relaxed (&td->entry))
-    return 1;
-
-  __rtld_lock_lock_recursive (GL(dl_load_lock));
-  if (caller != atomic_load_relaxed (&td->entry))
-    {
-      __rtld_lock_unlock_recursive (GL(dl_load_lock));
-      return 1;
-    }
-
-  atomic_store_relaxed (&td->entry, _dl_tlsdesc_resolve_hold);
-
-  return 0;
-}
-
-static void
-_dl_tlsdesc_wake_up_held_fixups (void)
-{
-  __rtld_lock_unlock_recursive (GL(dl_load_lock));
-}
-
-#endif
diff --git a/elf/tst-_dl_addr_inside_object.c b/elf/tst-_dl_addr_inside_object.c
deleted file mode 100644
index 1604b8df63..0000000000
--- a/elf/tst-_dl_addr_inside_object.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/* Unit test for _dl_addr_inside_object.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <link.h>
-#include <elf.h>
-#include <libc-symbols.h>
-
-extern int internal_function _dl_addr_inside_object (struct link_map *l,
-						     const ElfW(Addr) addr);
-
-static int
-do_test (void)
-{
-  int ret, err = 0;
-  ElfW(Addr) addr;
-  struct link_map map;
-  ElfW(Phdr) header;
-  map.l_phdr = &header;
-  map.l_phnum = 1;
-  map.l_addr = 0x0;
-  /* Segment spans 0x2000 -> 0x4000.  */
-  header.p_vaddr = 0x2000;
-  header.p_memsz = 0x2000;
-  header.p_type = PT_LOAD;
-  /* Address is above the segment e.g. > 0x4000.  */
-  addr = 0x5000;
-  ret = _dl_addr_inside_object (&map, addr);
-  switch (ret)
-    {
-      case 0:
-	printf ("PASS: Above: Address is detected as outside the segment.\n");
-	break;
-      case 1:
-        printf ("FAIL: Above: Address is detected as inside the segment.\n");
-	err++;
-	break;
-      default:
-	printf ("FAIL: Above: Invalid return value.\n");
-	exit (1);
-    }
-  /* Address is inside the segment e.g. 0x2000 < addr < 0x4000.  */
-  addr = 0x3000;
-  ret = _dl_addr_inside_object (&map, addr);
-  switch (ret)
-    {
-      case 0:
-	printf ("FAIL: Inside: Address is detected as outside the segment.\n");
-	err++;
-	break;
-      case 1:
-        printf ("PASS: Inside: Address is detected as inside the segment.\n");
-	break;
-      default:
-	printf ("FAIL: Inside: Invalid return value.\n");
-	exit (1);
-    }
-  /* Address is below the segment e.g. < 0x2000.  */
-  addr = 0x1000;
-  ret = _dl_addr_inside_object (&map, addr);
-  switch (ret)
-    {
-      case 0:
-	printf ("PASS: Below: Address is detected as outside the segment.\n");
-	break;
-      case 1:
-        printf ("FAIL: Below: Address is detected as inside the segment.\n");
-	err++;
-	break;
-      default:
-	printf ("FAIL: Below: Invalid return value.\n");
-	exit (1);
-    }
-  /* Address is in the segment and addr == p_vaddr.  */
-  addr = 0x2000;
-  ret = _dl_addr_inside_object (&map, addr);
-  switch (ret)
-    {
-      case 0:
-	printf ("FAIL: At p_vaddr: Address is detected as outside the segment.\n");
-	err++;
-	break;
-      case 1:
-        printf ("PASS: At p_vaddr: Address is detected as inside the segment.\n");
-	break;
-      default:
-	printf ("FAIL: At p_vaddr: Invalid return value.\n");
-	exit (1);
-    }
-  /* Address is in the segment and addr == p_vaddr + p_memsz - 1.  */
-  addr = 0x2000 + 0x2000 - 0x1;
-  ret = _dl_addr_inside_object (&map, addr);
-  switch (ret)
-    {
-      case 0:
-	printf ("FAIL: At p_memsz-1: Address is detected as outside the segment.\n");
-	err++;
-	break;
-      case 1:
-        printf ("PASS: At p_memsz-1: Address is detected as inside the segment.\n");
-	break;
-      default:
-	printf ("FAIL: At p_memsz-1: Invalid return value.\n");
-	exit (1);
-    }
-  /* Address is outside the segment and addr == p_vaddr + p_memsz.  */
-  addr = 0x2000 + 0x2000;
-  ret = _dl_addr_inside_object (&map, addr);
-  switch (ret)
-    {
-      case 0:
-	printf ("PASS: At p_memsz: Address is detected as outside the segment.\n");
-	break;
-      case 1:
-        printf ("FAIL: At p_memsz: Address is detected as inside the segment.\n");
-	err++;
-	break;
-      default:
-	printf ("FAIL: At p_memsz: Invalid return value.\n");
-	exit (1);
-    }
-  /* Address is outside the segment and p_vaddr at maximum address.  */
-  addr = 0x0 - 0x2;
-  header.p_vaddr = 0x0 - 0x1;
-  header.p_memsz = 0x1;
-  ret = _dl_addr_inside_object (&map, addr);
-  switch (ret)
-    {
-      case 0:
-	printf ("PASS: At max: Address is detected as outside the segment.\n");
-	break;
-      case 1:
-        printf ("FAIL: At max: Address is detected as inside the segment.\n");
-	err++;
-	break;
-      default:
-	printf ("FAIL: At max: Invalid return value.\n");
-	exit (1);
-    }
-  /* Address is outside the segment and p_vaddr at minimum address.  */
-  addr = 0x1;
-  header.p_vaddr = 0x0;
-  header.p_memsz = 0x1;
-  ret = _dl_addr_inside_object (&map, addr);
-  switch (ret)
-    {
-      case 0:
-	printf ("PASS: At min: Address is detected as outside the segment.\n");
-	break;
-      case 1:
-        printf ("FAIL: At min: Address is detected as inside the segment.\n");
-	err++;
-	break;
-      default:
-	printf ("FAIL: At min: Invalid return value.\n");
-	exit (1);
-    }
-  /* Address is always inside the segment with p_memsz at max.  */
-  addr = 0x0;
-  header.p_vaddr = 0x0;
-  header.p_memsz = 0x0 - 0x1;
-  ret = _dl_addr_inside_object (&map, addr);
-  switch (ret)
-    {
-      case 0:
-	printf ("FAIL: At maxmem: Address is detected as outside the segment.\n");
-	err++;
-	break;
-      case 1:
-        printf ("PASS: At maxmem: Address is detected as inside the segment.\n");
-	break;
-      default:
-	printf ("FAIL: At maxmem: Invalid return value.\n");
-	exit (1);
-    }
-  /* Attempt to wrap addr into the segment.
-     Pick a load address in the middle of the address space.
-     Place the test address at 0x0 so it wraps to the middle again.  */
-  map.l_addr = 0x0 - 0x1;
-  map.l_addr = map.l_addr / 2;
-  addr = 0;
-  /* Setup a segment covering 1/2 the address space.  */
-  header.p_vaddr = 0x0;
-  header.p_memsz = 0x0 - 0x1 - map.l_addr;
-  /* No matter where you place addr everything is shifted modulo l_addr
-     and even with this underflow you're always 1 byte away from being
-     in the range.  */
-  ret = _dl_addr_inside_object (&map, addr);
-  switch (ret)
-    {
-      case 0:
-	printf ("PASS: Underflow: Address is detected as outside the segment.\n");
-	break;
-      case 1:
-	printf ("FAIL: Underflow: Address is detected as inside the segment.\n");
-	err++;
-	break;
-      default:
-	printf ("FAIL: Underflow: Invalid return value.\n");
-	exit (1);
-    }
-
-  return err;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-addr1.c b/elf/tst-addr1.c
deleted file mode 100644
index 68ff74aabd..0000000000
--- a/elf/tst-addr1.c
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <string.h>
-
-static int
-do_test (void)
-{
-  Dl_info i;
-  if (dladdr (&printf, &i) == 0)
-    {
-      puts ("not found");
-      return 1;
-    }
-  printf ("found symbol %s in %s\n", i.dli_sname, i.dli_fname);
-  return i.dli_sname == NULL
-	 || (strcmp (i.dli_sname, "printf") != 0
-	     /* On architectures which create PIC code by default
-		&printf may resolve to an address in libc.so
-		rather than in the binary.  printf and _IO_printf
-		are aliased and which one comes first in the
-		hash table is up to the linker.  */
-	     && strcmp (i.dli_sname, "_IO_printf") != 0);
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-align.c b/elf/tst-align.c
deleted file mode 100644
index 01b0b4ffb3..0000000000
--- a/elf/tst-align.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Copyright (C) 2003-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static int
-do_test (void)
-{
-  static const char modname[] = "tst-alignmod.so";
-  int result = 0;
-  void (*fp) (int *);
-  void *h;
-
-  h = dlopen (modname, RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("cannot open '%s': %s\n", modname, dlerror ());
-      exit (1);
-    }
-
-  fp = dlsym (h, "in_dso");
-  if (fp == NULL)
-    {
-      printf ("cannot get symbol 'in_dso': %s\n", dlerror ());
-      exit (1);
-    }
-
-  fp (&result);
-
-  dlclose (h);
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-align2.c b/elf/tst-align2.c
deleted file mode 100644
index 78b66be20a..0000000000
--- a/elf/tst-align2.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/* Copyright (C) 2005-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek <jakub@redhat.com>, 2005.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/wait.h>
-#include <tst-stack-align.h>
-#include <unistd.h>
-
-static int res, fds[2], result;
-static bool test_destructors;
-
-extern void in_dso (int *, bool *, int *);
-
-static void __attribute__ ((constructor)) con (void)
-{
-  res = TEST_STACK_ALIGN () ? -1 : 1;
-}
-
-static void __attribute__ ((destructor)) des (void)
-{
-  if (!test_destructors)
-    return;
-
-  char c = TEST_STACK_ALIGN () ? 'B' : 'A';
-  write (fds[1], &c, 1);
-}
-
-static int
-do_test (void)
-{
-  if (!res)
-    {
-      puts ("binary's constructor has not been run");
-      result = 1;
-    }
-  else if (res != 1)
-    {
-      puts ("binary's constructor has been run without sufficient alignment");
-      result = 1;
-    }
-
-  if (TEST_STACK_ALIGN ())
-    {
-      puts ("insufficient stack alignment in do_test");
-      result = 1;
-    }
-
-  in_dso (&result, &test_destructors, &fds[1]);
-
-  if (pipe (fds) < 0)
-    {
-      printf ("couldn't create pipe: %m\n");
-      return 1;
-    }
-
-  pid_t pid = fork ();
-  if (pid < 0)
-    {
-      printf ("fork failed: %m\n");
-      return 1;
-    }
-
-  if (!pid)
-    {
-      close (fds[0]);
-      test_destructors = true;
-      exit (0);
-    }
-
-  close (fds[1]);
-
-  unsigned char c;
-  ssize_t len;
-  int des_seen = 0, dso_des_seen = 0;
-  while ((len = TEMP_FAILURE_RETRY (read (fds[0], &c, 1))) > 0)
-    {
-      switch (c)
-        {
-        case 'B':
-          puts ("insufficient alignment in binary's destructor");
-          result = 1;
-          /* FALLTHROUGH */
-        case 'A':
-          des_seen++;
-          break;
-        case 'D':
-          puts ("insufficient alignment in DSO destructor");
-          result = 1;
-          /* FALLTHROUGH */
-        case 'C':
-          dso_des_seen++;
-          break;
-        default:
-          printf ("unexpected character %x read from pipe", c);
-          result = 1;
-          break;
-        }
-    }
-
-  close (fds[0]);
-
-  if (des_seen != 1)
-    {
-      printf ("binary destructor run %d times instead of once\n", des_seen);
-      result = 1;
-    }
-
-  if (dso_des_seen != 1)
-    {
-      printf ("DSO destructor run %d times instead of once\n", dso_des_seen);
-      result = 1;
-    }
-
-  int status;
-  pid_t termpid;
-  termpid = TEMP_FAILURE_RETRY (waitpid (pid, &status, 0));
-  if (termpid == -1)
-    {
-      printf ("waitpid failed: %m\n");
-      result = 1;
-    }
-  else if (termpid != pid)
-    {
-      printf ("waitpid returned %ld != %ld\n",
-	      (long int) termpid, (long int) pid);
-      result = 1;
-    }
-  else if (!WIFEXITED (status) || WEXITSTATUS (status))
-    {
-      puts ("child hasn't exited with exit status 0");
-      result = 1;
-    }
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-alignmod.c b/elf/tst-alignmod.c
deleted file mode 100644
index b5e47be0bd..0000000000
--- a/elf/tst-alignmod.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Copyright (C) 2003-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdio.h>
-#include <tst-stack-align.h>
-
-static int res, *resp;
-
-static void __attribute__((constructor))
-con (void)
-{
-  res = TEST_STACK_ALIGN () ? -1 : 1;
-}
-
-void
-in_dso (int *result)
-{
-  if (!res)
-    {
-      puts ("constructor has not been run");
-      *result = 1;
-    }
-  else if (res != 1)
-    {
-      puts ("constructor has been run without sufficient alignment");
-      *result = 1;
-    }
-
-  resp = result;
-}
-
-static void __attribute__((destructor))
-des (void)
-{
-  if (TEST_STACK_ALIGN ())
-    *resp = 1;
-}
diff --git a/elf/tst-alignmod2.c b/elf/tst-alignmod2.c
deleted file mode 100644
index f338ab5c27..0000000000
--- a/elf/tst-alignmod2.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (C) 2003-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdbool.h>
-#include <stdio.h>
-#include <tst-stack-align.h>
-#include <unistd.h>
-
-static int res, *fdp;
-static bool *test_destructorsp;
-
-static void __attribute__((constructor))
-con (void)
-{
-  res = TEST_STACK_ALIGN () ? -1 : 1;
-}
-
-void
-in_dso (int *result, bool *test_destructors, int *fd)
-{
-  if (!res)
-    {
-      puts ("constructor has not been run");
-      *result = 1;
-    }
-  else if (res != 1)
-    {
-      puts ("constructor has been run without sufficient alignment");
-      *result = 1;
-    }
-
-  test_destructorsp = test_destructors;
-  fdp = fd;
-}
-
-static void __attribute__((destructor))
-des (void)
-{
-  if (!test_destructorsp || !*test_destructorsp)
-    return;
-
-  char c = TEST_STACK_ALIGN () ? 'D' : 'C';
-  write (*fdp, &c, 1);
-}
diff --git a/elf/tst-array1-static.c b/elf/tst-array1-static.c
deleted file mode 100644
index 21539a4212..0000000000
--- a/elf/tst-array1-static.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-array1.c"
diff --git a/elf/tst-array1.c b/elf/tst-array1.c
deleted file mode 100644
index e998932b36..0000000000
--- a/elf/tst-array1.c
+++ /dev/null
@@ -1,103 +0,0 @@
-#include <unistd.h>
-
-/* Give init non-default priority so that it runs before init_array.  */
-static void init (void) __attribute__ ((constructor (1000)));
-
-static void
-init (void)
-{
-  write (STDOUT_FILENO, "init\n", 5);
-}
-
-/* Give fini the same priority as init.  */
-static void fini (void) __attribute__ ((destructor (1000)));
-
-static void
-fini (void)
-{
-  write (STDOUT_FILENO, "fini\n", 5);
-}
-
-static void
-preinit_0 (void)
-{
-  write (STDOUT_FILENO, "preinit array 0\n", 16);
-}
-
-static void
-preinit_1 (void)
-{
-  write (STDOUT_FILENO, "preinit array 1\n", 16);
-}
-
-static void
-preinit_2 (void)
-{
-  write (STDOUT_FILENO, "preinit array 2\n", 16);
-}
-
-void (*const preinit_array []) (void)
-     __attribute__ ((section (".preinit_array"), aligned (sizeof (void *)))) =
-{
-  &preinit_0,
-  &preinit_1,
-  &preinit_2
-};
-
-static void
-init_0 (void)
-{
-  write (STDOUT_FILENO, "init array 0\n", 13);
-}
-
-static void
-init_1 (void)
-{
-  write (STDOUT_FILENO, "init array 1\n", 13);
-}
-
-static void
-init_2 (void)
-{
-  write (STDOUT_FILENO, "init array 2\n", 13);
-}
-
-void (*init_array []) (void)
-     __attribute__ ((section (".init_array"), aligned (sizeof (void *)))) =
-{
-  &init_0,
-  &init_1,
-  &init_2
-};
-
-static void
-fini_0 (void)
-{
-  write (STDOUT_FILENO, "fini array 0\n", 13);
-}
-
-static void
-fini_1 (void)
-{
-  write (STDOUT_FILENO, "fini array 1\n", 13);
-}
-
-static void
-fini_2 (void)
-{
-  write (STDOUT_FILENO, "fini array 2\n", 13);
-}
-
-void (*fini_array []) (void)
-     __attribute__ ((section (".fini_array"), aligned (sizeof (void *)))) =
-{
-  &fini_0,
-  &fini_1,
-  &fini_2
-};
-
-int
-main (void)
-{
-  return 0;
-}
diff --git a/elf/tst-array1.exp b/elf/tst-array1.exp
deleted file mode 100644
index cfcec9de0f..0000000000
--- a/elf/tst-array1.exp
+++ /dev/null
@@ -1,11 +0,0 @@
-preinit array 0
-preinit array 1
-preinit array 2
-init
-init array 0
-init array 1
-init array 2
-fini array 2
-fini array 1
-fini array 0
-fini
diff --git a/elf/tst-array2.c b/elf/tst-array2.c
deleted file mode 100644
index 21539a4212..0000000000
--- a/elf/tst-array2.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-array1.c"
diff --git a/elf/tst-array2.exp b/elf/tst-array2.exp
deleted file mode 100644
index ed203525b5..0000000000
--- a/elf/tst-array2.exp
+++ /dev/null
@@ -1,19 +0,0 @@
-preinit array 0
-preinit array 1
-preinit array 2
-DSO init
-DSO init array 0
-DSO init array 1
-DSO init array 2
-init
-init array 0
-init array 1
-init array 2
-fini array 2
-fini array 1
-fini array 0
-fini
-DSO fini array 2
-DSO fini array 1
-DSO fini array 0
-DSO fini
diff --git a/elf/tst-array2dep.c b/elf/tst-array2dep.c
deleted file mode 100644
index 2f920cdc8d..0000000000
--- a/elf/tst-array2dep.c
+++ /dev/null
@@ -1,71 +0,0 @@
-#include <unistd.h>
-
-/* Give init non-default priority so that it runs before init_array.  */
-static void init (void) __attribute__ ((constructor (1000)));
-
-static void
-init (void)
-{
-  write (STDOUT_FILENO, "DSO init\n", 9);
-}
-
-/* Give fini the same priority as init.  */
-static void fini (void) __attribute__ ((destructor (1000)));
-
-static void
-fini (void)
-{
-  write (STDOUT_FILENO, "DSO fini\n", 9);
-}
-
-static void
-init_0 (void)
-{
-  write (STDOUT_FILENO, "DSO init array 0\n", 17);
-}
-
-static void
-init_1 (void)
-{
-  write (STDOUT_FILENO, "DSO init array 1\n", 17);
-}
-
-static void
-init_2 (void)
-{
-  write (STDOUT_FILENO, "DSO init array 2\n", 17);
-}
-
-void (*init_array []) (void)
-     __attribute__ ((section (".init_array"), aligned (sizeof (void *)))) =
-{
-  &init_0,
-  &init_1,
-  &init_2
-};
-
-static void
-fini_0 (void)
-{
-  write (STDOUT_FILENO, "DSO fini array 0\n", 17);
-}
-
-static void
-fini_1 (void)
-{
-  write (STDOUT_FILENO, "DSO fini array 1\n", 17);
-}
-
-static void
-fini_2 (void)
-{
-  write (STDOUT_FILENO, "DSO fini array 2\n", 17);
-}
-
-void (*fini_array []) (void)
-     __attribute__ ((section (".fini_array"), aligned (sizeof (void *)))) =
-{
-  &fini_0,
-  &fini_1,
-  &fini_2
-};
diff --git a/elf/tst-array3.c b/elf/tst-array3.c
deleted file mode 100644
index 21539a4212..0000000000
--- a/elf/tst-array3.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-array1.c"
diff --git a/elf/tst-array4.c b/elf/tst-array4.c
deleted file mode 100644
index ac3d4eb716..0000000000
--- a/elf/tst-array4.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <dlfcn.h>
-
-#define main array1_main
-#include "tst-array1.c"
-#undef main
-
-int
-main (void)
-{
-  void *handle = dlopen ("tst-array2dep.so", RTLD_LAZY);
-
-  array1_main ();
-
-  if (handle != NULL)
-    dlclose (handle);
-
-  return 0;
-}
diff --git a/elf/tst-array4.exp b/elf/tst-array4.exp
deleted file mode 100644
index 560444d2e8..0000000000
--- a/elf/tst-array4.exp
+++ /dev/null
@@ -1,19 +0,0 @@
-preinit array 0
-preinit array 1
-preinit array 2
-init
-init array 0
-init array 1
-init array 2
-DSO init
-DSO init array 0
-DSO init array 1
-DSO init array 2
-DSO fini array 2
-DSO fini array 1
-DSO fini array 0
-DSO fini
-fini array 2
-fini array 1
-fini array 0
-fini
diff --git a/elf/tst-array5-static.c b/elf/tst-array5-static.c
deleted file mode 100644
index 4ef2aba3f3..0000000000
--- a/elf/tst-array5-static.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-array5.c"
diff --git a/elf/tst-array5-static.exp b/elf/tst-array5-static.exp
deleted file mode 100644
index b1dc9e467b..0000000000
--- a/elf/tst-array5-static.exp
+++ /dev/null
@@ -1,2 +0,0 @@
-preinit array in executable: tst-array5-static
-init array in executable: tst-array5-static
diff --git a/elf/tst-array5.c b/elf/tst-array5.c
deleted file mode 100644
index 03a5668326..0000000000
--- a/elf/tst-array5.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <string.h>
-#include <unistd.h>
-
-static void
-preinit_0 (int argc __attribute__ ((unused)), char **argv)
-{
-  char *p = strrchr (argv [0], '/');
-
-  if (p == NULL)
-      return;
-
-  p++;
-  size_t len = strlen (p);
-  write (STDOUT_FILENO, "preinit array in executable: ", 29);
-  write (STDOUT_FILENO, p, len);
-  write (STDOUT_FILENO, "\n", 1);
-}
-
-void (*const preinit_array []) (int, char **)
-     __attribute__ ((section (".preinit_array"), aligned (sizeof (void *)))) =
-{
-  &preinit_0,
-};
-
-static void
-init_0 (int argc __attribute__ ((unused)), char **argv)
-{
-  char *p = strrchr (argv [0], '/');
-
-  if (p == NULL)
-      return;
-
-  p++;
-  size_t len = strlen (p);
-  write (STDOUT_FILENO, "init array in executable: ", 26);
-  write (STDOUT_FILENO, p, len);
-  write (STDOUT_FILENO, "\n", 1);
-}
-
-void (*const init_array []) (int, char **)
-     __attribute__ ((section (".init_array"), aligned (sizeof (void *)))) =
-{
-  &init_0,
-};
-
-int
-main (void)
-{
-  return 0;
-}
diff --git a/elf/tst-array5.exp b/elf/tst-array5.exp
deleted file mode 100644
index 28b4909833..0000000000
--- a/elf/tst-array5.exp
+++ /dev/null
@@ -1,3 +0,0 @@
-preinit array in executable: tst-array5
-init array in DSO: tst-array5
-init array in executable: tst-array5
diff --git a/elf/tst-array5dep.c b/elf/tst-array5dep.c
deleted file mode 100644
index 570d282af4..0000000000
--- a/elf/tst-array5dep.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <string.h>
-#include <unistd.h>
-
-static void
-init_0 (int argc __attribute__ ((unused)), char **argv)
-{
-  char *p = strrchr (argv [0], '/');
-
-  if (p == NULL)
-      return;
-
-  p++;
-  size_t len = strlen (p);
-  write (STDOUT_FILENO, "init array in DSO: ", 19);
-  write (STDOUT_FILENO, p, len);
-  write (STDOUT_FILENO, "\n", 1);
-}
-
-void (*const init_array []) (int, char **)
-     __attribute__ ((section (".init_array"), aligned (sizeof (void *)))) =
-{
-  &init_0,
-};
diff --git a/elf/tst-audit1.c b/elf/tst-audit1.c
deleted file mode 100644
index 63656b4ee9..0000000000
--- a/elf/tst-audit1.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "../io/pwd.c"
diff --git a/elf/tst-audit11.c b/elf/tst-audit11.c
deleted file mode 100644
index ff91a6bd6d..0000000000
--- a/elf/tst-audit11.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Test version symbol binding can find a DSO replaced by la_objsearch.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-do_test (void)
-{
-  puts ("Start");
-  if (dlopen ("$ORIGIN/tst-audit11mod1.so", RTLD_LAZY) == NULL)
-    {
-      printf ("module not loaded: %s\n", dlerror ());
-      return 1;
-    }
-  puts ("OK");
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-audit11mod1.c b/elf/tst-audit11mod1.c
deleted file mode 100644
index 0c0f5c6838..0000000000
--- a/elf/tst-audit11mod1.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* DSO directly opened by tst-audit11.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-extern int f2 (void);
-int
-f1 (void)
-{
-  return f2 ();
-}
diff --git a/elf/tst-audit11mod2.c b/elf/tst-audit11mod2.c
deleted file mode 100644
index d5eb029744..0000000000
--- a/elf/tst-audit11mod2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* DSO indirectly opened by tst-audit11, with symbol versioning.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-int
-f2 (void)
-{
-  return 42;
-}
diff --git a/elf/tst-audit11mod2.map b/elf/tst-audit11mod2.map
deleted file mode 100644
index 278787872c..0000000000
--- a/elf/tst-audit11mod2.map
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Symbol versioning for the DSO indirectly opened by tst-audit11.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-V1 {
-  global: f2;
-  local: *;
-};
diff --git a/elf/tst-audit12.c b/elf/tst-audit12.c
deleted file mode 100644
index 62ac5f28a4..0000000000
--- a/elf/tst-audit12.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Test that symbol is bound to a DSO replaced by la_objsearch.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-do_test (void)
-{
-  puts ("Start");
-  void *h = dlopen ("$ORIGIN/tst-audit12mod1.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("module not loaded: %s\n", dlerror ());
-      return 1;
-    }
-  int (*fp) (void) = (int (*) (void)) dlsym (h, "f1");
-  if (fp == NULL)
-    {
-      printf ("function f1 not found: %s\n", dlerror ());
-      return 1;
-    }
-  int res = fp ();
-  if (res != 43)
-    {
-      puts ("incorrect function f2 called");
-      return 1;
-    }
-  printf ("%d is OK\n", res);
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-audit12mod1.c b/elf/tst-audit12mod1.c
deleted file mode 100644
index a48795b661..0000000000
--- a/elf/tst-audit12mod1.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* DSO directly opened by tst-audit12.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-extern int f2 (void);
-int
-f1 (void)
-{
-  return f2 ();
-}
diff --git a/elf/tst-audit12mod2.c b/elf/tst-audit12mod2.c
deleted file mode 100644
index 593d02dfb6..0000000000
--- a/elf/tst-audit12mod2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Replaced DSO referenced by tst-audit12mod1.so, for tst-audit12.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-int
-f2 (void)
-{
-  return 42;
-}
diff --git a/elf/tst-audit12mod2.map b/elf/tst-audit12mod2.map
deleted file mode 100644
index 11e22bbdee..0000000000
--- a/elf/tst-audit12mod2.map
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Symbol versioning for tst-audit12mod2.so used by tst-audit12.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-V1 {
-  global: f2;
-  local: *;
-};
diff --git a/elf/tst-audit12mod3.c b/elf/tst-audit12mod3.c
deleted file mode 100644
index 1e01bb8eea..0000000000
--- a/elf/tst-audit12mod3.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Replacement DSO loaded by the audit module, for tst-audit12.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-int
-f2 (void)
-{
-  return 43;
-}
diff --git a/elf/tst-audit2.c b/elf/tst-audit2.c
deleted file mode 100644
index 0e66f5c328..0000000000
--- a/elf/tst-audit2.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Test case for early TLS initialization in dynamic linker.  */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <dlfcn.h>
-
-#define MAGIC1 0xabcdef72
-#define MAGIC2 0xd8675309
-static __thread unsigned int magic[] = { MAGIC1, MAGIC2 };
-static __thread int calloc_called;
-
-#undef calloc
-
-/* This calloc definition will be called by the dynamic linker itself.
-   We test that interposed calloc is called by the dynamic loader, and
-   that TLS is fully initialized by then.  */
-
-void *
-calloc (size_t n, size_t m)
-{
-  if (!calloc_called)
-    {
-      /* Allow our calloc to be called more than once.  */
-      calloc_called = 1;
-      if (magic[0] != MAGIC1 || magic[1] != MAGIC2)
-	{
-	  printf ("{%x, %x} != {%x, %x}\n",
-		  magic[0], magic[1], MAGIC1, MAGIC2);
-	  abort ();
-	}
-      magic[0] = MAGIC2;
-      magic[1] = MAGIC1;
-    }
-
-  n *= m;
-  void *ptr = malloc (n);
-  if (ptr != NULL)
-    memset (ptr, '\0', n);
-  return ptr;
-}
-
-static int
-do_test (void)
-{
-  /* Make sure that our calloc is called from the dynamic linker at least
-     once.  */
-  void *h = dlopen("$ORIGIN/tst-auditmod9b.so", RTLD_LAZY);
-  if (h != NULL)
-    dlclose (h);
-  if (magic[1] != MAGIC1 || magic[0] != MAGIC2)
-    {
-      printf ("{%x, %x} != {%x, %x}\n", magic[0], magic[1], MAGIC2, MAGIC1);
-      return 1;
-    }
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-audit8.c b/elf/tst-audit8.c
deleted file mode 100644
index 63656b4ee9..0000000000
--- a/elf/tst-audit8.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "../io/pwd.c"
diff --git a/elf/tst-audit9.c b/elf/tst-audit9.c
deleted file mode 100644
index b9de1bf5a2..0000000000
--- a/elf/tst-audit9.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <dlfcn.h>
-
-static int
-do_test (void)
-{
-  void *h = dlopen("$ORIGIN/tst-auditmod9b.so", RTLD_LAZY);
-  int (*fp)(void) = dlsym(h, "f");
-  return fp() - 1;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-auditmod1.c b/elf/tst-auditmod1.c
deleted file mode 100644
index 573e37abd6..0000000000
--- a/elf/tst-auditmod1.c
+++ /dev/null
@@ -1,135 +0,0 @@
-#include <dlfcn.h>
-#include <link.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <bits/wordsize.h>
-#include <gnu/lib-names.h>
-
-
-unsigned int
-la_version (unsigned int v)
-{
-  setlinebuf (stdout);
-
-  printf ("version: %u\n", v);
-
-  char buf[20];
-  sprintf (buf, "%u", v);
-
-  return v;
-}
-
-void
-la_activity (uintptr_t *cookie, unsigned int flag)
-{
-  if (flag == LA_ACT_CONSISTENT)
-    printf ("activity: consistent\n");
-  else if (flag == LA_ACT_ADD)
-    printf ("activity: add\n");
-  else if (flag == LA_ACT_DELETE)
-    printf ("activity: delete\n");
-  else
-    printf ("activity: unknown activity %u\n", flag);
-}
-
-char *
-la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag)
-{
-  char buf[100];
-  const char *flagstr;
-  if (flag == LA_SER_ORIG)
-    flagstr = "LA_SET_ORIG";
-  else if (flag == LA_SER_LIBPATH)
-    flagstr = "LA_SER_LIBPATH";
-  else if (flag == LA_SER_RUNPATH)
-    flagstr = "LA_SER_RUNPATH";
-  else if (flag == LA_SER_CONFIG)
-    flagstr = "LA_SER_CONFIG";
-  else if (flag == LA_SER_DEFAULT)
-    flagstr = "LA_SER_DEFAULT";
-  else if (flag == LA_SER_SECURE)
-    flagstr = "LA_SER_SECURE";
-  else
-    {
-       sprintf (buf, "unknown flag %d", flag);
-       flagstr = buf;
-    }
-  printf ("objsearch: %s, %s\n", name, flagstr);
-
-  return (char *) name;
-}
-
-unsigned int
-la_objopen (struct link_map *l, Lmid_t lmid, uintptr_t *cookie)
-{
-  printf ("objopen: %ld, %s\n", lmid, l->l_name);
-
-  return 3;
-}
-
-void
-la_preinit (uintptr_t *cookie)
-{
-  printf ("preinit\n");
-}
-
-unsigned int
-la_objclose  (uintptr_t *cookie)
-{
-  printf ("objclose\n");
-  return 0;
-}
-
-uintptr_t
-la_symbind32 (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
-	      uintptr_t *defcook, unsigned int *flags, const char *symname)
-{
-  printf ("symbind32: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
-	  symname, (long int) sym->st_value, ndx, *flags);
-
-  return sym->st_value;
-}
-
-uintptr_t
-la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
-	      uintptr_t *defcook, unsigned int *flags, const char *symname)
-{
-  printf ("symbind64: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
-	  symname, (long int) sym->st_value, ndx, *flags);
-
-  return sym->st_value;
-}
-
-#include <tst-audit.h>
-#if (!defined (pltenter) || !defined (pltexit) || !defined (La_regs) \
-     || !defined (La_retval) || !defined (int_retval))
-# error "architecture specific code needed in sysdeps/CPU/tst-audit.h"
-#endif
-
-
-ElfW(Addr)
-pltenter (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
-	  uintptr_t *defcook, La_regs *regs, unsigned int *flags,
-	  const char *symname, long int *framesizep)
-{
-  printf ("pltenter: symname=%s, st_value=%#lx, ndx=%u, flags=%u\n",
-	  symname, (long int) sym->st_value, ndx, *flags);
-
-  return sym->st_value;
-}
-
-unsigned int
-pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook,
-	 uintptr_t *defcook, const La_regs *inregs, La_retval *outregs,
-	 const char *symname)
-{
-  printf ("pltexit: symname=%s, st_value=%#lx, ndx=%u, retval=%tu\n",
-	  symname, (long int) sym->st_value, ndx,
-	  (ptrdiff_t) outregs->int_retval);
-
-  return 0;
-}
diff --git a/elf/tst-auditmod11.c b/elf/tst-auditmod11.c
deleted file mode 100644
index 18feb5efc4..0000000000
--- a/elf/tst-auditmod11.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Audit module for tst-audit11.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <link.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-unsigned int
-la_version (unsigned int version)
-{
-  return version;
-}
-
-char *
-la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag)
-{
-  if (strcmp (name, "tst-audit11mod2.so") == 0)
-    {
-      return (char *) "$ORIGIN/tst-audit11mod2.so";
-    }
-  return (char *) name;
-}
diff --git a/elf/tst-auditmod12.c b/elf/tst-auditmod12.c
deleted file mode 100644
index 039b7cd62b..0000000000
--- a/elf/tst-auditmod12.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Audit module for tst-audit12.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <link.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-unsigned int
-la_version (unsigned int version)
-{
-  return version;
-}
-
-char *
-la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag)
-{
-  const char target[] = "tst-audit12mod2.so";
-
-  size_t namelen = strlen (name);
-  if (namelen >= sizeof (target) - 1
-      && strcmp (name + namelen - (sizeof (target) - 1), target) == 0)
-    {
-      return (char *) "$ORIGIN/tst-audit12mod3.so";
-    }
-  return (char *) name;
-}
diff --git a/elf/tst-auditmod9a.c b/elf/tst-auditmod9a.c
deleted file mode 100644
index 7213ade123..0000000000
--- a/elf/tst-auditmod9a.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdint.h>
-
-__thread int var;
-
-unsigned int
-la_version (unsigned int v)
-{
-  return v;
-}
-
-void
-la_activity (uintptr_t *cookie, unsigned int flag)
-{
-  ++var;
-}
diff --git a/elf/tst-auditmod9b.c b/elf/tst-auditmod9b.c
deleted file mode 100644
index 8eeeb49986..0000000000
--- a/elf/tst-auditmod9b.c
+++ /dev/null
@@ -1,6 +0,0 @@
-__thread int a;
-
-int f(void)
-{
-  return ++a;
-}
diff --git a/elf/tst-auxv.c b/elf/tst-auxv.c
deleted file mode 100644
index bc571c5fa7..0000000000
--- a/elf/tst-auxv.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <elf.h>
-#include <errno.h>
-#include <link.h>
-#include <string.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <misc/sys/auxv.h>
-
-static int
-do_test (int argc, char *argv[])
-{
-  errno = 0;
-  const char *execfn = (const char *) getauxval (AT_NULL);
-
-  if (errno != ENOENT)
-    {
-      printf ("errno is %d rather than %d (ENOENT) on failure\n", errno,
-	      ENOENT);
-      return 1;
-    }
-
-  if (execfn != NULL)
-    {
-      printf ("getauxval return value is nonzero on failure\n");
-      return 1;
-    }
-
-  errno = 0;
-  execfn = (const char *) getauxval (AT_EXECFN);
-
-  if (execfn == NULL)
-    {
-      printf ("No AT_EXECFN found, AT_EXECFN test skipped\n");
-      return 0;
-    }
-
-  if (errno != 0)
-    {
-      printf ("errno erroneously set to %d on success\n", errno);
-      return 1;
-    }
-
-  if (strcmp (argv[0], execfn) != 0)
-    {
-      printf ("Mismatch: argv[0]: %s vs. AT_EXECFN: %s\n", argv[0], execfn);
-      return 1;
-    }
-
-  return 0;
-}
-
-#define TEST_FUNCTION_ARGV do_test
-#include <support/test-driver.c>
diff --git a/elf/tst-deep1.c b/elf/tst-deep1.c
deleted file mode 100644
index 97dce7ea4d..0000000000
--- a/elf/tst-deep1.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-xyzzy (void)
-{
-  printf ("%s:%s\n", __FILE__, __func__);
-  return 21;
-}
-
-int
-back (void)
-{
-  printf ("%s:%s\n", __FILE__, __func__);
-  return 1;
-}
-
-extern int foo (void);
-
-static int
-do_test (void)
-{
-  void *p = dlopen ("$ORIGIN/tst-deep1mod2.so", RTLD_LAZY|RTLD_DEEPBIND);
-
-  int (*f) (void) = dlsym (p, "bar");
-  if (f == NULL)
-    {
-      puts (dlerror ());
-      return 1;
-    }
-
-  return foo () + f ();
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-deep1mod1.c b/elf/tst-deep1mod1.c
deleted file mode 100644
index cc922e6ea5..0000000000
--- a/elf/tst-deep1mod1.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-int
-foo (void)
-{
-  printf ("%s:%s\n", __FILE__, __func__);
-  return 1;
-}
-
-int
-baz (void)
-{
-  printf ("%s:%s\n", __FILE__, __func__);
-  return 20;
-}
diff --git a/elf/tst-deep1mod2.c b/elf/tst-deep1mod2.c
deleted file mode 100644
index b99caf0328..0000000000
--- a/elf/tst-deep1mod2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-extern int baz (void);
-extern int xyzzy (void);
-int
-bar (void)
-{
-  printf ("%s:%s\n", __FILE__, __func__);
-  return baz () + xyzzy ();;
-}
-
-int
-back (void)
-{
-  printf ("%s:%s\n", __FILE__, __func__);
-  return -1;
-}
diff --git a/elf/tst-deep1mod3.c b/elf/tst-deep1mod3.c
deleted file mode 100644
index eee7d5c97b..0000000000
--- a/elf/tst-deep1mod3.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <stdio.h>
-
-extern int back (void);
-
-int
-baz (void)
-{
-  printf ("%s:%s\n", __FILE__, __func__);
-  return back ();
-}
-
-int
-xyzzy (void)
-{
-  printf ("%s:%s\n", __FILE__, __func__);
-  return 0;
-}
diff --git a/elf/tst-dl-iter-static.c b/elf/tst-dl-iter-static.c
deleted file mode 100644
index 9a2758c8ef..0000000000
--- a/elf/tst-dl-iter-static.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* BZ #16046 dl_iterate_phdr static executable test.
-   Copyright (C) 2014-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <link.h>
-
-/* Check that the link map of the static executable itself is iterated
-   over exactly once.  */
-
-static int
-callback (struct dl_phdr_info *info, size_t size, void *data)
-{
-  int *count = data;
-
-  if (info->dlpi_name[0] == '\0')
-    (*count)++;
-
-  return 0;
-}
-
-static int
-do_test (void)
-{
-  int count = 0;
-  int status;
-
-  status = dl_iterate_phdr (callback, &count);
-
-  return status || count != 1;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-dlmodcount.c b/elf/tst-dlmodcount.c
deleted file mode 100644
index 34c5b25d7f..0000000000
--- a/elf/tst-dlmodcount.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/* Copyright (C) 2004-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by David Mosberger <davidm@hpl.hp.com>, 2004.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <link.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#define SET	0
-#define ADD	1
-#define REMOVE	2
-
-#define leq(l,r)	(((r) - (l)) <= ~0ULL / 2)
-
-static int
-callback (struct dl_phdr_info *info, size_t size, void *ptr)
-{
-  static int last_adds = 0, last_subs = 0;
-  intptr_t cmd = (intptr_t) ptr;
-
-  printf ("  size = %Zu\n", size);
-  if (size < (offsetof (struct dl_phdr_info, dlpi_subs)
-	      + sizeof (info->dlpi_subs)))
-    {
-      fprintf (stderr, "dl_iterate_phdr failed to pass dlpi_adds/dlpi_subs\n");
-      exit (5);
-    }
-
-  printf ("  dlpi_adds = %Lu dlpi_subs = %Lu\n",
-	  info->dlpi_adds, info->dlpi_subs);
-
-  switch (cmd)
-    {
-    case SET:
-      break;
-
-    case ADD:
-      if (leq (info->dlpi_adds, last_adds))
-	{
-	  fprintf (stderr, "dlpi_adds failed to get incremented!\n");
-	  exit (3);
-	}
-      break;
-
-    case REMOVE:
-      if (leq (info->dlpi_subs, last_subs))
-	{
-	  fprintf (stderr, "dlpi_subs failed to get incremented!\n");
-	  exit (4);
-	}
-      break;
-    }
-  last_adds = info->dlpi_adds;
-  last_subs = info->dlpi_subs;
-  return -1;
-}
-
-static void *
-load (const char *path)
-{
-  void *handle;
-
-  printf ("loading `%s'\n", path);
-  handle = dlopen (path, RTLD_LAZY);
-  if (!handle)
-    exit (1);
-  dl_iterate_phdr (callback, (void *)(intptr_t) ADD);
-  return handle;
-}
-
-static void
-unload (const char *path, void *handle)
-{
-  printf ("unloading `%s'\n", path);
-  if (dlclose (handle) < 0)
-    exit (2);
-  dl_iterate_phdr (callback, (void *)(intptr_t) REMOVE);
-}
-
-static int
-do_test (void)
-{
-  void *handle1, *handle2;
-
-  dl_iterate_phdr (callback, (void *)(intptr_t) SET);
-  handle1 = load ("firstobj.so");
-  handle2 = load ("globalmod1.so");
-  unload ("firstobj.so", handle1);
-  unload ("globalmod1.so", handle2);
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-dlmopen1.c b/elf/tst-dlmopen1.c
deleted file mode 100644
index 24145cfca6..0000000000
--- a/elf/tst-dlmopen1.c
+++ /dev/null
@@ -1,80 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <gnu/lib-names.h>
-
-#define TEST_SO "$ORIGIN/tst-dlmopen1mod.so"
-
-static int
-do_test (void)
-{
-  void *h = dlopen (LIBC_SO, RTLD_LAZY|RTLD_NOLOAD);
-  if (h == NULL)
-    {
-      printf ("cannot get handle for %s: %s\n", LIBC_SO, dlerror ());
-      return 1;
-    }
-
-  Lmid_t ns = -10;
-  if (dlinfo (h, RTLD_DI_LMID, &ns) != 0)
-    {
-      printf ("dlinfo for %s in %s failed: %s\n",
-	      LIBC_SO, __func__, dlerror ());
-      return 1;
-    }
-
-  if (ns != LM_ID_BASE)
-    {
-      printf ("namespace for %s not LM_ID_BASE\n", LIBC_SO);
-      return 1;
-    }
-
-  if (dlclose (h) != 0)
-    {
-      printf ("dlclose for %s in %s failed: %s\n",
-	      LIBC_SO, __func__, dlerror ());
-      return 1;
-    }
-
-  h = dlmopen (LM_ID_NEWLM, TEST_SO, RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("cannot get handle for %s: %s\n",
-	      "tst-dlmopen1mod.so", dlerror ());
-      return 1;
-    }
-
-  ns = -10;
-  if (dlinfo (h, RTLD_DI_LMID, &ns) != 0)
-    {
-      printf ("dlinfo for %s in %s failed: %s\n",
-	      "tst-dlmopen1mod.so", __func__, dlerror ());
-      return 1;
-    }
-
-  if (ns == LM_ID_BASE)
-    {
-      printf ("namespace for %s is LM_ID_BASE\n", TEST_SO);
-      return 1;
-    }
-
-  int (*fct) (Lmid_t) = dlsym (h, "foo");
-  if (fct == NULL)
-    {
-      printf ("could not find %s: %s\n", "foo", dlerror ());
-      return 1;
-    }
-
-  if (fct (ns) != 0)
-    return 1;
-
-  if (dlclose (h) != 0)
-    {
-      printf ("dlclose for %s in %s failed: %s\n",
-	      TEST_SO, __func__, dlerror ());
-      return 1;
-    }
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-dlmopen1mod.c b/elf/tst-dlmopen1mod.c
deleted file mode 100644
index 142488098a..0000000000
--- a/elf/tst-dlmopen1mod.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <gnu/lib-names.h>
-
-
-static int cnt;
-
-static void
-__attribute ((constructor))
-constr (void)
-{
-  ++cnt;
-}
-
-
-int
-foo (Lmid_t ns2)
-{
-  void *h = dlopen (LIBC_SO, RTLD_LAZY|RTLD_NOLOAD);
-  if (h == NULL)
-    {
-      printf ("cannot get handle for %s: %s\n", LIBC_SO, dlerror ());
-      return 1;
-    }
-
-  Lmid_t ns = -10;
-  if (dlinfo (h, RTLD_DI_LMID, &ns) != 0)
-    {
-      printf ("dlinfo for %s in %s failed: %s\n",
-	      LIBC_SO, __func__, dlerror ());
-      return 1;
-    }
-
-  if (ns != ns2)
-    {
-      printf ("namespace for %s not LM_ID_BASE\n", LIBC_SO);
-      return 1;
-    }
-
-  if (dlclose (h) != 0)
-    {
-      printf ("dlclose for %s in %s failed: %s\n",
-	      LIBC_SO, __func__, dlerror ());
-      return 1;
-    }
-
-  if (cnt == 0)
-    {
-      puts ("constructor did not run");
-      return 1;
-    }
-  else if (cnt != 1)
-    {
-      puts ("constructor did not run exactly once");
-      return 1;
-    }
-
-  return 0;
-}
diff --git a/elf/tst-dlmopen2.c b/elf/tst-dlmopen2.c
deleted file mode 100644
index 8489ffba08..0000000000
--- a/elf/tst-dlmopen2.c
+++ /dev/null
@@ -1,69 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <string.h>
-#include <gnu/lib-names.h>
-#include <ldsodefs.h>
-
-
-static int
-do_test (void)
-{
-  int result = 0;
-
-  for (int i = 1; i <= 10; ++i)
-    {
-      void *h[DL_NNS - 1];
-      char used[DL_NNS];
-
-      printf ("round %d\n", i);
-
-      memset (used, '\0', sizeof (used));
-      used[LM_ID_BASE] = 1;
-
-      for (int j = 0; j < DL_NNS - 1; ++j)
-	{
-	  h[j] = dlmopen (LM_ID_NEWLM, "$ORIGIN/tst-dlmopen1mod.so",
-			  RTLD_LAZY);
-	  if (h[j] == NULL)
-	    {
-	      printf ("round %d, namespace %d: load failed: %s\n",
-		      i, j, dlerror ());
-	      return 1;
-	    }
-	  Lmid_t ns;
-	  if (dlinfo (h[j], RTLD_DI_LMID, &ns) != 0)
-	    {
-	      printf ("round %d, namespace %d: dlinfo failed: %s\n",
-		      i, j, dlerror ());
-	      return 1;
-	    }
-	  if (ns < 0 || ns >= DL_NNS)
-	    {
-	      printf ("round %d, namespace %d: invalid namespace %ld",
-		      i, j, (long int) ns);
-	      result = 1;
-	    }
-	  else if (used[ns] != 0)
-	    {
-	      printf ("\
-round %d, namespace %d: duplicate allocate of namespace %ld",
-		      i, j, (long int) ns);
-	      result = 1;
-	    }
-	  else
-	    used[ns] = 1;
-	}
-
-      for (int j = 0; j < DL_NNS - 1; ++j)
-	if (dlclose (h[j]) != 0)
-	  {
-	    printf ("round %d, namespace %d: close failed: %s\n",
-		    i, j, dlerror ());
-	    return 1;
-	  }
-    }
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-dlmopen3.c b/elf/tst-dlmopen3.c
deleted file mode 100644
index 8167507784..0000000000
--- a/elf/tst-dlmopen3.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-
-static int
-do_test (void)
-{
-  void *h = dlmopen (LM_ID_NEWLM, "$ORIGIN/tst-dlmopen1mod.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("cannot get handle for %s: %s\n",
-	      "tst-dlmopen1mod.so", dlerror ());
-      return 1;
-    }
-
-  /* Do not unload.  */
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-dlopen-aout.c b/elf/tst-dlopen-aout.c
deleted file mode 100644
index cccc508966..0000000000
--- a/elf/tst-dlopen-aout.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Test case for BZ #16634.
-
-   Verify that incorrectly dlopen()ing an executable without
-   __RTLD_OPENEXEC does not cause assertion in ld.so.
-
-   Copyright (C) 2014-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.
-
-   Note: this test currently only fails when glibc is configured with
-   --enable-hardcoded-path-in-tests.  */
-
-#include <assert.h>
-#include <dlfcn.h>
-#include <stdio.h>
-#include <pthread.h>
-
-__thread int x;
-
-void *
-fn (void *p)
-{
-  return p;
-}
-
-static int
-do_test (int argc, char *argv[])
-{
-  int j;
-
-  for (j = 0; j < 100; ++j)
-    {
-      pthread_t thr;
-      void *p;
-      int rc;
-
-      p = dlopen (argv[0], RTLD_LAZY);
-      if (p != NULL)
-        {
-          fprintf (stderr, "dlopen unexpectedly succeeded\n");
-          return 1;
-        }
-      rc = pthread_create (&thr, NULL, fn, NULL);
-      assert (rc == 0);
-
-      rc = pthread_join (thr, NULL);
-      assert (rc == 0);
-    }
-
-  return 0;
-}
-
-#define TEST_FUNCTION_ARGV do_test
-#include <support/test-driver.c>
diff --git a/elf/tst-dlopenrpath.c b/elf/tst-dlopenrpath.c
deleted file mode 100644
index 77346d36f9..0000000000
--- a/elf/tst-dlopenrpath.c
+++ /dev/null
@@ -1,70 +0,0 @@
-/* Copyright (C) 2004-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
-
-extern int foo (void);
-
-static const char testsubdir[] = PFX "test-subdir";
-
-
-static int
-do_test (void)
-{
-  struct stat64 st;
-  int result = 1;
-
-  if (mkdir (testsubdir, 0777) != 0
-      && (errno != EEXIST
-	  || stat64 (testsubdir, &st) != 0
-	  || !S_ISDIR (st.st_mode)))
-    {
-      printf ("cannot create directory %s\n", testsubdir);
-      return 1;
-    }
-
-  if (system ("cp " PFX "firstobj.so " PFX "test-subdir/in-subdir.so") != 0)
-    {
-      puts ("cannot copy DSO");
-      return 1;
-    }
-
-  void *p = dlopen ("in-subdir.so", RTLD_LAZY|RTLD_LOCAL);
-  if (p != NULL)
-    {
-      puts ("succeeded in opening in-subdir.so from do_test");
-      dlclose (p);
-      goto out;
-    }
-
-  result = foo ();
-
- out:
-  unlink (PFX "test-subdir/in-subdir.so");
-  rmdir (testsubdir);
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-dlopenrpathmod.c b/elf/tst-dlopenrpathmod.c
deleted file mode 100644
index 6d244401bf..0000000000
--- a/elf/tst-dlopenrpathmod.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright (C) 2004-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <stdio.h>
-
-
-int
-foo (void)
-{
-  void *p = dlopen ("in-subdir.so", RTLD_LAZY|RTLD_LOCAL);
-  if (p != NULL)
-    {
-      dlclose (p);
-      return 0;
-    }
-
-  puts ("couldn't open in-subdir.so from foo");
-  return 1;
-}
diff --git a/elf/tst-dlsym-error.c b/elf/tst-dlsym-error.c
deleted file mode 100644
index fac8f10ccf..0000000000
--- a/elf/tst-dlsym-error.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Test error reporting for dlsym, dlvsym failures.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <gnu/lib-names.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* Used to disambiguate symbol names.  */
-static int counter;
-
-static void
-test_one (void *handle, const char *name, void *(func) (void *, const char *),
-          const char *suffix)
-{
-  ++counter;
-  char symbol[32];
-  snprintf (symbol, sizeof (symbol), "no_such_symbol_%d", counter);
-  char *expected_message;
-  if (asprintf (&expected_message, ": undefined symbol: %s%s",
-                symbol, suffix) < 0)
-    {
-      printf ("error: asprintf: %m\n");
-      abort ();
-    }
-
-  void *addr = func (handle, symbol);
-  if (addr != NULL)
-    {
-      printf ("error: %s: found symbol \"no_such_symbol\"\n", name);
-      abort ();
-    }
-  const char *message = dlerror ();
-  if (message == NULL)
-    {
-      printf ("error: %s: missing error message\n", name);
-      abort ();
-    }
-  const char *message_without_path = strchrnul (message, ':');
-  if (strcmp (message_without_path, expected_message) != 0)
-    {
-      printf ("error: %s: unexpected error message: %s\n", name, message);
-      abort ();
-    }
-  free (expected_message);
-
-  message = dlerror ();
-  if (message != NULL)
-    {
-      printf ("error: %s: unexpected error message: %s\n", name, message);
-      abort ();
-    }
-}
-
-static void
-test_handles (const char *name, void *(func) (void *, const char *),
-              const char *suffix)
-{
-  test_one (RTLD_DEFAULT, name, func, suffix);
-  test_one (RTLD_NEXT, name, func, suffix);
-
-  void *handle = dlopen (LIBC_SO, RTLD_LAZY);
-  if (handle == NULL)
-    {
-      printf ("error: cannot dlopen %s: %s\n", LIBC_SO, dlerror ());
-      abort ();
-    }
-  test_one (handle, name, func, suffix);
-  dlclose (handle);
-}
-
-static void *
-dlvsym_no_such_version (void *handle, const char *name)
-{
-  return dlvsym (handle, name, "NO_SUCH_VERSION");
-}
-
-static void *
-dlvsym_glibc_private (void *handle, const char *name)
-{
-  return dlvsym (handle, name, "GLIBC_PRIVATE");
-}
-
-static int
-do_test (void)
-{
-  test_handles ("dlsym", dlsym, "");
-  test_handles ("dlvsym", dlvsym_no_such_version,
-                ", version NO_SUCH_VERSION");
-  test_handles ("dlvsym", dlvsym_glibc_private,
-                ", version GLIBC_PRIVATE");
-
-  return 0;
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-env-setuid-tunables.c b/elf/tst-env-setuid-tunables.c
deleted file mode 100644
index afcb146e6d..0000000000
--- a/elf/tst-env-setuid-tunables.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Copyright (C) 2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* Verify that tunables correctly filter out unsafe tunables like
-   glibc.malloc.check and glibc.malloc.mmap_threshold but also retain
-   glibc.malloc.mmap_threshold in an unprivileged child.  */
-
-/* This is compiled as part of the testsuite but needs to see
-   HAVE_TUNABLES. */
-#define _LIBC 1
-#include "config.h"
-#undef _LIBC
-
-#define test_parent test_parent_tunables
-#define test_child test_child_tunables
-
-static int test_child_tunables (void);
-static int test_parent_tunables (void);
-
-#include "tst-env-setuid.c"
-
-#define CHILD_VALSTRING_VALUE "glibc.malloc.mmap_threshold=4096"
-#define PARENT_VALSTRING_VALUE \
-  "glibc.malloc.check=2:glibc.malloc.mmap_threshold=4096"
-
-static int
-test_child_tunables (void)
-{
-  const char *val = getenv ("GLIBC_TUNABLES");
-
-#if HAVE_TUNABLES
-  if (val != NULL && strcmp (val, CHILD_VALSTRING_VALUE) == 0)
-    return 0;
-
-  if (val != NULL)
-    printf ("Unexpected GLIBC_TUNABLES VALUE %s\n", val);
-
-  return 1;
-#else
-  if (val != NULL)
-    {
-      printf ("GLIBC_TUNABLES not cleared\n");
-      return 1;
-    }
-  return 0;
-#endif
-}
-
-static int
-test_parent_tunables (void)
-{
-  const char *val = getenv ("GLIBC_TUNABLES");
-
-  if (val != NULL && strcmp (val, PARENT_VALSTRING_VALUE) == 0)
-    return 0;
-
-  if (val != NULL)
-    printf ("Unexpected GLIBC_TUNABLES VALUE %s\n", val);
-
-  return 1;
-}
diff --git a/elf/tst-env-setuid.c b/elf/tst-env-setuid.c
deleted file mode 100644
index eec408eb5d..0000000000
--- a/elf/tst-env-setuid.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/* Copyright (C) 2012-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* Verify that tunables correctly filter out unsafe environment variables like
-   MALLOC_CHECK_ and MALLOC_MMAP_THRESHOLD_ but also retain
-   MALLOC_MMAP_THRESHOLD_ in an unprivileged child.  */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-#include <support/support.h>
-#include <support/test-driver.h>
-
-static char SETGID_CHILD[] = "setgid-child";
-#define CHILD_STATUS 42
-
-/* Return a GID which is not our current GID, but is present in the
-   supplementary group list.  */
-static gid_t
-choose_gid (void)
-{
-  const int count = 64;
-  gid_t groups[count];
-  int ret = getgroups (count, groups);
-  if (ret < 0)
-    {
-      printf ("getgroups: %m\n");
-      exit (1);
-    }
-  gid_t current = getgid ();
-  for (int i = 0; i < ret; ++i)
-    {
-      if (groups[i] != current)
-	return groups[i];
-    }
-  return 0;
-}
-
-/* Spawn and execute a program and verify that it returns the CHILD_STATUS.  */
-static pid_t
-do_execve (char **args)
-{
-  pid_t kid = vfork ();
-
-  if (kid < 0)
-    {
-      printf ("vfork: %m\n");
-      return -1;
-    }
-
-  if (kid == 0)
-    {
-      /* Child process.  */
-      execve (args[0], args, environ);
-      _exit (-errno);
-    }
-
-  if (kid < 0)
-    return 1;
-
-  int status;
-
-  if (waitpid (kid, &status, 0) < 0)
-    {
-      printf ("waitpid: %m\n");
-      return 1;
-    }
-
-  if (WEXITSTATUS (status) == EXIT_UNSUPPORTED)
-    return EXIT_UNSUPPORTED;
-
-  if (!WIFEXITED (status) || WEXITSTATUS (status) != CHILD_STATUS)
-    {
-      printf ("Unexpected exit status %d from child process\n",
-	      WEXITSTATUS (status));
-      return 1;
-    }
-  return 0;
-}
-
-/* Copies the executable into a restricted directory, so that we can
-   safely make it SGID with the TARGET group ID.  Then runs the
-   executable.  */
-static int
-run_executable_sgid (gid_t target)
-{
-  char *dirname = xasprintf ("%s/tst-tunables-setuid.%jd",
-			     test_dir, (intmax_t) getpid ());
-  char *execname = xasprintf ("%s/bin", dirname);
-  int infd = -1;
-  int outfd = -1;
-  int ret = 0;
-  if (mkdir (dirname, 0700) < 0)
-    {
-      printf ("mkdir: %m\n");
-      goto err;
-    }
-  infd = open ("/proc/self/exe", O_RDONLY);
-  if (infd < 0)
-    {
-      printf ("open (/proc/self/exe): %m\n");
-      goto err;
-    }
-  outfd = open (execname, O_WRONLY | O_CREAT | O_EXCL, 0700);
-  if (outfd < 0)
-    {
-      printf ("open (%s): %m\n", execname);
-      goto err;
-    }
-  char buf[4096];
-  for (;;)
-    {
-      ssize_t rdcount = read (infd, buf, sizeof (buf));
-      if (rdcount < 0)
-	{
-	  printf ("read: %m\n");
-	  goto err;
-	}
-      if (rdcount == 0)
-	break;
-      char *p = buf;
-      char *end = buf + rdcount;
-      while (p != end)
-	{
-	  ssize_t wrcount = write (outfd, buf, end - p);
-	  if (wrcount == 0)
-	    errno = ENOSPC;
-	  if (wrcount <= 0)
-	    {
-	      printf ("write: %m\n");
-	      goto err;
-	    }
-	  p += wrcount;
-	}
-    }
-  if (fchown (outfd, getuid (), target) < 0)
-    {
-      printf ("fchown (%s): %m\n", execname);
-      goto err;
-    }
-  if (fchmod (outfd, 02750) < 0)
-    {
-      printf ("fchmod (%s): %m\n", execname);
-      goto err;
-    }
-  if (close (outfd) < 0)
-    {
-      printf ("close (outfd): %m\n");
-      goto err;
-    }
-  if (close (infd) < 0)
-    {
-      printf ("close (infd): %m\n");
-      goto err;
-    }
-
-  char *args[] = {execname, SETGID_CHILD, NULL};
-
-  ret = do_execve (args);
-
-err:
-  if (outfd >= 0)
-    close (outfd);
-  if (infd >= 0)
-    close (infd);
-  if (execname)
-    {
-      unlink (execname);
-      free (execname);
-    }
-  if (dirname)
-    {
-      rmdir (dirname);
-      free (dirname);
-    }
-  return ret;
-}
-
-#ifndef test_child
-static int
-test_child (void)
-{
-  if (getenv ("MALLOC_CHECK_") != NULL)
-    {
-      printf ("MALLOC_CHECK_ is still set\n");
-      return 1;
-    }
-
-  if (getenv ("MALLOC_MMAP_THRESHOLD_") == NULL)
-    {
-      printf ("MALLOC_MMAP_THRESHOLD_ lost\n");
-      return 1;
-    }
-
-  if (getenv ("LD_HWCAP_MASK") != NULL)
-    {
-      printf ("LD_HWCAP_MASK still set\n");
-      return 1;
-    }
-
-  return 0;
-}
-#endif
-
-#ifndef test_parent
-static int
-test_parent (void)
-{
-  if (getenv ("MALLOC_CHECK_") == NULL)
-    {
-      printf ("MALLOC_CHECK_ lost\n");
-      return 1;
-    }
-
-  if (getenv ("MALLOC_MMAP_THRESHOLD_") == NULL)
-    {
-      printf ("MALLOC_MMAP_THRESHOLD_ lost\n");
-      return 1;
-    }
-
-  if (getenv ("LD_HWCAP_MASK") == NULL)
-    {
-      printf ("LD_HWCAP_MASK lost\n");
-      return 1;
-    }
-
-  return 0;
-}
-#endif
-
-static int
-do_test (int argc, char **argv)
-{
-  /* Setgid child process.  */
-  if (argc == 2 && strcmp (argv[1], SETGID_CHILD) == 0)
-    {
-      if (getgid () == getegid ())
-	{
-	  /* This can happen if the file system is mounted nosuid.  */
-	  fprintf (stderr, "SGID failed: GID and EGID match (%jd)\n",
-		   (intmax_t) getgid ());
-	  exit (EXIT_UNSUPPORTED);
-	}
-
-      int ret = test_child ();
-
-      if (ret != 0)
-	exit (1);
-
-      exit (CHILD_STATUS);
-    }
-  else
-    {
-      if (test_parent () != 0)
-	exit (1);
-
-      /* Try running a setgid program.  */
-      gid_t target = choose_gid ();
-      if (target == 0)
-	{
-	  fprintf (stderr,
-		   "Could not find a suitable GID for user %jd, skipping test\n",
-		   (intmax_t) getuid ());
-	  exit (0);
-	}
-
-      return run_executable_sgid (target);
-    }
-
-  /* Something went wrong and our argv was corrupted.  */
-  _exit (1);
-}
-
-#define TEST_FUNCTION_ARGV do_test
-#include <support/test-driver.c>
diff --git a/elf/tst-execstack-mod.c b/elf/tst-execstack-mod.c
deleted file mode 100644
index 038e6550b5..0000000000
--- a/elf/tst-execstack-mod.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Test module for making nonexecutable stacks executable
-   on load of a DSO that requires executable stacks.  */
-
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-void callme (void (*callback) (void));
-
-/* This is a function that makes use of executable stack by
-   using a local function trampoline.  */
-void
-tryme (void)
-{
-  bool ok = false;
-  void callback (void) { ok = true; }
-
-  callme (&callback);
-
-  if (ok)
-    printf ("DSO called ok (local %p, trampoline %p)\n", &ok, &callback);
-  else
-    abort ();
-}
-
-void
-callme (void (*callback) (void))
-{
-  (*callback) ();
-}
diff --git a/elf/tst-execstack-needed.c b/elf/tst-execstack-needed.c
deleted file mode 100644
index 8b794a3d47..0000000000
--- a/elf/tst-execstack-needed.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Test program for making nonexecutable stacks executable
-   on DT_NEEDED load of a DSO that requires executable stacks.  */
-
-#include <dlfcn.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <error.h>
-
-extern void tryme (void);	/* from tst-execstack-mod.so */
-
-static void deeper (void (*f) (void));
-
-static int
-do_test (void)
-{
-  tryme ();
-
-  /* Test that growing the stack region gets new executable pages too.  */
-  deeper (&tryme);
-
-  return 0;
-}
-
-static void
-deeper (void (*f) (void))
-{
-  char stack[1100 * 1024];
-  memfrob (stack, sizeof stack);
-  (*f) ();
-  memfrob (stack, sizeof stack);
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-execstack-prog.c b/elf/tst-execstack-prog.c
deleted file mode 100644
index 8663153372..0000000000
--- a/elf/tst-execstack-prog.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Test program for executable stacks in an executable itself.  */
-
-#include <dlfcn.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <error.h>
-
-#include "tst-execstack-mod.c"	/* This defines the `tryme' test function.  */
-
-static void deeper (void (*f) (void));
-
-static int
-do_test (void)
-{
-  tryme ();
-
-  /* Test that growing the stack region gets new executable pages too.  */
-  deeper (&tryme);
-
-  return 0;
-}
-
-static void
-deeper (void (*f) (void))
-{
-  char stack[1100 * 1024];
-  memfrob (stack, sizeof stack);
-  (*f) ();
-  memfrob (stack, sizeof stack);
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-execstack.c b/elf/tst-execstack.c
deleted file mode 100644
index 114f341d76..0000000000
--- a/elf/tst-execstack.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/* Test program for making nonexecutable stacks executable
-   on load of a DSO that requires executable stacks.  */
-
-#include <dlfcn.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <error.h>
-#include <stackinfo.h>
-
-static void
-print_maps (void)
-{
-#if 0
-  char *cmd = NULL;
-  asprintf (&cmd, "cat /proc/%d/maps", getpid ());
-  system (cmd);
-  free (cmd);
-#endif
-}
-
-static void deeper (void (*f) (void));
-
-#if USE_PTHREADS
-# include <pthread.h>
-
-static void *
-tryme_thread (void *f)
-{
-  (*((void (*) (void)) f)) ();
-
-  return 0;
-}
-
-static pthread_barrier_t startup_barrier, go_barrier;
-static void *
-waiter_thread (void *arg)
-{
-  void **f = arg;
-  pthread_barrier_wait (&startup_barrier);
-  pthread_barrier_wait (&go_barrier);
-
-  (*((void (*) (void)) *f)) ();
-
-  return 0;
-}
-#endif
-
-static bool allow_execstack = true;
-
-
-static int
-do_test (void)
-{
-  /* Check whether SELinux is enabled and disallows executable stacks.  */
-  FILE *fp = fopen ("/selinux/enforce", "r");
-  if (fp != NULL)
-    {
-      char *line = NULL;
-      size_t linelen = 0;
-
-      bool enabled = false;
-      ssize_t n = getline (&line, &linelen, fp);
-      if (n > 0 && line[0] != '0')
-	enabled = true;
-
-      fclose (fp);
-
-      if (enabled)
-	{
-	  fp = fopen ("/selinux/booleans/allow_execstack", "r");
-	  if (fp != NULL)
-	    {
-	      n = getline (&line, &linelen, fp);
-	      if (n > 0 && line[0] == '0')
-		allow_execstack = false;
-	    }
-
-	  fclose (fp);
-	}
-    }
-
-  printf ("executable stacks %sallowed\n", allow_execstack ? "" : "not ");
-
-  static void *f;		/* Address of this is used in other threads. */
-
-#if USE_PTHREADS
-  /* Create some threads while stacks are nonexecutable.  */
-  #define N 5
-  pthread_t thr[N];
-
-  pthread_barrier_init (&startup_barrier, NULL, N + 1);
-  pthread_barrier_init (&go_barrier, NULL, N + 1);
-
-  for (int i = 0; i < N; ++i)
-    {
-      int rc = pthread_create (&thr[i], NULL, &waiter_thread, &f);
-      if (rc)
-	error (1, rc, "pthread_create");
-    }
-
-  /* Make sure they are all there using their stacks.  */
-  pthread_barrier_wait (&startup_barrier);
-  puts ("threads waiting");
-#endif
-
-  print_maps ();
-
-#if USE_PTHREADS
-  void *old_stack_addr, *new_stack_addr;
-  size_t stack_size;
-  pthread_t me = pthread_self ();
-  pthread_attr_t attr;
-  int ret = 0;
-
-  ret = pthread_getattr_np (me, &attr);
-  if (ret)
-    {
-      printf ("before execstack: pthread_getattr_np returned error: %s\n",
-	      strerror (ret));
-      return 1;
-    }
-
-  ret = pthread_attr_getstack (&attr, &old_stack_addr, &stack_size);
-  if (ret)
-    {
-      printf ("before execstack: pthread_attr_getstack returned error: %s\n",
-	      strerror (ret));
-      return 1;
-    }
-# if _STACK_GROWS_DOWN
-    old_stack_addr += stack_size;
-# else
-    old_stack_addr -= stack_size;
-# endif
-#endif
-
-  /* Loading this module should force stacks to become executable.  */
-  void *h = dlopen ("tst-execstack-mod.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("cannot load: %s\n", dlerror ());
-      return allow_execstack;
-    }
-
-  f = dlsym (h, "tryme");
-  if (f == NULL)
-    {
-      printf ("symbol not found: %s\n", dlerror ());
-      return 1;
-    }
-
-  /* Test if that really made our stack executable.
-     The `tryme' function should crash if not.  */
-
-  (*((void (*) (void)) f)) ();
-
-  print_maps ();
-
-#if USE_PTHREADS
-  ret = pthread_getattr_np (me, &attr);
-  if (ret)
-    {
-      printf ("after execstack: pthread_getattr_np returned error: %s\n",
-	      strerror (ret));
-      return 1;
-    }
-
-  ret = pthread_attr_getstack (&attr, &new_stack_addr, &stack_size);
-  if (ret)
-    {
-      printf ("after execstack: pthread_attr_getstack returned error: %s\n",
-	      strerror (ret));
-      return 1;
-    }
-
-# if _STACK_GROWS_DOWN
-    new_stack_addr += stack_size;
-# else
-    new_stack_addr -= stack_size;
-# endif
-
-  /* It is possible that the dlopen'd module may have been mmapped just below
-     the stack.  The stack size is taken as MIN(stack rlimit size, end of last
-     vma) in pthread_getattr_np.  If rlimit is set high enough, it is possible
-     that the size may have changed.  A subsequent call to
-     pthread_attr_getstack returns the size and (bottom - size) as the
-     stacksize and stackaddr respectively.  If the size changes due to the
-     above, then both stacksize and stackaddr can change, but the stack bottom
-     should remain the same, which is computed as stackaddr + stacksize.  */
-  if (old_stack_addr != new_stack_addr)
-    {
-      printf ("Stack end changed, old: %p, new: %p\n",
-	      old_stack_addr, new_stack_addr);
-      return 1;
-    }
-  printf ("Stack address remains the same: %p\n", old_stack_addr);
-#endif
-
-  /* Test that growing the stack region gets new executable pages too.  */
-  deeper ((void (*) (void)) f);
-
-  print_maps ();
-
-#if USE_PTHREADS
-  /* Test that a fresh thread now gets an executable stack.  */
-  {
-    pthread_t th;
-    int rc = pthread_create (&th, NULL, &tryme_thread, f);
-    if (rc)
-      error (1, rc, "pthread_create");
-  }
-
-  puts ("threads go");
-  /* The existing threads' stacks should have been changed.
-     Let them run to test it.  */
-  pthread_barrier_wait (&go_barrier);
-
-  pthread_exit ((void *) (long int) (! allow_execstack));
-#endif
-
-  return ! allow_execstack;
-}
-
-static void
-deeper (void (*f) (void))
-{
-  char stack[1100 * 1024];
-  memfrob (stack, sizeof stack);
-  (*f) ();
-  memfrob (stack, sizeof stack);
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-global1.c b/elf/tst-global1.c
deleted file mode 100644
index 5dae74eec0..0000000000
--- a/elf/tst-global1.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-static int
-do_test (void)
-{
-  void *h1 = dlopen ("$ORIGIN/testobj6.so", RTLD_GLOBAL|RTLD_LAZY);
-  if (h1 == NULL)
-    {
-      puts ("cannot open testobj6");
-      return 1;
-    }
-
-  void *h2 = dlopen ("$ORIGIN/testobj2.so",
-		     RTLD_GLOBAL|RTLD_DEEPBIND|RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      puts ("cannot open testobj2");
-      return 1;
-    }
-
-  dlclose (h1);
-
-  void (*f) (void) = dlsym (h2, "p");
-  if (f == NULL)
-    {
-      puts ("cannot find p");
-      return 1;
-    }
-
-  f ();
-
-  dlclose (h2);
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-gnu2-tls1.c b/elf/tst-gnu2-tls1.c
deleted file mode 100644
index b33b60a301..0000000000
--- a/elf/tst-gnu2-tls1.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Test local and global dynamic models for GNU2 TLS.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-extern int * get_gd (void);
-extern void set_gd (int);
-extern int test_gd (int);
-extern int * get_ld (void);
-extern void set_ld (int);
-extern int test_ld (int);
-
-__thread int gd = 1;
-
-static int
-do_test (void)
-{
-  int *p;
-
-  p = get_gd ();
-  set_gd (3);
-  if (*p != 3 || !test_gd (3))
-    abort ();
-
-  p = get_ld ();
-  set_ld (4);
-  if (*p != 4 || !test_ld (4))
-    abort ();
-
-  printf ("PASS\n");
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-gnu2-tls1mod.c b/elf/tst-gnu2-tls1mod.c
deleted file mode 100644
index fa76ab1222..0000000000
--- a/elf/tst-gnu2-tls1mod.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* DSO used by tst-gnu2-tls1.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-static __thread int ld;
-
-int *
-get_ld (void)
-{
-  return &ld;
-}
-
-void
-set_ld (int i)
-{
-  ld = i;
-}
-
-int
-test_ld (int i)
-{
-  return ld == i;
-}
-extern __thread int gd;
-
-int *
-get_gd (void)
-{
-  return &gd;
-}
-
-void
-set_gd (int i)
-{
-  gd = i;
-}
-
-int
-test_gd (int i)
-{
-  return gd == i;
-}
diff --git a/elf/tst-initorder.c b/elf/tst-initorder.c
deleted file mode 100644
index 9638382104..0000000000
--- a/elf/tst-initorder.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <stdio.h>
-
-int
-main( int argc, char *argv[] )
-{
-  printf( "main\n" );
-}
diff --git a/elf/tst-initorder.exp b/elf/tst-initorder.exp
deleted file mode 100644
index 8718f65765..0000000000
--- a/elf/tst-initorder.exp
+++ /dev/null
@@ -1,13 +0,0 @@
-start_a1
-start_a2
-start_b1
-start_b2
-start_a3
-start_a4
-main
-finish_a4
-finish_a3
-finish_b2
-finish_b1
-finish_a2
-finish_a1
diff --git a/elf/tst-initorder2.c b/elf/tst-initorder2.c
deleted file mode 100644
index 050f9568b8..0000000000
--- a/elf/tst-initorder2.c
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <stdio.h>
-
-#ifndef NAME
-int
-main (void)
-{
-  puts ("main");
-}
-#else
-static void __attribute__ ((constructor))
-init (void)
-{
-  puts ("init: " NAME);
-}
-static void __attribute__ ((destructor))
-fini (void)
-{
-  puts ("fini: " NAME);
-}
-#endif
diff --git a/elf/tst-initorder2.exp b/elf/tst-initorder2.exp
deleted file mode 100644
index 5169489b85..0000000000
--- a/elf/tst-initorder2.exp
+++ /dev/null
@@ -1,9 +0,0 @@
-init: d
-init: c
-init: b
-init: a
-main
-fini: a
-fini: b
-fini: c
-fini: d
diff --git a/elf/tst-initordera1.c b/elf/tst-initordera1.c
deleted file mode 100644
index f161257142..0000000000
--- a/elf/tst-initordera1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_a1( void ) __attribute__((constructor));
-extern void finish_a1( void ) __attribute__((destructor));
-
-void
-start_a1( void )
-{
-  printf( "start_a1\n" );
-}
-
-void
-finish_a1( void )
-{
-  printf( "finish_a1\n" );
-}
diff --git a/elf/tst-initordera2.c b/elf/tst-initordera2.c
deleted file mode 100644
index a5a9b42ff6..0000000000
--- a/elf/tst-initordera2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_a2( void ) __attribute__((constructor));
-extern void finish_a2( void ) __attribute__((destructor));
-
-void
-start_a2( void )
-{
-  printf( "start_a2\n" );
-}
-
-void
-finish_a2( void )
-{
-  printf( "finish_a2\n" );
-}
diff --git a/elf/tst-initordera3.c b/elf/tst-initordera3.c
deleted file mode 100644
index 1c7f496e9a..0000000000
--- a/elf/tst-initordera3.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_a3( void ) __attribute__((constructor));
-extern void finish_a3( void ) __attribute__((destructor));
-
-void
-start_a3( void )
-{
-  printf( "start_a3\n" );
-}
-
-void
-finish_a3( void )
-{
-  printf( "finish_a3\n" );
-}
diff --git a/elf/tst-initordera4.c b/elf/tst-initordera4.c
deleted file mode 100644
index 70b9f5e392..0000000000
--- a/elf/tst-initordera4.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_a4( void ) __attribute__((constructor));
-extern void finish_a4( void ) __attribute__((destructor));
-
-void
-start_a4( void )
-{
-  printf( "start_a4\n" );
-}
-
-void
-finish_a4( void )
-{
-  printf( "finish_a4\n" );
-}
diff --git a/elf/tst-initorderb1.c b/elf/tst-initorderb1.c
deleted file mode 100644
index 993ea3fe30..0000000000
--- a/elf/tst-initorderb1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_b1( void ) __attribute__((constructor));
-extern void finish_b1( void ) __attribute__((destructor));
-
-void
-start_b1( void )
-{
-  printf( "start_b1\n" );
-}
-
-void
-finish_b1( void )
-{
-  printf( "finish_b1\n" );
-}
diff --git a/elf/tst-initorderb2.c b/elf/tst-initorderb2.c
deleted file mode 100644
index 3334dda0a9..0000000000
--- a/elf/tst-initorderb2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_b2( void ) __attribute__((constructor));
-extern void finish_b2( void ) __attribute__((destructor));
-
-void
-start_b2( void )
-{
-  printf( "start_b2\n" );
-}
-
-void
-finish_b2( void )
-{
-  printf( "finish_b2\n" );
-}
diff --git a/elf/tst-latepthread.c b/elf/tst-latepthread.c
deleted file mode 100644
index ca2f82243d..0000000000
--- a/elf/tst-latepthread.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/* Test that loading libpthread does not break ld.so exceptions (bug 16628).
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <signal.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-static int
-do_test (void)
-{
-  void *handle = dlopen ("tst-latepthreadmod.so", RTLD_LOCAL | RTLD_LAZY);
-  if (handle == NULL)
-    {
-      printf ("error: dlopen failed: %s\n", dlerror ());
-      return 1;
-    }
-  void *ptr = dlsym (handle, "trigger_dynlink_failure");
-  if (ptr == NULL)
-    {
-      printf ("error: dlsym failed: %s\n", dlerror ());
-      return 1;
-    }
-  int (*func) (void) = ptr;
-
-  /* Run the actual test in a subprocess, to capture the error.  */
-  int fds[2];
-  if (pipe (fds) < 0)
-    {
-      printf ("error: pipe: %m\n");
-      return 1;
-    }
-  pid_t pid = fork ();
-  if (pid < 0)
-    {
-      printf ("error: fork: %m\n");
-      return 1;
-    }
-  else if (pid == 0)
-    {
-      if (dup2 (fds[1], STDERR_FILENO) < 0)
-        _exit (2);
-      /* Trigger an abort.  */
-      func ();
-      _exit (3);
-    }
-  /* NB: This assumes that the abort message is so short that the pipe
-     does not block.  */
-  int status;
-  if (waitpid (pid, &status, 0) < 0)
-    {
-      printf ("error: waitpid: %m\n");
-      return 1;
-    }
-
-  /* Check the printed error message.  */
-  if (close (fds[1]) < 0)
-   {
-     printf ("error: close: %m\n");
-     return 1;
-   }
-  char buf[512];
-  /* Leave room for the NUL terminator.  */
-  ssize_t ret = read (fds[0], buf, sizeof (buf) - 1);
-  if (ret < 0)
-    {
-      printf ("error: read: %m\n");
-      return 1;
-    }
-  if (ret > 0 && buf[ret - 1] == '\n')
-    --ret;
-  buf[ret] = '\0';
-  printf ("info: exit status: %d, message: %s\n", status, buf);
-  if (strstr (buf, "undefined symbol: this_function_is_not_defined") == NULL)
-    {
-      printf ("error: message does not contain expected string\n");
-      return 1;
-    }
-  if (!WIFEXITED (status) || WEXITSTATUS (status) != 127)
-    {
-      printf ("error: unexpected process exit status\n");
-      return 1;
-    }
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-latepthreadmod.c b/elf/tst-latepthreadmod.c
deleted file mode 100644
index 35a82d388b..0000000000
--- a/elf/tst-latepthreadmod.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* DSO which links against libpthread and triggers a lazy binding.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This file is compiled into a DSO which loads libpthread, but fails
-   the dynamic linker afterwards.  */
-
-#include <pthread.h>
-
-/* Link in libpthread.  */
-void *pthread_create_ptr = &pthread_create;
-
-int this_function_is_not_defined (void);
-
-int
-trigger_dynlink_failure (void)
-{
-  return this_function_is_not_defined ();
-}
diff --git a/elf/tst-ldconfig-X.sh b/elf/tst-ldconfig-X.sh
deleted file mode 100644
index e97ca89946..0000000000
--- a/elf/tst-ldconfig-X.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/sh
-# Test that ldconfig -X does not remove stale symbolic links.
-# Copyright (C) 2000-2017 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, see
-# <http://www.gnu.org/licenses/>.
-
-set -ex
-
-common_objpfx=$1
-test_wrapper_env=$2
-run_program_env=$3
-
-testroot="${common_objpfx}elf/bug19610-test-directory"
-cleanup () {
-    rm -rf "$testroot"
-}
-trap cleanup 0
-
-rm -rf "$testroot"
-mkdir -p $testroot/lib $testroot/etc
-
-# Relative symbolic link target.
-ln -s libdoesnotexist.so.1.1 $testroot/lib/libdoesnotexist.so.1
-
-# Absolute symbolic link target.
-ln -s $testroot/opt/sw/lib/libdoesnotexist2.so.1.1 $testroot/lib/
-
-errors=0
-check_files () {
-    for name in libdoesnotexist.so.1 libdoesnotexist2.so.1.1 ; do
-	path="$testroot/lib/$name"
-	if test ! -h $path ; then
-	    echo "error: missing file: $path"
-	    errors=1
-	fi
-    done
-}
-
-check_files
-
-${test_wrapper_env} \
-${run_program_env} \
-${common_objpfx}elf/ldconfig -X -f /dev/null \
-  -C $testroot/etc/ld.so.cache \
-  $testroot/lib
-
-check_files
-
-exit $errors
diff --git a/elf/tst-leaks1-static.c b/elf/tst-leaks1-static.c
deleted file mode 100644
index b956d66905..0000000000
--- a/elf/tst-leaks1-static.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-leaks1.c"
diff --git a/elf/tst-leaks1.c b/elf/tst-leaks1.c
deleted file mode 100644
index d67e8269c4..0000000000
--- a/elf/tst-leaks1.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <stdio.h>
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdlib.h>
-
-static int
-do_test (void)
-{
-  mtrace ();
-
-  int ret = 0;
-  for (int i = 0; i < 10; i++)
-    {
-      void *h = dlopen (i < 5 ? "./tst-leaks1.c"
-			      : "$ORIGIN/tst-leaks1.o", RTLD_LAZY);
-      if (h != NULL)
-	{
-	  puts ("dlopen unexpectedly succeeded");
-	  ret = 1;
-	  dlclose (h);
-	}
-    }
-
-  return ret;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-linkall-static.c b/elf/tst-linkall-static.c
deleted file mode 100644
index 8f40657244..0000000000
--- a/elf/tst-linkall-static.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Test static linking against multiple libraries, to find symbol conflicts.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public License as
-   published by the Free Software Foundation; either version 2.1 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If
-   not, see <http://www.gnu.org/licenses/>.  */
-
-#include <math.h>
-#include <pthread.h>
-#include <crypt.h>
-#include <resolv.h>
-#include <dlfcn.h>
-#include <utmp.h>
-#include <aio.h>
-#include <netdb.h>
-
-/* These references force linking the executable against central
-   functions in the static libraries, pulling significant parts of
-   each library into the link.  */
-void *references[] =
-  {
-    &pow,                       /* libm */
-    &pthread_create,            /* libpthread */
-#if USE_CRYPT
-    &crypt,                     /* libcrypt */
-#endif
-    &res_send,                  /* libresolv */
-    &dlopen,                    /* libdl */
-    &login,                     /* libutil */
-    &aio_init,                  /* librt */
-    &getaddrinfo_a,             /* libanl */
-  };
-
-static int
-do_test (void)
-{
-  /* This is a link-time test.  There is nothing to run here.  */
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-nodelete-dlclose-dso.c b/elf/tst-nodelete-dlclose-dso.c
deleted file mode 100644
index 4042c78b8a..0000000000
--- a/elf/tst-nodelete-dlclose-dso.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* Bug 11941: Improper assert map->l_init_called in dlclose.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This is the primary DSO that is loaded by the appliation.  This DSO
-   then loads a plugin with RTLD_NODELETE.  This plugin depends on this
-   DSO.  This dependency chain means that at application shutdown the
-   plugin will be destructed first.  Thus by the time this DSO is
-   destructed we will be calling dlclose on an object that has already
-   been destructed.  It is allowed to call dlclose in this way and
-   should not assert.  */
-#include <stdio.h>
-#include <stdlib.h>
-#include <dlfcn.h>
-
-/* Plugin to load.  */
-static void *plugin_lib = NULL;
-/* Plugin function.  */
-static void (*plugin_func) (void);
-#define LIB_PLUGIN "tst-nodelete-dlclose-plugin.so"
-
-/* This function is never called but the plugin references it.
-   We do this to avoid any future --as-needed from removing the
-   plugin's DT_NEEDED on this DSO (required for the test).  */
-void
-primary_reference (void)
-{
-  printf ("INFO: Called primary_reference function.\n");
-}
-
-void
-primary (void)
-{
-  char *error;
-
-  plugin_lib = dlopen (LIB_PLUGIN, RTLD_NOW | RTLD_LOCAL | RTLD_NODELETE);
-  if (plugin_lib == NULL)
-    {
-      printf ("ERROR: Unable to load plugin library.\n");
-      exit (EXIT_FAILURE);
-    }
-  dlerror ();
-
-  plugin_func = (void (*) (void)) dlsym (plugin_lib, "plugin_func");
-  error = dlerror ();
-  if (error != NULL)
-    {
-      printf ("ERROR: Unable to find symbol with error \"%s\".",
-	      error);
-      exit (EXIT_FAILURE);
-    }
-
-  return;
-}
-
-__attribute__ ((destructor))
-static void
-primary_dtor (void)
-{
-  int ret;
-
-  printf ("INFO: Calling primary destructor.\n");
-
-  /* The destructor runs in the test driver also, which
-     hasn't called primary, in that case do nothing.  */
-  if (plugin_lib == NULL)
-    return;
-
-  ret = dlclose (plugin_lib);
-  if (ret != 0)
-    {
-      printf ("ERROR: Calling dlclose failed with \"%s\"\n",
-	      dlerror ());
-      exit (EXIT_FAILURE);
-    }
-}
diff --git a/elf/tst-nodelete-dlclose-plugin.c b/elf/tst-nodelete-dlclose-plugin.c
deleted file mode 100644
index 00c84d0bc0..0000000000
--- a/elf/tst-nodelete-dlclose-plugin.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Bug 11941: Improper assert map->l_init_called in dlclose.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This DSO simulates a plugin with a dependency on the
-   primary DSO loaded by the appliation.  */
-#include <stdio.h>
-
-extern void primary_reference (void);
-
-void
-plugin_func (void)
-{
-  printf ("INFO: Calling plugin function.\n");
-  /* Need a reference to the DSO to ensure that a potential --as-needed
-     doesn't remove the DT_NEEDED entry which we rely upon to ensure
-     destruction ordering.  */
-  primary_reference ();
-}
-
-__attribute__ ((destructor))
-static void
-plugin_dtor (void)
-{
-  printf ("INFO: Calling plugin destructor.\n");
-}
diff --git a/elf/tst-nodelete-dlclose.c b/elf/tst-nodelete-dlclose.c
deleted file mode 100644
index 178673e9d0..0000000000
--- a/elf/tst-nodelete-dlclose.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Bug 11941: Improper assert map->l_init_called in dlclose.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This simulates an application using the primary DSO which loads the
-   plugin DSO.  */
-#include <stdio.h>
-#include <stdlib.h>
-
-extern void primary (void);
-
-static int
-do_test (void)
-{
-  printf ("INFO: Starting application.\n");
-  primary ();
-  printf ("INFO: Exiting application.\n");
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-nodelete-opened-lib.c b/elf/tst-nodelete-opened-lib.c
deleted file mode 100644
index 3e1dcdfc1b..0000000000
--- a/elf/tst-nodelete-opened-lib.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Verify that objects opened with RTLD_NODELETE are not unloaded - the DSO.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-int foo_var = 42;
diff --git a/elf/tst-nodelete-opened.c b/elf/tst-nodelete-opened.c
deleted file mode 100644
index d71efa4603..0000000000
--- a/elf/tst-nodelete-opened.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Verify that an already opened DSO opened agained with RTLD_NODELETE actually
-   sets the NODELETE flag.
-
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-do_test (void)
-{
-  void *h1 = dlopen ("$ORIGIN/tst-nodelete-opened-lib.so", RTLD_LAZY);
-  if (h1 == NULL)
-    {
-      printf ("h1: failed to open DSO: %s\n", dlerror ());
-      return 1;
-    }
-
-  void *h2 = dlopen ("$ORIGIN/tst-nodelete-opened-lib.so",
-		     RTLD_LAZY | RTLD_NODELETE);
-  if (h2 == NULL)
-    {
-      printf ("h2: failed to open DSO: %s\n", dlerror ());
-      return 1;
-    }
-
-  int *foo = dlsym (h2, "foo_var");
-  if (foo == NULL)
-    {
-      printf ("failed to load symbol foo_var: %s\n", dlerror ());
-      return 1;
-    }
-
-  if (dlclose (h1) != 0)
-    {
-      printf ("h1: dlclose failed: %s\n", dlerror ());
-      return 1;
-    }
-
-  if (dlclose (h2) != 0)
-    {
-      printf ("h2: dlclose failed: %s\n", dlerror ());
-      return 1;
-    }
-
-  /* This FOO dereference will crash with a segfault if the DSO was
-     unloaded.  */
-  printf ("foo == %d\n", *foo);
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-nodelete-rtldmod.cc b/elf/tst-nodelete-rtldmod.cc
deleted file mode 100644
index 740e1d8181..0000000000
--- a/elf/tst-nodelete-rtldmod.cc
+++ /dev/null
@@ -1,6 +0,0 @@
-extern int not_exist (void);
-
-int foo (void)
-{
-  return not_exist ();
-}
diff --git a/elf/tst-nodelete-uniquemod.cc b/elf/tst-nodelete-uniquemod.cc
deleted file mode 100644
index 632b303d58..0000000000
--- a/elf/tst-nodelete-uniquemod.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-extern int not_exist (void);
-
-inline int make_unique (void)
-{
-  /* Static variables in inline functions and classes
-     generate STB_GNU_UNIQUE symbols.  */
-  static int unique;
-  return ++unique;
-}
-
-int foo (void)
-{
-  return make_unique () + not_exist ();
-}
diff --git a/elf/tst-nodelete-zmod.cc b/elf/tst-nodelete-zmod.cc
deleted file mode 100644
index 740e1d8181..0000000000
--- a/elf/tst-nodelete-zmod.cc
+++ /dev/null
@@ -1,6 +0,0 @@
-extern int not_exist (void);
-
-int foo (void)
-{
-  return not_exist ();
-}
diff --git a/elf/tst-nodelete.cc b/elf/tst-nodelete.cc
deleted file mode 100644
index 5752e7df26..0000000000
--- a/elf/tst-nodelete.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "../dlfcn/dlfcn.h"
-#include <stdio.h>
-#include <stdlib.h>
-
-static int
-do_test (void)
-{
-  int result = 0;
-
-  /* This is a test for correct handling of dlopen failures for library that
-     is loaded with RTLD_NODELETE flag.  The first dlopen should fail because
-     of undefined symbols in shared library.  The second dlopen then verifies
-     that library was properly unloaded.  */
-  if (dlopen ("tst-nodelete-rtldmod.so", RTLD_NOW | RTLD_NODELETE) != NULL
-      || dlopen ("tst-nodelete-rtldmod.so", RTLD_LAZY | RTLD_NOLOAD) != NULL)
-    {
-      printf ("RTLD_NODELETE test failed\n");
-      result = 1;
-    }
-
-  /* This is a test for correct handling of dlopen failures for library that
-     is linked with '-z nodelete' option and hence has DF_1_NODELETE flag.
-     The first dlopen should fail because of undefined symbols in shared
-     library.  The second dlopen then verifies that library was properly
-     unloaded.  */
-  if (dlopen ("tst-nodelete-zmod.so", RTLD_NOW) != NULL
-      || dlopen ("tst-nodelete-zmod.so", RTLD_LAZY | RTLD_NOLOAD) != NULL)
-    {
-      printf ("-z nodelete test failed\n");
-      result = 1;
-    }
-
-   /* This is a test for correct handling of dlopen failures for library
-     with unique symbols.  The first dlopen should fail because of undefined
-     symbols in shared library.  The second dlopen then verifies that library
-     was properly unloaded.  */
-  if (dlopen ("tst-nodelete-uniquemod.so", RTLD_NOW) != NULL
-      || dlopen ("tst-nodelete-uniquemod.so", RTLD_LAZY | RTLD_NOLOAD) != NULL)
-    {
-      printf ("Unique symbols test failed\n");
-      result = 1;
-    }
-
-  if (result == 0)
-    printf ("SUCCESS\n");
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-nodelete2.c b/elf/tst-nodelete2.c
deleted file mode 100644
index 010c4ae237..0000000000
--- a/elf/tst-nodelete2.c
+++ /dev/null
@@ -1,36 +0,0 @@
-#include "../dlfcn/dlfcn.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <gnu/lib-names.h>
-
-static int
-do_test (void)
-{
-  int result = 0;
-
-  printf ("\nOpening pthread library.\n");
-  void *pthread = dlopen (LIBPTHREAD_SO, RTLD_LAZY);
-
-  /* This is a test for correct DF_1_NODELETE clearing when dlopen failure
-     happens.  We should clear DF_1_NODELETE for failed library only, because
-     doing this for others (e.g. libpthread) might cause them to be unloaded,
-     that may lead to some global references (e.g. __rtld_lock_unlock) to be
-     broken.  The dlopen should fail because of undefined symbols in shared
-     library, that cause DF_1_NODELETE to be cleared.  For libpthread, this
-     flag should be set, because if not, SIGSEGV will happen in dlclose.  */
-  if (dlopen ("tst-nodelete2mod.so", RTLD_NOW) != NULL)
-    {
-      printf ("Unique symbols test failed\n");
-      result = 1;
-    }
-
-  if (pthread)
-    dlclose (pthread);
-
-  if (result == 0)
-    printf ("SUCCESS\n");
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-nodelete2mod.c b/elf/tst-nodelete2mod.c
deleted file mode 100644
index e88c756f5e..0000000000
--- a/elf/tst-nodelete2mod.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Undefined symbol.  */
-extern int not_exist (void);
-
-int foo (void)
-{
-  return not_exist ();
-}
diff --git a/elf/tst-noload.c b/elf/tst-noload.c
deleted file mode 100644
index 3fb2895e2c..0000000000
--- a/elf/tst-noload.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Verify that RTLD_NOLOAD works as expected.
-
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <dlfcn.h>
-#include <stdio.h>
-#include <gnu/lib-names.h>
-
-static int
-do_test (void)
-{
-  /* Test that no object is loaded with RTLD_NOLOAD.  */
-  void *h1 = dlopen (LIBM_SO, RTLD_LAZY | RTLD_NOLOAD);
-  if (h1 != NULL)
-    {
-      printf ("h1: DSO has been loaded while it should have not\n");
-      return 1;
-    }
-
-  /* This used to segfault in some glibc versions.  */
-  void *h2 = dlopen (LIBM_SO, RTLD_LAZY | RTLD_NOLOAD | RTLD_NODELETE);
-  if (h2 != NULL)
-    {
-      printf ("h2: DSO has been loaded while it should have not\n");
-      return 1;
-    }
-
-  /* Test that loading an already loaded object returns the same.  */
-  void *h3 = dlopen (LIBM_SO, RTLD_LAZY);
-  if (h3 == NULL)
-    {
-      printf ("h3: failed to open DSO: %s\n", dlerror ());
-      return 1;
-    }
-  void *h4 = dlopen (LIBM_SO, RTLD_LAZY | RTLD_NOLOAD);
-  if (h4 == NULL)
-    {
-      printf ("h4: failed to open DSO: %s\n", dlerror ());
-      return 1;
-    }
-  if (h4 != h3)
-    {
-      printf ("h4: should return the same object\n");
-      return 1;
-    }
-
-  /* Cleanup */
-  if (dlclose (h3) != 0)
-    {
-      printf ("h3: dlclose failed: %s\n", dlerror ());
-      return 1;
-    }
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-null-argv-lib.c b/elf/tst-null-argv-lib.c
deleted file mode 100644
index 12af03ba95..0000000000
--- a/elf/tst-null-argv-lib.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Verify that program does not crash when LD_DEBUG is set and the program name
-   is not available.  This is the library.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-void
-foo (void)
-{
-  return;
-}
diff --git a/elf/tst-null-argv.c b/elf/tst-null-argv.c
deleted file mode 100644
index 21b87327c1..0000000000
--- a/elf/tst-null-argv.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Verify that program does not crash when LD_DEBUG is set and the program name
-   is not available.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-extern void foo (void);
-
-int
-do_test (int argc, char **argv)
-{
-  argv[0] = argv[1];
-  argc--;
-
-  /* This should result in a symbol lookup, causing a volley of debug output
-     when LD_DEBUG=symbols.  */
-  foo ();
-
-  return 0;
-}
-
-#define TEST_FUNCTION_ARGV do_test
-#include <support/test-driver.c>
diff --git a/elf/tst-order-a1.c b/elf/tst-order-a1.c
deleted file mode 100644
index f161257142..0000000000
--- a/elf/tst-order-a1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_a1( void ) __attribute__((constructor));
-extern void finish_a1( void ) __attribute__((destructor));
-
-void
-start_a1( void )
-{
-  printf( "start_a1\n" );
-}
-
-void
-finish_a1( void )
-{
-  printf( "finish_a1\n" );
-}
diff --git a/elf/tst-order-a2.c b/elf/tst-order-a2.c
deleted file mode 100644
index a5a9b42ff6..0000000000
--- a/elf/tst-order-a2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_a2( void ) __attribute__((constructor));
-extern void finish_a2( void ) __attribute__((destructor));
-
-void
-start_a2( void )
-{
-  printf( "start_a2\n" );
-}
-
-void
-finish_a2( void )
-{
-  printf( "finish_a2\n" );
-}
diff --git a/elf/tst-order-a3.c b/elf/tst-order-a3.c
deleted file mode 100644
index 1c7f496e9a..0000000000
--- a/elf/tst-order-a3.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_a3( void ) __attribute__((constructor));
-extern void finish_a3( void ) __attribute__((destructor));
-
-void
-start_a3( void )
-{
-  printf( "start_a3\n" );
-}
-
-void
-finish_a3( void )
-{
-  printf( "finish_a3\n" );
-}
diff --git a/elf/tst-order-a4.c b/elf/tst-order-a4.c
deleted file mode 100644
index 70b9f5e392..0000000000
--- a/elf/tst-order-a4.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_a4( void ) __attribute__((constructor));
-extern void finish_a4( void ) __attribute__((destructor));
-
-void
-start_a4( void )
-{
-  printf( "start_a4\n" );
-}
-
-void
-finish_a4( void )
-{
-  printf( "finish_a4\n" );
-}
diff --git a/elf/tst-order-b1.c b/elf/tst-order-b1.c
deleted file mode 100644
index 993ea3fe30..0000000000
--- a/elf/tst-order-b1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_b1( void ) __attribute__((constructor));
-extern void finish_b1( void ) __attribute__((destructor));
-
-void
-start_b1( void )
-{
-  printf( "start_b1\n" );
-}
-
-void
-finish_b1( void )
-{
-  printf( "finish_b1\n" );
-}
diff --git a/elf/tst-order-b2.c b/elf/tst-order-b2.c
deleted file mode 100644
index 3334dda0a9..0000000000
--- a/elf/tst-order-b2.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-extern void start_b2( void ) __attribute__((constructor));
-extern void finish_b2( void ) __attribute__((destructor));
-
-void
-start_b2( void )
-{
-  printf( "start_b2\n" );
-}
-
-void
-finish_b2( void )
-{
-  printf( "finish_b2\n" );
-}
diff --git a/elf/tst-order-main.c b/elf/tst-order-main.c
deleted file mode 100644
index 2a90130db6..0000000000
--- a/elf/tst-order-main.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-
-static int
-do_test (void)
-{
-  printf( "main\n" );
-  exit(EXIT_SUCCESS);
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-pathopt.c b/elf/tst-pathopt.c
deleted file mode 100644
index e2c96fbc72..0000000000
--- a/elf/tst-pathopt.c
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <dlfcn.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-
-static int
-do_test (void)
-{
-  void *h;
-  int (*fp) (int);
-  int result;
-
-  mtrace ();
-
-  h = dlopen ("renamed.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("failed to load \"%s\": %s\n", "renamed.so", dlerror ());
-      exit (1);
-    }
-
-  fp = dlsym (h, "in_renamed");
-  if (fp == NULL)
-    {
-      printf ("lookup of \"%s\" failed: %s\n", "in_renamed", dlerror ());
-      exit (1);
-    }
-
-  result = fp (10);
-
-  if (dlclose (h) != 0)
-    {
-      printf ("failed to close \"%s\": %s\n", "renamed.so", dlerror ());
-      exit (1);
-    }
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-pathopt.sh b/elf/tst-pathopt.sh
deleted file mode 100755
index 4183a697dc..0000000000
--- a/elf/tst-pathopt.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-# Test lookup path optimization.
-# Copyright (C) 2000-2017 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, see
-# <http://www.gnu.org/licenses/>.
-
-set -e
-
-common_objpfx=$1
-test_wrapper_env=$2
-run_program_env=$3
-
-test -e ${common_objpfx}elf/will-be-empty &&
-  rm -fr ${common_objpfx}elf/will-be-empty
-test -d ${common_objpfx}elf/for-renamed ||
-  mkdir ${common_objpfx}elf/for-renamed
-
-cp ${common_objpfx}elf/pathoptobj.so ${common_objpfx}elf/for-renamed/renamed.so
-
-${test_wrapper_env} \
-${run_program_env} \
-LD_LIBRARY_PATH=${common_objpfx}elf/will-be-empty:${common_objpfx}elf/for-renamed:${common_objpfx}.:${common_objpfx}dlfcn \
-  ${common_objpfx}elf/ld.so ${common_objpfx}elf/tst-pathopt \
-    > ${common_objpfx}elf/tst-pathopt.out
-
-exit $?
diff --git a/elf/tst-pie1.c b/elf/tst-pie1.c
deleted file mode 100644
index 75d941f21f..0000000000
--- a/elf/tst-pie1.c
+++ /dev/null
@@ -1,5 +0,0 @@
-int
-foo (void)
-{
-  return 34;
-}
diff --git a/elf/tst-pie2.c b/elf/tst-pie2.c
deleted file mode 100644
index 32943bbc1a..0000000000
--- a/elf/tst-pie2.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* Test case for BZ #16381
-
-   Copyright (C) 2014-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-
-#include <assert.h>
-
-static int g;
-
-void init_g (void) __attribute__((constructor));
-
-void
-init_g (void)
-{
-  assert (g == 0);
-  g += 1;
-}
-
-static int
-do_test (void)
-{
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-piemod1.c b/elf/tst-piemod1.c
deleted file mode 100644
index 72d7e0a187..0000000000
--- a/elf/tst-piemod1.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <stdio.h>
-
-int
-foo (void)
-{
-  return 21;
-}
-
-static int
-do_test (void)
-{
-  int val = foo ();
-  if (val != 34)
-    {
-      printf ("foo () returned %d\n", val);
-      return 1;
-    }
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-prelink.c b/elf/tst-prelink.c
deleted file mode 100644
index 7435c321d3..0000000000
--- a/elf/tst-prelink.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Test the output from the environment variable, LD_TRACE_PRELINKING,
-   for prelink.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdio.h>
-
-static int
-do_test (void)
-{
-  fprintf (stdout, "hello\n");
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-prelink.exp b/elf/tst-prelink.exp
deleted file mode 100644
index b35b4c9705..0000000000
--- a/elf/tst-prelink.exp
+++ /dev/null
@@ -1 +0,0 @@
-/0 stdout
diff --git a/elf/tst-protected1a.c b/elf/tst-protected1a.c
deleted file mode 100644
index 4267b951c4..0000000000
--- a/elf/tst-protected1a.c
+++ /dev/null
@@ -1,234 +0,0 @@
-/* Test the protected visibility when main is linked with moda and modb
-   in that order:
-   1. Protected symbols, protected1, protected2 and protected3, defined
-      in moda, are used in moda.
-   2. Protected symbol, protected3, defined in modb, are used in modb.
-   3. Symbol, protected1, defined in moda, is also used in main and modb.
-   4. Symbol, protected2, defined in main, is used in main.
-   5. Symbol, protected3, defined in moda, is also used in main.
-
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This file must be compiled as PIE to avoid copy relocation when
-   accessing protected symbols defined in shared libaries since copy
-   relocation doesn't work with protected symbols and linker in
-   binutils 2.26 enforces this rule.  */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "tst-protected1mod.h"
-
-/* Prototype for our test function.  */
-extern int do_test (void);
-
-int protected2 = -1;
-
-/* This defines the `main' function and some more.  */
-#include <support/test-driver.c>
-
-int
-do_test (void)
-{
-  int res = 0;
-
-  /* Check if we get the same address for the protected data symbol.  */
-  if (&protected1 != protected1a_p ())
-    {
-      puts ("`protected1' in main and moda doesn't have same address");
-      res = 1;
-    }
-  if (&protected1 != protected1b_p ())
-    {
-      puts ("`protected1' in main and modb doesn't have same address");
-      res = 1;
-    }
-
-  /* Check if we get the right value for the protected data symbol.  */
-  if (protected1 != 3)
-    {
-      puts ("`protected1' in main and moda doesn't have same value");
-      res = 1;
-    }
-
-  /* Check if we get the right value for data defined in executable.  */
-  if (protected2 != -1)
-    {
-      puts ("`protected2' in main has the wrong value");
-      res = 1;
-    }
-
-  /* Check `protected1' in moda.  */
-  if (!check_protected1 ())
-    {
-      puts ("`protected1' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check `protected2' in moda.  */
-  if (!check_protected2 ())
-    {
-      puts ("`protected2' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the same address for the protected data symbol.  */
-  if (&protected3 != protected3a_p ())
-    {
-      puts ("`protected3' in main and moda doesn't have same address");
-      res = 1;
-    }
-  if (&protected3 == protected3b_p ())
-    {
-      puts ("`protected3' in main and modb has same address");
-      res = 1;
-    }
-
-  /* Check if we get the right value for the protected data symbol.  */
-  if (protected3 != 5)
-    {
-      puts ("`protected3' in main and moda doesn't have same value");
-      res = 1;
-    }
-
-  /* Check `protected3' in moda.  */
-  if (!check_protected3a ())
-    {
-      puts ("`protected3' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check `protected3' in modb.  */
-  if (!check_protected3b ())
-    {
-      puts ("`protected3' in modb has the wrong value");
-      res = 1;
-    }
-
-  /* Set `protected2' in moda to 30.  */
-  set_protected2 (300);
-
-  /* Check `protected2' in moda.  */
-  if (!check_protected2 ())
-    {
-      puts ("`protected2' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Set `protected1' in moda to 30.  */
-  set_protected1a (30);
-
-  /* Check `protected1' in moda.  */
-  if (!check_protected1 ())
-    {
-      puts ("`protected1' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the updated value for the protected data symbol.  */
-  if (protected1 != 30)
-    {
-      puts ("`protected1' in main doesn't have the updated value");
-      res = 1;
-    }
-
-  protected2 = -300;
-
-  /* Check `protected2' in moda.  */
-  if (!check_protected2 ())
-    {
-      puts ("`protected2' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if data defined in executable is changed.  */
-  if (protected2 != -300)
-    {
-      puts ("`protected2' in main is changed");
-      res = 1;
-    }
-
-  /* Set `protected1' in modb to 40.  */
-  set_protected1b (40);
-  set_expected_protected1 (40);
-
-  /* Check `protected1' in moda.  */
-  if (!check_protected1 ())
-    {
-      puts ("`protected1' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the updated value for the protected data symbol.  */
-  if (protected1 != 40)
-    {
-      puts ("`protected1' in main doesn't have the updated value");
-      res = 1;
-    }
-
-  /* Set `protected3' in moda to 80.  */
-  set_protected3a (80);
-
-  /* Check `protected3' in moda.  */
-  if (!check_protected3a ())
-    {
-      puts ("`protected3' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the updated value for the protected data symbol.  */
-  if (protected3 != 80)
-    {
-      puts ("`protected3' in main doesn't have the updated value");
-      res = 1;
-    }
-
-  /* Check `protected3' in modb.  */
-  if (!check_protected3b ())
-    {
-      puts ("`protected3' in modb has the wrong value");
-      res = 1;
-    }
-
-  /* Set `protected3' in modb to 100.  */
-  set_protected3b (100);
-
-  /* Check `protected3' in moda.  */
-  if (!check_protected3a ())
-    {
-      puts ("`protected3' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the updated value for the protected data symbol.  */
-  if (protected3 != 80)
-    {
-      puts ("`protected3' in main doesn't have the updated value");
-      res = 1;
-    }
-
-  /* Check `protected3' in modb.  */
-  if (!check_protected3b ())
-    {
-      puts ("`protected3' in modb has the wrong value");
-      res = 1;
-    }
-
-  return res;
-}
diff --git a/elf/tst-protected1b.c b/elf/tst-protected1b.c
deleted file mode 100644
index 9fd695bffa..0000000000
--- a/elf/tst-protected1b.c
+++ /dev/null
@@ -1,240 +0,0 @@
-/* Test the protected visibility when main is linked with modb and moda
-   in that order:
-   1. Protected symbols, protected1, protected2 and protected3, defined
-      in moda, are used in moda.
-   2.  Protected symbol, protected3, defined in modb, are used in modb
-   3. Symbol, protected1, defined in modb, is used in main and modb.
-   4. Symbol, protected2, defined in main, is used in main.
-   5. Symbol, protected3, defined in modb, is also used in main.
-
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This file must be compiled as PIE to avoid copy relocation when
-   accessing protected symbols defined in shared libaries since copy
-   relocation doesn't work with protected symbols and linker in
-   binutils 2.26 enforces this rule.  */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "tst-protected1mod.h"
-
-/* Prototype for our test function.  */
-extern int do_test (void);
-
-int protected2 = -1;
-
-/* This defines the `main' function and some more.  */
-#include <support/test-driver.c>
-
-int
-do_test (void)
-{
-  int res = 0;
-
-  /* Check if we get the same address for the protected data symbol.  */
-  if (&protected1 == protected1a_p ())
-    {
-      puts ("`protected1' in main and moda has  same address");
-      res = 1;
-    }
-  if (&protected1 != protected1b_p ())
-    {
-      puts ("`protected1' in main and modb doesn't have same address");
-      res = 1;
-    }
-
-  /* Check if we get the right value for the protected data symbol.  */
-  if (protected1 != -3)
-    {
-      puts ("`protected1' in main and modb doesn't have same value");
-      res = 1;
-    }
-
-  /* Check if we get the right value for data defined in executable.  */
-  if (protected2 != -1)
-    {
-      puts ("`protected2' in main has the wrong value");
-      res = 1;
-    }
-
-  /* Check `protected1' in moda.  */
-  if (!check_protected1 ())
-    {
-      puts ("`protected1' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check `protected2' in moda.  */
-  if (!check_protected2 ())
-    {
-      puts ("`protected2' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the same address for the protected data symbol.  */
-  if (&protected3 == protected3a_p ())
-    {
-      puts ("`protected3' in main and moda has same address");
-      res = 1;
-    }
-  if (&protected3 != protected3b_p ())
-    {
-      puts ("`protected3' in main and modb doesn't have same address");
-      res = 1;
-    }
-
-  /* Check if we get the right value for the protected data symbol.  */
-  if (protected3 != -5)
-    {
-      puts ("`protected3' in main and modb doesn't have same value");
-      res = 1;
-    }
-
-  /* Check `protected3' in moda.  */
-  if (!check_protected3a ())
-    {
-      puts ("`protected3' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check `protected3' in modb.  */
-  if (!check_protected3b ())
-    {
-      puts ("`protected3' in modb has the wrong value");
-      res = 1;
-    }
-
-  /* Set `protected2' in moda to 30.  */
-  set_protected2 (300);
-
-  /* Check `protected2' in moda.  */
-  if (!check_protected2 ())
-    {
-      puts ("`protected2' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the right value for data defined in executable.  */
-  if (protected2 != -1)
-    {
-      puts ("`protected2' in main has the wrong value");
-      res = 1;
-    }
-
-  /* Set `protected1' in moda to 30.  */
-  set_protected1a (30);
-
-  /* Check `protected1' in moda.  */
-  if (!check_protected1 ())
-    {
-      puts ("`protected1' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the same value for the protected data symbol.  */
-  if (protected1 != -3)
-    {
-      puts ("`protected1' in main has the wrong value");
-      res = 1;
-    }
-
-  protected2 = -300;
-
-  /* Check `protected2' in moda.  */
-  if (!check_protected2 ())
-    {
-      puts ("`protected2' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if data defined in executable is changed.  */
-  if (protected2 != -300)
-    {
-      puts ("`protected2' in main is changed");
-      res = 1;
-    }
-
-  /* Set `protected1' in modb to 40.  */
-  set_protected1b (40);
-
-  /* Check `protected1' in moda.  */
-  if (!check_protected1 ())
-    {
-      puts ("`protected1' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the updated value for the protected data symbol.  */
-  if (protected1 != 40)
-    {
-      puts ("`protected1' in main doesn't have the updated value");
-      res = 1;
-    }
-
-  /* Set `protected3' in moda to 80.  */
-  set_protected3a (80);
-
-  /* Check `protected3' in moda.  */
-  if (!check_protected3a ())
-    {
-      puts ("`protected3' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the updated value for the protected data symbol.  */
-  if (protected3 != -5)
-    {
-      puts ("`protected3' in main doesn't have the updated value");
-      res = 1;
-    }
-
-  /* Check `protected3' in modb.  */
-  if (!check_protected3b ())
-    {
-      puts ("`protected3' in modb has the wrong value");
-      res = 1;
-    }
-
-  /* Set `protected3' in modb to 100.  */
-  set_protected3b (100);
-
-  /* Check `protected3' in moda.  */
-  if (!check_protected3a ())
-    {
-      puts ("`protected3' in moda has the wrong value");
-      res = 1;
-    }
-
-  /* Check if we get the updated value for the protected data symbol.  */
-  if (protected3 != 100)
-    {
-      puts ("`protected3' in main doesn't have the updated value");
-      res = 1;
-    }
-
-  /* Check `protected3' in modb.  */
-  if (!check_protected3b ())
-    {
-      puts ("`protected3' in modb has the wrong value");
-      res = 1;
-    }
-
-  return res;
-}
diff --git a/elf/tst-protected1mod.h b/elf/tst-protected1mod.h
deleted file mode 100644
index a47d65f6b1..0000000000
--- a/elf/tst-protected1mod.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* Prototypes for the functions in the DSOs.  */
-extern int protected1;
-extern int protected2;
-extern int protected3;
-
-extern void set_protected1a (int);
-extern void set_protected1b (int);
-extern int *protected1a_p (void);
-extern int *protected1b_p (void);
-
-extern void set_expected_protected1 (int);
-extern int check_protected1 (void);
-
-extern void set_protected2 (int);
-extern int check_protected2 (void);
-
-extern void set_expected_protected3a (int);
-extern void set_protected3a (int);
-extern int check_protected3a (void);
-extern int *protected3a_p (void);
-extern void set_expected_protected3b (int);
-extern void set_protected3b (int);
-extern int check_protected3b (void);
-extern int *protected3b_p (void);
diff --git a/elf/tst-protected1moda.c b/elf/tst-protected1moda.c
deleted file mode 100644
index aca4fc82a8..0000000000
--- a/elf/tst-protected1moda.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include "tst-protected1mod.h"
-
-int protected1 = 3;
-static int expected_protected1 = 3;
-int protected2 = 4;
-static int expected_protected2 = 4;
-int protected3 = 5;
-static int expected_protected3 = 5;
-
-asm (".protected protected1");
-asm (".protected protected2");
-asm (".protected protected3");
-
-void
-set_protected1a (int i)
-{
-  protected1 = i;
-  set_expected_protected1 (i);
-}
-
-void
-set_expected_protected1 (int i)
-{
-  expected_protected1 = i;
-}
-
-int *
-protected1a_p (void)
-{
-  return &protected1;
-}
-
-int
-check_protected1 (void)
-{
-  return protected1 == expected_protected1;
-}
-
-void
-set_protected2 (int i)
-{
-  protected2 = i;
-  expected_protected2 = i;
-}
-
-int
-check_protected2 (void)
-{
-  return protected2 == expected_protected2;
-}
-
-void
-set_expected_protected3a (int i)
-{
-  expected_protected3 = i;
-}
-
-void
-set_protected3a (int i)
-{
-  protected3 = i;
-  set_expected_protected3a (i);
-}
-
-int
-check_protected3a (void)
-{
-  return protected3 == expected_protected3;
-}
-
-int *
-protected3a_p (void)
-{
-  return &protected3;
-}
diff --git a/elf/tst-protected1modb.c b/elf/tst-protected1modb.c
deleted file mode 100644
index 5036b6c3e7..0000000000
--- a/elf/tst-protected1modb.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdlib.h>
-#include "tst-protected1mod.h"
-
-int protected1 = -3;
-int protected3 = -5;
-static int expected_protected3 = -5;
-
-asm (".protected protected3");
-
-void
-set_protected1b (int i)
-{
-  protected1 = i;
-}
-
-int *
-protected1b_p (void)
-{
-  return &protected1;
-}
-
-void
-set_expected_protected3b (int i)
-{
-  expected_protected3 = i;
-}
-
-void
-set_protected3b (int i)
-{
-  protected3 = i;
-  set_expected_protected3b (i);
-}
-
-int
-check_protected3b (void)
-{
-  return protected3 == expected_protected3;
-}
-
-int *
-protected3b_p (void)
-{
-  return &protected3;
-}
diff --git a/elf/tst-ptrguard1-static.c b/elf/tst-ptrguard1-static.c
deleted file mode 100644
index 7aff3b7b5d..0000000000
--- a/elf/tst-ptrguard1-static.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-ptrguard1.c"
diff --git a/elf/tst-ptrguard1.c b/elf/tst-ptrguard1.c
deleted file mode 100644
index 8ea65bb0bb..0000000000
--- a/elf/tst-ptrguard1.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/* Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/wait.h>
-#include <stackguard-macros.h>
-#include <tls.h>
-#include <unistd.h>
-
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-/* Requires _GNU_SOURCE  */
-#include <getopt.h>
-
-#ifndef POINTER_CHK_GUARD
-extern uintptr_t __pointer_chk_guard;
-# define POINTER_CHK_GUARD __pointer_chk_guard
-#endif
-
-static const char *command;
-static bool child;
-static uintptr_t ptr_chk_guard_copy;
-static bool ptr_chk_guard_copy_set;
-static int fds[2];
-
-static void __attribute__ ((constructor))
-con (void)
-{
-  ptr_chk_guard_copy = POINTER_CHK_GUARD;
-  ptr_chk_guard_copy_set = true;
-}
-
-static int
-uintptr_t_cmp (const void *a, const void *b)
-{
-  if (*(uintptr_t *) a < *(uintptr_t *) b)
-    return 1;
-  if (*(uintptr_t *) a > *(uintptr_t *) b)
-    return -1;
-  return 0;
-}
-
-static int
-do_test (void)
-{
-  if (!ptr_chk_guard_copy_set)
-    {
-      puts ("constructor has not been run");
-      return 1;
-    }
-
-  if (ptr_chk_guard_copy != POINTER_CHK_GUARD)
-    {
-      puts ("POINTER_CHK_GUARD changed between constructor and do_test");
-      return 1;
-    }
-
-  if (child)
-    {
-      write (2, &ptr_chk_guard_copy, sizeof (ptr_chk_guard_copy));
-      return 0;
-    }
-
-  if (command == NULL)
-    {
-      puts ("missing --command or --child argument");
-      return 1;
-    }
-
-#define N 16
-  uintptr_t child_ptr_chk_guards[N + 1];
-  child_ptr_chk_guards[N] = ptr_chk_guard_copy;
-  int i;
-  for (i = 0; i < N; ++i)
-    {
-      if (pipe (fds) < 0)
-	{
-	  printf ("couldn't create pipe: %m\n");
-	  return 1;
-	}
-
-      pid_t pid = fork ();
-      if (pid < 0)
-	{
-	  printf ("fork failed: %m\n");
-	  return 1;
-	}
-
-      if (!pid)
-	{
-	  if (ptr_chk_guard_copy != POINTER_CHK_GUARD)
-	    {
-	      puts ("POINTER_CHK_GUARD changed after fork");
-	      exit (1);
-	    }
-
-	  close (fds[0]);
-	  close (2);
-	  dup2 (fds[1], 2);
-	  close (fds[1]);
-
-	  system (command);
-	  exit (0);
-	}
-
-      close (fds[1]);
-
-      if (TEMP_FAILURE_RETRY (read (fds[0], &child_ptr_chk_guards[i],
-				    sizeof (uintptr_t))) != sizeof (uintptr_t))
-	{
-	  puts ("could not read ptr_chk_guard value from child");
-	  return 1;
-	}
-
-      close (fds[0]);
-
-      pid_t termpid;
-      int status;
-      termpid = TEMP_FAILURE_RETRY (waitpid (pid, &status, 0));
-      if (termpid == -1)
-	{
-	  printf ("waitpid failed: %m\n");
-	  return 1;
-	}
-      else if (termpid != pid)
-	{
-	  printf ("waitpid returned %ld != %ld\n",
-		  (long int) termpid, (long int) pid);
-	  return 1;
-	}
-      else if (!WIFEXITED (status) || WEXITSTATUS (status))
-	{
-	  puts ("child hasn't exited with exit status 0");
-	  return 1;
-	}
-    }
-
-  qsort (child_ptr_chk_guards, N + 1, sizeof (uintptr_t), uintptr_t_cmp);
-
-  /* The default pointer guard is the same as the default stack guard.
-     They are only set to default if dl_random is NULL.  */
-  uintptr_t default_guard = 0;
-  unsigned char *p = (unsigned char *) &default_guard;
-  p[sizeof (uintptr_t) - 1] = 255;
-  p[sizeof (uintptr_t) - 2] = '\n';
-  p[0] = 0;
-
-  /* Test if the pointer guard canaries are either randomized,
-     or equal to the default pointer guard value.
-     Even with randomized pointer guards it might happen
-     that the random number generator generates the same
-     values, but if that happens in more than half from
-     the 16 runs, something is very wrong.  */
-  int ndifferences = 0;
-  int ndefaults = 0;
-  for (i = 0; i < N; ++i)
-    {
-      if (child_ptr_chk_guards[i] != child_ptr_chk_guards[i+1])
-	ndifferences++;
-      else if (child_ptr_chk_guards[i] == default_guard)
-	ndefaults++;
-    }
-
-  printf ("differences %d defaults %d\n", ndifferences, ndefaults);
-
-  if (ndifferences < N / 2 && ndefaults < N / 2)
-    {
-      puts ("pointer guard values are not randomized enough");
-      puts ("nor equal to the default value");
-      return 1;
-    }
-
-  return 0;
-}
-
-#define OPT_COMMAND	10000
-#define OPT_CHILD	10001
-#define CMDLINE_OPTIONS	\
-  { "command", required_argument, NULL, OPT_COMMAND },  \
-  { "child", no_argument, NULL, OPT_CHILD },
-
-static void __attribute((used))
-cmdline_process_function (int c)
-{
-  switch (c)
-    {
-      case OPT_COMMAND:
-        command = optarg;
-        break;
-      case OPT_CHILD:
-        child = true;
-        break;
-    }
-}
-
-#define CMDLINE_PROCESS	cmdline_process_function
-
-#include <support/test-driver.c>
diff --git a/elf/tst-relsort1.c b/elf/tst-relsort1.c
deleted file mode 100644
index 775c968e1f..0000000000
--- a/elf/tst-relsort1.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-
-static int
-do_test (void)
-{
-  const char lib[] = "$ORIGIN/tst-relsort1mod1.so";
-  void *h = dlopen (lib, RTLD_NOW);
-  if (h == NULL)
-    {
-      puts (dlerror ());
-      return 1;
-    }
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-relsort1mod1.c b/elf/tst-relsort1mod1.c
deleted file mode 100644
index 9e4a94321d..0000000000
--- a/elf/tst-relsort1mod1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern int foo (double);
-
-int
-bar (void)
-{
-  return foo (1.2);
-}
diff --git a/elf/tst-relsort1mod2.c b/elf/tst-relsort1mod2.c
deleted file mode 100644
index a2c3e551e4..0000000000
--- a/elf/tst-relsort1mod2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-#include <math.h>
-
-int
-foo (double d)
-{
-  return floor (d) != 0.0;
-}
diff --git a/elf/tst-rtld-load-self.sh b/elf/tst-rtld-load-self.sh
deleted file mode 100755
index e05f6d145f..0000000000
--- a/elf/tst-rtld-load-self.sh
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/sh
-# Test how rtld loads itself.
-# Copyright (C) 2012-2017 Free Software Foundation, Inc.
-# This file is part of the GNU C Library.
-#
-
-# The GNU C Library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-
-# The GNU C Library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Lesser General Public License for more details.
-
-# You should have received a copy of the GNU Lesser General Public
-# License along with the GNU C Library; if not, see
-# <http://www.gnu.org/licenses/>.
-
-set -e
-
-rtld=$1
-test_wrapper=$2
-test_wrapper_env=$3
-result=0
-
-echo '# normal mode'
-${test_wrapper} $rtld $rtld 2>&1 && rc=0 || rc=$?
-echo "# exit status $rc"
-test $rc -le 127 || result=1
-
-echo '# list mode'
-${test_wrapper} $rtld --list $rtld 2>&1 && rc=0 || rc=$?
-echo "# exit status $rc"
-test $rc -eq 0 || result=1
-
-echo '# verify mode'
-${test_wrapper} $rtld --verify $rtld 2>&1 && rc=0 || rc=$?
-echo "# exit status $rc"
-test $rc -eq 2 || result=1
-
-echo '# trace mode'
-${test_wrapper_env} LD_TRACE_LOADED_OBJECTS=1 \
-    $rtld $rtld 2>&1 && rc=0 || rc=$?
-echo "# exit status $rc"
-test $rc -eq 0 || result=1
-
-exit $result
diff --git a/elf/tst-stackguard1-static.c b/elf/tst-stackguard1-static.c
deleted file mode 100644
index db1e21554d..0000000000
--- a/elf/tst-stackguard1-static.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-stackguard1.c"
diff --git a/elf/tst-stackguard1.c b/elf/tst-stackguard1.c
deleted file mode 100644
index 78e33c7083..0000000000
--- a/elf/tst-stackguard1.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/* Copyright (C) 2005-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Jakub Jelinek <jakub@redhat.com>, 2005.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <getopt.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/wait.h>
-#include <stackguard-macros.h>
-#include <tls.h>
-#include <unistd.h>
-
-static const char *command;
-static bool child;
-static uintptr_t stack_chk_guard_copy;
-static bool stack_chk_guard_copy_set;
-static int fds[2];
-
-static void __attribute__ ((constructor))
-con (void)
-{
-  stack_chk_guard_copy = STACK_CHK_GUARD;
-  stack_chk_guard_copy_set = true;
-}
-
-static int
-uintptr_t_cmp (const void *a, const void *b)
-{
-  if (*(uintptr_t *) a < *(uintptr_t *) b)
-    return 1;
-  if (*(uintptr_t *) a > *(uintptr_t *) b)
-    return -1;
-  return 0;
-}
-
-static int
-do_test (void)
-{
-  if (!stack_chk_guard_copy_set)
-    {
-      puts ("constructor has not been run");
-      return 1;
-    }
-
-  if (stack_chk_guard_copy != STACK_CHK_GUARD)
-    {
-      puts ("STACK_CHK_GUARD changed between constructor and do_test");
-      return 1;
-    }
-
-  if (child)
-    {
-      write (2, &stack_chk_guard_copy, sizeof (stack_chk_guard_copy));
-      return 0;
-    }
-
-  if (command == NULL)
-    {
-      puts ("missing --command or --child argument");
-      return 1;
-    }
-
-#define N 16
-  uintptr_t child_stack_chk_guards[N + 1];
-  child_stack_chk_guards[N] = stack_chk_guard_copy;
-  int i;
-  for (i = 0; i < N; ++i)
-    {
-      if (pipe (fds) < 0)
-	{
-	  printf ("couldn't create pipe: %m\n");
-	  return 1;
-	}
-
-      pid_t pid = fork ();
-      if (pid < 0)
-	{
-	  printf ("fork failed: %m\n");
-	  return 1;
-	}
-
-      if (!pid)
-	{
-	  if (stack_chk_guard_copy != STACK_CHK_GUARD)
-	    {
-	      puts ("STACK_CHK_GUARD changed after fork");
-	      exit (1);
-	    }
-
-	  close (fds[0]);
-	  close (2);
-	  dup2 (fds[1], 2);
-	  close (fds[1]);
-
-	  system (command);
-	  exit (0);
-	}
-
-      close (fds[1]);
-
-      if (TEMP_FAILURE_RETRY (read (fds[0], &child_stack_chk_guards[i],
-				    sizeof (uintptr_t))) != sizeof (uintptr_t))
-	{
-	  puts ("could not read stack_chk_guard value from child");
-	  return 1;
-	}
-
-      close (fds[0]);
-
-      pid_t termpid;
-      int status;
-      termpid = TEMP_FAILURE_RETRY (waitpid (pid, &status, 0));
-      if (termpid == -1)
-	{
-	  printf ("waitpid failed: %m\n");
-	  return 1;
-	}
-      else if (termpid != pid)
-	{
-	  printf ("waitpid returned %ld != %ld\n",
-		  (long int) termpid, (long int) pid);
-	  return 1;
-	}
-      else if (!WIFEXITED (status) || WEXITSTATUS (status))
-	{
-	  puts ("child hasn't exited with exit status 0");
-	  return 1;
-	}
-    }
-
-  qsort (child_stack_chk_guards, N + 1, sizeof (uintptr_t), uintptr_t_cmp);
-
-  uintptr_t default_guard = 0;
-  unsigned char *p = (unsigned char *) &default_guard;
-  p[sizeof (uintptr_t) - 1] = 255;
-  p[sizeof (uintptr_t) - 2] = '\n';
-  p[0] = 0;
-
-  /* Test if the stack guard canaries are either randomized,
-     or equal to the default stack guard canary value.
-     Even with randomized stack guards it might happen
-     that the random number generator generates the same
-     values, but if that happens in more than half from
-     the 16 runs, something is very wrong.  */
-  int ndifferences = 0;
-  int ndefaults = 0;
-  for (i = 0; i < N; ++i)
-    {
-      if (child_stack_chk_guards[i] != child_stack_chk_guards[i+1])
-	ndifferences++;
-      else if (child_stack_chk_guards[i] == default_guard)
-	ndefaults++;
-    }
-
-  printf ("differences %d defaults %d\n", ndifferences, ndefaults);
-
-  if (ndifferences < N / 2 && ndefaults < N / 2)
-    {
-      puts ("stack guard canaries are not randomized enough");
-      puts ("nor equal to the default canary value");
-      return 1;
-    }
-
-  return 0;
-}
-
-#define OPT_COMMAND	10000
-#define OPT_CHILD	10001
-#define CMDLINE_OPTIONS	\
-  { "command", required_argument, NULL, OPT_COMMAND },  \
-  { "child", no_argument, NULL, OPT_CHILD },
-
-static void __attribute__((used))
-cmdline_process_function (int c)
-{
-  switch (c)
-    {
-      case OPT_COMMAND:
-        command = optarg;
-        break;
-      case OPT_CHILD:
-        child = true;
-        break;
-    }
-}
-#define CMDLINE_PROCESS	cmdline_process_function
-
-#include <support/test-driver.c>
diff --git a/elf/tst-thrlock.c b/elf/tst-thrlock.c
deleted file mode 100644
index 1beffc3861..0000000000
--- a/elf/tst-thrlock.c
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <dlfcn.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gnu/lib-names.h>
-
-static void *
-tf (void *arg)
-{
-  void *h = dlopen (LIBM_SO, RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("dlopen failed: %s\n", dlerror ());
-      exit (1);
-    }
-  if (dlsym (h, "sin") == NULL)
-    {
-      printf ("dlsym failed: %s\n", dlerror ());
-      exit (1);
-    }
-  if (dlclose (h) != 0)
-    {
-      printf ("dlclose failed: %s\n", dlerror ());
-      exit (1);
-    }
-  return NULL;
-}
-
-
-static int
-do_test (void)
-{
-#define N 10
-  pthread_t th[N];
-  for (int i = 0; i < N; ++i)
-    {
-      int e = pthread_create (&th[i], NULL, tf, NULL);
-      if (e != 0)
-	{
-	  printf ("pthread_create failed with %d (%s)\n", e, strerror (e));
-	  return 1;
-	}
-    }
-  for (int i = 0; i < N; ++i)
-    {
-      void *res;
-      int e = pthread_join (th[i], &res);
-      if (e != 0 || res != NULL)
-	{
-	  puts ("thread failed");
-	  return 1;
-	}
-    }
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls-dlinfo.c b/elf/tst-tls-dlinfo.c
deleted file mode 100644
index 7d2b42e2ab..0000000000
--- a/elf/tst-tls-dlinfo.c
+++ /dev/null
@@ -1,85 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-
-static int
-do_test (void)
-{
-  static const char modname[] = "tst-tlsmod2.so";
-  int result = 0;
-  int *foop;
-  int (*fp) (int, int *);
-  void *h;
-
-  h = dlopen (modname, RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("cannot open '%s': %s\n", modname, dlerror ());
-      exit (1);
-    }
-
-  fp = dlsym (h, "in_dso");
-  if (fp == NULL)
-    {
-      printf ("cannot get symbol 'in_dso': %s\n", dlerror ());
-      exit (1);
-    }
-
-  size_t modid = -1;
-  if (dlinfo (h, RTLD_DI_TLS_MODID, &modid))
-    {
-      printf ("dlinfo RTLD_DI_TLS_MODID failed: %s\n", dlerror ());
-      result = 1;
-    }
-  else
-    printf ("dlinfo says TLS module ID %Zu\n", modid);
-
-  void *block;
-  if (dlinfo (h, RTLD_DI_TLS_DATA, &block))
-    {
-      printf ("dlinfo RTLD_DI_TLS_DATA failed: %s\n", dlerror ());
-      result = 1;
-    }
-  else if (block != NULL)
-    {
-      printf ("dlinfo RTLD_DI_TLS_DATA says %p but should be unallocated\n",
-	      block);
-      result = 1;
-    }
-
-  result |= fp (0, NULL);
-
-  foop = dlsym (h, "foo");
-  if (foop == NULL)
-    {
-      printf ("cannot get symbol 'foo' the second time: %s\n", dlerror ());
-      exit (1);
-    }
-  if (*foop != 16)
-    {
-      puts ("foo != 16");
-      result = 1;
-    }
-
-  /* Now the module's TLS block has been used and should appear.  */
-  if (dlinfo (h, RTLD_DI_TLS_DATA, &block))
-    {
-      printf ("dlinfo RTLD_DI_TLS_DATA failed the second time: %s\n",
-	      dlerror ());
-      result = 1;
-    }
-  else if (block != foop)
-    {
-      printf ("dlinfo RTLD_DI_TLS_DATA says %p but should be %p\n",
-	      block, foop);
-      result = 1;
-    }
-
-  dlclose (h);
-
-  return result;
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls-manydynamic.c b/elf/tst-tls-manydynamic.c
deleted file mode 100644
index b072d0be68..0000000000
--- a/elf/tst-tls-manydynamic.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/* Test with many dynamic TLS variables.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This test intends to exercise dynamic TLS variable allocation.  It
-   achieves this by combining dlopen (to avoid static TLS allocation
-   after static TLS resizing), many DSOs with a large variable (to
-   exceed the static TLS reserve), and an already-running thread (to
-   force full dynamic TLS initialization).  */
-
-#include "tst-tls-manydynamic.h"
-
-#include <errno.h>
-#include <dlfcn.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static int do_test (void);
-#include <support/xthread.h>
-#include <support/test-driver.c>
-
-void *handles[COUNT];
-set_value_func set_value_funcs[COUNT];
-get_value_func get_value_funcs[COUNT];
-
-static void
-init_functions (void)
-{
-  for (int i = 0; i < COUNT; ++i)
-    {
-      /* Open the module.  */
-      {
-        char soname[100];
-        snprintf (soname, sizeof (soname), "tst-tls-manydynamic%02dmod.so", i);
-        handles[i] = dlopen (soname, RTLD_LAZY);
-        if (handles[i] == NULL)
-          {
-            printf ("error: dlopen failed: %s\n", dlerror ());
-            exit (1);
-          }
-      }
-
-      /* Obtain the setter function.  */
-      {
-        char fname[100];
-        snprintf (fname, sizeof (fname), "set_value_%02d", i);
-        void *func = dlsym (handles[i], fname);
-        if (func == NULL)
-          {
-            printf ("error: dlsym: %s\n", dlerror ());
-            exit (1);
-          }
-        set_value_funcs[i] = func;
-      }
-
-      /* Obtain the getter function.  */
-      {
-        char fname[100];
-        snprintf (fname, sizeof (fname), "get_value_%02d", i);
-        void *func = dlsym (handles[i], fname);
-        if (func == NULL)
-          {
-            printf ("error: dlsym: %s\n", dlerror ());
-            exit (1);
-          }
-        get_value_funcs[i] = func;
-      }
-    }
-}
-
-static pthread_barrier_t barrier;
-
-/* Running thread which forces real TLS initialization.  */
-static void *
-blocked_thread_func (void *closure)
-{
-  xpthread_barrier_wait (&barrier);
-
-  /* TLS test runs here in the main thread.  */
-
-  xpthread_barrier_wait (&barrier);
-  return NULL;
-}
-
-static int
-do_test (void)
-{
-  {
-    int ret = pthread_barrier_init (&barrier, NULL, 2);
-    if (ret != 0)
-      {
-        errno = ret;
-        printf ("error: pthread_barrier_init: %m\n");
-        exit (1);
-      }
-  }
-
-  pthread_t blocked_thread = xpthread_create (NULL, blocked_thread_func, NULL);
-  xpthread_barrier_wait (&barrier);
-
-  init_functions ();
-
-  struct value values[COUNT];
-  /* Initialze the TLS variables.  */
-  for (int i = 0; i < COUNT; ++i)
-    {
-      for (int j = 0; j < PER_VALUE_COUNT; ++j)
-        values[i].num[j] = rand ();
-      set_value_funcs[i] (&values[i]);
-    }
-
-  /* Read back their values to check that they do not overlap.  */
-  for (int i = 0; i < COUNT; ++i)
-    {
-      struct value actual;
-      get_value_funcs[i] (&actual);
-
-      for (int j = 0; j < PER_VALUE_COUNT; ++j)
-        if (actual.num[j] != values[i].num[j])
-        {
-          printf ("error: mismatch at variable %d/%d: %d != %d\n",
-                  i, j, actual.num[j], values[i].num[j]);
-          exit (1);
-        }
-    }
-
-  xpthread_barrier_wait (&barrier);
-  xpthread_join (blocked_thread);
-
-  /* Close the modules.  */
-  for (int i = 0; i < COUNT; ++i)
-    dlclose (handles[i]);
-
-  return 0;
-}
diff --git a/elf/tst-tls-manydynamic.h b/elf/tst-tls-manydynamic.h
deleted file mode 100644
index 13fac4e7e8..0000000000
--- a/elf/tst-tls-manydynamic.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Interfaces for test with many dynamic TLS variables.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef TST_TLS_MANYDYNAMIC_H
-#define TST_TLS_MANYDYNAMIC_H
-
-enum
-  {
-    /* This many TLS variables (and modules) are defined.  */
-    COUNT = 100,
-
-    /* Number of elements in the TLS variable.  */
-    PER_VALUE_COUNT = 1,
-  };
-
-/* The TLS variables are of this type.  We use a larger type to ensure
-   that we can reach the static TLS limit with COUNT variables.  */
-struct value
-{
-  int num[PER_VALUE_COUNT];
-};
-
-/* Set the TLS variable defined in the module.  */
-typedef void (*set_value_func) (const struct value *);
-
-/* Read the TLS variable defined in the module.  */
-typedef void (*get_value_func) (struct value *);
-
-#endif /* TST_TLS_MANYDYNAMICMOD_H */
diff --git a/elf/tst-tls-manydynamicmod.c b/elf/tst-tls-manydynamicmod.c
deleted file mode 100644
index edfaeef7f3..0000000000
--- a/elf/tst-tls-manydynamicmod.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Module for test with many dynamic TLS variables.
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This file is parameterized by macros NAME, SETTER, GETTER, which
-   are set form the Makefile.  */
-
-#include "tst-tls-manydynamic.h"
-
-__thread struct value NAME;
-
-void
-SETTER (const struct value *value)
-{
-  NAME = *value;
-}
-
-void
-GETTER (struct value *value)
-{
-  *value = NAME;
-}
diff --git a/elf/tst-tls1-static.c b/elf/tst-tls1-static.c
deleted file mode 100644
index a01008073b..0000000000
--- a/elf/tst-tls1-static.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-tls1.c"
diff --git a/elf/tst-tls1.c b/elf/tst-tls1.c
deleted file mode 100644
index c31da56ce9..0000000000
--- a/elf/tst-tls1.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* glibc test for TLS in ld.so.  */
-#include <stdio.h>
-
-#include "tls-macros.h"
-
-
-/* Two common 'int' variables in TLS.  */
-COMMON_INT_DEF(foo);
-COMMON_INT_DEF(bar);
-
-
-static int
-do_test (void)
-{
-  int result = 0;
-  int *ap, *bp;
-
-
-  /* Set the variable using the local exec model.  */
-  puts ("set bar to 1 (LE)");
-  ap = TLS_LE (bar);
-  *ap = 1;
-
-
-  /* Get variables using initial exec model.  */
-  fputs ("get sum of foo and bar (IE)", stdout);
-  ap = TLS_IE (foo);
-  bp = TLS_IE (bar);
-  printf (" = %d\n", *ap + *bp);
-  result |= *ap + *bp != 1;
-  if (*ap != 0)
-    {
-      printf ("foo = %d\n", *ap);
-      result = 1;
-    }
-  if (*bp != 1)
-    {
-      printf ("bar = %d\n", *bp);
-      result = 1;
-    }
-
-
-  /* Get variables using local dynamic model.  */
-  fputs ("get sum of foo and bar (LD)", stdout);
-  ap = TLS_LD (foo);
-  bp = TLS_LD (bar);
-  printf (" = %d\n", *ap + *bp);
-  result |= *ap + *bp != 1;
-  if (*ap != 0)
-    {
-      printf ("foo = %d\n", *ap);
-      result = 1;
-    }
-  if (*bp != 1)
-    {
-      printf ("bar = %d\n", *bp);
-      result = 1;
-    }
-
-
-  /* Get variables using generic dynamic model.  */
-  fputs ("get sum of foo and bar (GD)", stdout);
-  ap = TLS_GD (foo);
-  bp = TLS_GD (bar);
-  printf (" = %d\n", *ap + *bp);
-  result |= *ap + *bp != 1;
-  if (*ap != 0)
-    {
-      printf ("foo = %d\n", *ap);
-      result = 1;
-    }
-  if (*bp != 1)
-    {
-      printf ("bar = %d\n", *bp);
-      result = 1;
-    }
-
-  return result;
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls10.c b/elf/tst-tls10.c
deleted file mode 100644
index d9611aac6d..0000000000
--- a/elf/tst-tls10.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "tst-tls10.h"
-
-__thread int dummy __attribute__((visibility ("hidden"))) = 12;
-__thread struct A local = { 1, 2, 3 };
-
-#define CHECK(N, S)					\
-  p = f##N##a ();					\
-  if (p->a != S || p->b != S + 1 || p->c != S + 2)	\
-    abort ()
-
-static int
-do_test (void)
-{
-  struct A *p;
-  if (local.a != 1 || local.b != 2 || local.c != 3)
-    abort ();
-  if (a1.a != 4 || a1.b != 5 || a1.c != 6)
-    abort ();
-  if (a2.a != 22 || a2.b != 23 || a2.c != 24)
-    abort ();
-  if (a3.a != 10 || a3.b != 11 || a3.c != 12)
-    abort ();
-  if (a4.a != 25 || a4.b != 26 || a4.c != 27)
-    abort ();
-  check1 ();
-  check2 ();
-  if (f1a () != &a1 || f2a () != &a2 || f3a () != &a3 || f4a () != &a4)
-    abort ();
-  CHECK (5, 16);
-  CHECK (6, 19);
-  if (f7a () != &a2 || f8a () != &a4)
-    abort ();
-  CHECK (9, 28);
-  CHECK (10, 31);
-
-  exit (0);
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls10.h b/elf/tst-tls10.h
deleted file mode 100644
index 7c8c6a6391..0000000000
--- a/elf/tst-tls10.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <stdlib.h>
-
-struct A
-{
-  char a;
-  int b;
-  long long c;
-};
-
-extern __thread struct A a1, a2, a3, a4;
-extern struct A *f1a (void);
-extern struct A *f2a (void);
-extern struct A *f3a (void);
-extern struct A *f4a (void);
-extern struct A *f5a (void);
-extern struct A *f6a (void);
-extern struct A *f7a (void);
-extern struct A *f8a (void);
-extern struct A *f9a (void);
-extern struct A *f10a (void);
-extern int f1b (void);
-extern int f2b (void);
-extern int f3b (void);
-extern int f4b (void);
-extern int f5b (void);
-extern int f6b (void);
-extern int f7b (void);
-extern int f8b (void);
-extern int f9b (void);
-extern int f10b (void);
-extern void check1 (void);
-extern void check2 (void);
diff --git a/elf/tst-tls11.c b/elf/tst-tls11.c
deleted file mode 100644
index a5c3dd70b0..0000000000
--- a/elf/tst-tls11.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include "tst-tls10.h"
-
-#define CHECK(N, S)					\
-  p = f##N##a ();					\
-  if (p->a != S || p->b != S + 1 || p->c != S + 2)	\
-    abort ()
-
-static int
-do_test (void)
-{
-  struct A *p;
-  check1 ();
-  check2 ();
-  CHECK (1, 4);
-  CHECK (2, 22);
-  CHECK (3, 10);
-  CHECK (4, 25);
-  CHECK (5, 16);
-  CHECK (6, 19);
-  CHECK (7, 22);
-  CHECK (8, 25);
-  CHECK (9, 28);
-  CHECK (10, 31);
-
-  exit (0);
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls12.c b/elf/tst-tls12.c
deleted file mode 100644
index ccd5f8b43e..0000000000
--- a/elf/tst-tls12.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "tst-tls10.h"
-
-#define CHECK(N, S)					\
-  p = &a##N;						\
-  if (p->a != S || p->b != S + 1 || p->c != S + 2)	\
-    abort ()
-
-static int
-do_test (void)
-{
-  struct A *p;
-  check1 ();
-  CHECK (1, 4);
-  CHECK (2, 7);
-
-  exit (0);
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls13.c b/elf/tst-tls13.c
deleted file mode 100644
index b1d303310f..0000000000
--- a/elf/tst-tls13.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Check unloading modules with data in static TLS block.  */
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-
-static int
-do_test (void)
-{
-  for (int i = 0; i < 1000;)
-    {
-      printf ("round %d\n",++i);
-
-      void *h = dlopen ("$ORIGIN/tst-tlsmod13a.so", RTLD_LAZY);
-      if (h == NULL)
-	{
-	  printf ("cannot load: %s\n", dlerror ());
-	  exit (1);
-	}
-
-      dlclose (h);
-    }
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls14.c b/elf/tst-tls14.c
deleted file mode 100644
index a6a79ef24f..0000000000
--- a/elf/tst-tls14.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Check alignment of TLS variable.  */
-#include <dlfcn.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#define AL 4096
-struct foo
-{
-  int i;
-} __attribute ((aligned (AL)));
-
-static __thread struct foo f;
-static struct foo g;
-
-
-extern int in_dso1 (void);
-
-
-static int
-do_test (void)
-{
-  int result = 0;
-
-  int fail = (((uintptr_t) &f) & (AL - 1)) != 0;
-  printf ("&f = %p %s\n", &f, fail ? "FAIL" : "OK");
-  result |= fail;
-
-  fail = (((uintptr_t) &g) & (AL - 1)) != 0;
-  printf ("&g = %p %s\n", &g, fail ? "FAIL" : "OK");
-  result |= fail;
-
-  result |= in_dso1 ();
-
-  void *h = dlopen ("tst-tlsmod14b.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("cannot open tst-tlsmod14b.so: %m\n");
-      exit (1);
-    }
-
-  int (*fp) (void) = (int (*) (void)) dlsym (h, "in_dso2");
-  if (fp == NULL)
-    {
-      puts ("cannot find in_dso2");
-      exit (1);
-    }
-
-  result |= fp ();
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls15.c b/elf/tst-tls15.c
deleted file mode 100644
index db2a4f4b77..0000000000
--- a/elf/tst-tls15.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-static int
-do_test (void)
-{
-  void *h = dlopen ("tst-tlsmod15a.so", RTLD_NOW);
-  if (h != NULL)
-    {
-      puts ("unexpectedly succeeded to open tst-tlsmod15a.so");
-      exit (1);
-    }
-
-  h = dlopen ("tst-tlsmod15b.so", RTLD_NOW);
-  if (h == NULL)
-    {
-      puts ("failed to open tst-tlsmod15b.so");
-      exit (1);
-    }
-
-  int (*fp) (void) = (int (*) (void)) dlsym (h, "in_dso");
-  if (fp == NULL)
-    {
-      puts ("cannot find in_dso");
-      exit (1);
-    }
-
-  return fp ();
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls16.c b/elf/tst-tls16.c
deleted file mode 100644
index f2830b8a4f..0000000000
--- a/elf/tst-tls16.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-static int
-do_test (void)
-{
-  void *h = dlopen ("tst-tlsmod16a.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (h == NULL)
-    {
-      puts ("unexpectedly failed to open tst-tlsmod16a.so");
-      exit (1);
-    }
-
-  void *p = dlsym (h, "tlsvar");
-
-  /* This dlopen should indeed fail, because tlsvar was assigned to
-     dynamic TLS, and the new module requests it to be in static TLS.
-     However, there's a possibility that dlopen succeeds if the
-     variable is, for whatever reason, assigned to static TLS, or if
-     the module fails to require static TLS, or even if TLS is not
-     supported.  */
-  h = dlopen ("tst-tlsmod16b.so", RTLD_NOW | RTLD_GLOBAL);
-  if (h == NULL)
-    {
-      return 0;
-    }
-
-  puts ("unexpectedly succeeded to open tst-tlsmod16b.so");
-
-
-  void *(*fp) (void) = (void *(*) (void)) dlsym (h, "in_dso");
-  if (fp == NULL)
-    {
-      puts ("cannot find in_dso");
-      exit (1);
-    }
-
-  /* If the dlopen passes, at least make sure the address returned by
-     dlsym is the same as that returned by the initial-exec access.
-     If the variable was assigned to dynamic TLS during dlsym, this
-     portion will fail.  */
-  if (fp () != p)
-    {
-      puts ("returned values do not match");
-      exit (1);
-    }
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls17.c b/elf/tst-tls17.c
deleted file mode 100644
index c2a972d3c4..0000000000
--- a/elf/tst-tls17.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-static int
-do_test (void)
-{
-  void *h = dlopen ("tst-tlsmod17b.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("unexpectedly failed to open tst-tlsmod17b.so");
-      exit (1);
-    }
-
-  int (*fp) (void) = (int (*) (void)) dlsym (h, "tlsmod17b");
-  if (fp == NULL)
-    {
-      puts ("cannot find tlsmod17b");
-      exit (1);
-    }
-
-  if (fp ())
-    exit (1);
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls18.c b/elf/tst-tls18.c
deleted file mode 100644
index b705b61d60..0000000000
--- a/elf/tst-tls18.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <dlfcn.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-static int
-do_test (void)
-{
-  char modname[sizeof "tst-tlsmod18aXX.so"];
-  void *h[20];
-  for (int i = 0; i < 20; i++)
-    {
-      snprintf (modname, sizeof modname, "tst-tlsmod18a%d.so", i);
-      h[i] = dlopen (modname, RTLD_LAZY);
-      if (h[i] == NULL)
-	{
-	  printf ("unexpectedly failed to open %s", modname);
-	  exit (1);
-	}
-    }
-
-  for (int i = 0; i < 20; i++)
-    {
-      int (*fp) (void) = (int (*) (void)) dlsym (h[i], "test");
-      if (fp == NULL)
-	{
-	  printf ("cannot find test in tst-tlsmod18a%d.so", i);
-	  exit (1);
-	}
-
-      if (fp ())
-	exit (1);
-    }
-
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls19.c b/elf/tst-tls19.c
deleted file mode 100644
index dd8ea42c3f..0000000000
--- a/elf/tst-tls19.c
+++ /dev/null
@@ -1,26 +0,0 @@
-// BZ 12453
-#include <stdio.h>
-#include <dlfcn.h>
-
-
-static int
-do_test (void)
-{
-  void* dl = dlopen ("tst-tls19mod1.so", RTLD_LAZY | RTLD_GLOBAL);
-  if (dl == NULL)
-    {
-      printf ("Error loading tst-tls19mod1.so: %s\n", dlerror ());
-      return 1;
-    }
-
-  int (*fn) (void) = dlsym (dl, "foo");
-  if (fn == NULL)
-    {
-      printf("Error obtaining symbol foo\n");
-      return 1;
-    }
-
-  return fn ();
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls19mod1.c b/elf/tst-tls19mod1.c
deleted file mode 100644
index 2790097ae5..0000000000
--- a/elf/tst-tls19mod1.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <stdio.h>
-
-extern int bar (void);
-extern int baz (void);
-
-int
-foo (void)
-{
-  int v1 = bar ();
-  int v2 = baz ();
-
-  printf ("bar=%d, baz=%d\n", v1, v2);
-
-  return v1 != 666 || v2 != 42;
-}
diff --git a/elf/tst-tls19mod2.c b/elf/tst-tls19mod2.c
deleted file mode 100644
index cae702f67c..0000000000
--- a/elf/tst-tls19mod2.c
+++ /dev/null
@@ -1,13 +0,0 @@
-static int __thread tbar __attribute__ ((tls_model ("initial-exec"))) = 666;
-
-void
-setter (int a)
-{
-  tbar = a;
-}
-
-int
-bar (void)
-{
-  return tbar;
-}
diff --git a/elf/tst-tls19mod3.c b/elf/tst-tls19mod3.c
deleted file mode 100644
index e7b28016b3..0000000000
--- a/elf/tst-tls19mod3.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-static int __thread tbaz __attribute__ ((tls_model ("local-dynamic"))) = 42;
-
-void
-setter2 (int a)
-{
-  tbaz = a;
-}
-
-int
-baz (void)
-{
-  printf ("&tbaz=%p\n", &tbaz);
-  return tbaz;
-}
diff --git a/elf/tst-tls2-static.c b/elf/tst-tls2-static.c
deleted file mode 100644
index 55ffa57448..0000000000
--- a/elf/tst-tls2-static.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-tls2.c"
diff --git a/elf/tst-tls2.c b/elf/tst-tls2.c
deleted file mode 100644
index 963b8d6c88..0000000000
--- a/elf/tst-tls2.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* glibc test for TLS in ld.so.  */
-#include <stdio.h>
-
-#include "tls-macros.h"
-
-
-/* Two 'int' variables in TLS.  */
-VAR_INT_DEF(foo);
-VAR_INT_DEF(bar);
-
-
-static int
-do_test (void)
-{
-  int result = 0;
-  int *ap, *bp;
-
-
-  /* Set the variable using the local exec model.  */
-  puts ("set bar to 1 (LE)");
-  ap = TLS_LE (bar);
-  *ap = 1;
-
-
-  /* Get variables using initial exec model.  */
-  fputs ("get sum of foo and bar (IE)", stdout);
-  ap = TLS_IE (foo);
-  bp = TLS_IE (bar);
-  printf (" = %d\n", *ap + *bp);
-  result |= *ap + *bp != 1;
-  if (*ap != 0)
-    {
-      printf ("foo = %d\n", *ap);
-      result = 1;
-    }
-  if (*bp != 1)
-    {
-      printf ("bar = %d\n", *bp);
-      result = 1;
-    }
-
-
-  /* Get variables using local dynamic model.  */
-  fputs ("get sum of foo and bar (LD)", stdout);
-  ap = TLS_LD (foo);
-  bp = TLS_LD (bar);
-  printf (" = %d\n", *ap + *bp);
-  result |= *ap + *bp != 1;
-  if (*ap != 0)
-    {
-      printf ("foo = %d\n", *ap);
-      result = 1;
-    }
-  if (*bp != 1)
-    {
-      printf ("bar = %d\n", *bp);
-      result = 1;
-    }
-
-
-  /* Get variables using generic dynamic model.  */
-  fputs ("get sum of foo and bar (GD)", stdout);
-  ap = TLS_GD (foo);
-  bp = TLS_GD (bar);
-  printf (" = %d\n", *ap + *bp);
-  result |= *ap + *bp != 1;
-  if (*ap != 0)
-    {
-      printf ("foo = %d\n", *ap);
-      result = 1;
-    }
-  if (*bp != 1)
-    {
-      printf ("bar = %d\n", *bp);
-      result = 1;
-    }
-
-  return result;
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls3.c b/elf/tst-tls3.c
deleted file mode 100644
index 7e0abb4c58..0000000000
--- a/elf/tst-tls3.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* glibc test for TLS in ld.so.  */
-#include <stdio.h>
-
-#include "tls-macros.h"
-
-
-/* One define int variable, two externs.  */
-COMMON_INT_DECL(foo);
-VAR_INT_DECL(bar);
-VAR_INT_DEF(baz);
-
-
-extern int in_dso (void);
-
-
-static int
-do_test (void)
-{
-  int result = 0;
-  int *ap, *bp, *cp;
-
-
-  /* Set the variable using the local exec model.  */
-  puts ("set baz to 3 (LE)");
-  ap = TLS_LE (baz);
-  *ap = 3;
-
-
-  /* Get variables using initial exec model.  */
-  puts ("set variables foo and bar (IE)");
-  ap = TLS_IE (foo);
-  *ap = 1;
-  bp = TLS_IE (bar);
-  *bp = 2;
-
-
-  /* Get variables using local dynamic model.  */
-  fputs ("get sum of foo, bar (GD) and baz (LD)", stdout);
-  ap = TLS_GD (foo);
-  bp = TLS_GD (bar);
-  cp = TLS_LD (baz);
-  printf (" = %d\n", *ap + *bp + *cp);
-  result |= *ap + *bp + *cp != 6;
-  if (*ap != 1)
-    {
-      printf ("foo = %d\n", *ap);
-      result = 1;
-    }
-  if (*bp != 2)
-    {
-      printf ("bar = %d\n", *bp);
-      result = 1;
-    }
-  if (*cp != 3)
-    {
-      printf ("baz = %d\n", *cp);
-      result = 1;
-    }
-
-
-  result |= in_dso ();
-
-  return result;
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls4.c b/elf/tst-tls4.c
deleted file mode 100644
index 6841f81386..0000000000
--- a/elf/tst-tls4.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-
-static int
-do_test (void)
-{
-  static const char modname[] = "tst-tlsmod2.so";
-  int result = 0;
-  int *foop;
-  int (*fp) (int, int *);
-  void *h;
-
-  h = dlopen (modname, RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("cannot open '%s': %s\n", modname, dlerror ());
-      exit (1);
-    }
-
-  fp = dlsym (h, "in_dso");
-  if (fp == NULL)
-    {
-      printf ("cannot get symbol 'in_dso': %s\n", dlerror ());
-      exit (1);
-    }
-
-  result |= fp (0, NULL);
-
-  foop = dlsym (h, "foo");
-  if (foop == NULL)
-    {
-      printf ("cannot get symbol 'foo' the second time: %s\n", dlerror ());
-      exit (1);
-    }
-  if (*foop != 16)
-    {
-      puts ("foo != 16");
-      result = 1;
-    }
-
-  dlclose (h);
-
-  return result;
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls5.c b/elf/tst-tls5.c
deleted file mode 100644
index 5f006fd645..0000000000
--- a/elf/tst-tls5.c
+++ /dev/null
@@ -1,65 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-
-static int
-do_test (void)
-{
-  static const char modname[] = "tst-tlsmod2.so";
-  int result = 0;
-  int *foop;
-  int *foop2;
-  int (*fp) (int, int *);
-  void *h;
-
-  h = dlopen (modname, RTLD_LAZY);
-  if (h == NULL)
-    {
-      printf ("cannot open '%s': %s\n", modname, dlerror ());
-      exit (1);
-    }
-
-  foop = dlsym (h, "foo");
-  if (foop == NULL)
-    {
-      printf ("cannot get symbol 'foo': %s\n", dlerror ());
-      exit (1);
-    }
-
-  *foop = 42;
-
-  fp = dlsym (h, "in_dso");
-  if (fp == NULL)
-    {
-      printf ("cannot get symbol 'in_dso': %s\n", dlerror ());
-      exit (1);
-    }
-
-  result |= fp (42, foop);
-
-  foop2 = dlsym (h, "foo");
-  if (foop2 == NULL)
-    {
-      printf ("cannot get symbol 'foo' the second time: %s\n", dlerror ());
-      exit (1);
-    }
-
-  if (foop != foop2)
-    {
-      puts ("address of 'foo' different the second time");
-      result = 1;
-    }
-  else if (*foop != 16)
-    {
-      puts ("foo != 16");
-      result = 1;
-    }
-
-  dlclose (h);
-
-  return result;
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls6.c b/elf/tst-tls6.c
deleted file mode 100644
index df81c1f6b4..0000000000
--- a/elf/tst-tls6.c
+++ /dev/null
@@ -1,84 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <link.h>
-
-
-static int
-do_test (void)
-{
-  static const char modname[] = "tst-tlsmod2.so";
-  int result = 0;
-  int *foop;
-  int *foop2;
-  int (*fp) (int, int *);
-  void *h;
-  int i;
-  int modid = -1;
-
-  for (i = 0; i < 10; ++i)
-    {
-      h = dlopen (modname, RTLD_LAZY);
-      if (h == NULL)
-	{
-	  printf ("cannot open '%s': %s\n", modname, dlerror ());
-	  exit (1);
-	}
-
-      /* Dirty test code here: we peek into a private data structure.
-	 We make sure that the module gets assigned the same ID every
-	 time.  The value of the first round is used.  */
-      if (modid == -1)
-	modid = ((struct link_map *) h)->l_tls_modid;
-      else if (((struct link_map *) h)->l_tls_modid != modid)
-	{
-	  printf ("round %d: modid now %zd, initially %d\n",
-		  i, ((struct link_map *) h)->l_tls_modid, modid);
-	  result = 1;
-	}
-
-      foop = dlsym (h, "foo");
-      if (foop == NULL)
-	{
-	  printf ("cannot get symbol 'foo': %s\n", dlerror ());
-	  exit (1);
-	}
-
-      *foop = 42 + i;
-
-      fp = dlsym (h, "in_dso");
-      if (fp == NULL)
-	{
-	  printf ("cannot get symbol 'in_dso': %s\n", dlerror ());
-	  exit (1);
-	}
-
-      result |= fp (42 + i, foop);
-
-      foop2 = dlsym (h, "foo");
-      if (foop2 == NULL)
-	{
-	  printf ("cannot get symbol 'foo' the second time: %s\n", dlerror ());
-	  exit (1);
-	}
-
-      if (foop != foop2)
-	{
-	  puts ("address of 'foo' different the second time");
-	  result = 1;
-	}
-      else if (*foop != 16)
-	{
-	  puts ("foo != 16");
-	  result = 1;
-	}
-
-      dlclose (h);
-    }
-
-  return result;
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls7.c b/elf/tst-tls7.c
deleted file mode 100644
index fa46709600..0000000000
--- a/elf/tst-tls7.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <link.h>
-
-
-static int
-do_test (void)
-{
-  static const char modname[] = "tst-tlsmod3.so";
-  int result = 0;
-  int (*fp) (void);
-  void *h;
-  int i;
-  int modid = -1;
-
-  for (i = 0; i < 10; ++i)
-    {
-      h = dlopen (modname, RTLD_LAZY);
-      if (h == NULL)
-	{
-	  printf ("cannot open '%s': %s\n", modname, dlerror ());
-	  exit (1);
-	}
-
-      /* Dirty test code here: we peek into a private data structure.
-	 We make sure that the module gets assigned the same ID every
-	 time.  The value of the first round is used.  */
-      if (modid == -1)
-	modid = ((struct link_map *) h)->l_tls_modid;
-      else if (((struct link_map *) h)->l_tls_modid != (size_t) modid)
-	{
-	  printf ("round %d: modid now %zu, initially %d\n",
-		  i, ((struct link_map *) h)->l_tls_modid, modid);
-	  result = 1;
-	}
-
-      fp = dlsym (h, "in_dso2");
-      if (fp == NULL)
-	{
-	  printf ("cannot get symbol 'in_dso2': %s\n", dlerror ());
-	  exit (1);
-	}
-
-      result |= fp ();
-
-      dlclose (h);
-    }
-
-  return result;
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls8.c b/elf/tst-tls8.c
deleted file mode 100644
index c779572617..0000000000
--- a/elf/tst-tls8.c
+++ /dev/null
@@ -1,167 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <link.h>
-
-
-static int
-do_test (void)
-{
-  static const char modname1[] = "$ORIGIN/tst-tlsmod3.so";
-  static const char modname2[] = "$ORIGIN/tst-tlsmod4.so";
-  int result = 0;
-  int (*fp1) (void);
-  int (*fp2) (int, int *);
-  void *h1;
-  void *h2;
-  int i;
-  size_t modid1 = (size_t) -1;
-  size_t modid2 = (size_t) -1;
-  int *bazp;
-
-  for (i = 0; i < 10; ++i)
-    {
-      h1 = dlopen (modname1, RTLD_LAZY);
-      if (h1 == NULL)
-	{
-	  printf ("cannot open '%s': %s\n", modname1, dlerror ());
-	  exit (1);
-	}
-
-      /* Dirty test code here: we peek into a private data structure.
-	 We make sure that the module gets assigned the same ID every
-	 time.  The value of the first round is used.  */
-      if (modid1 == (size_t) -1)
-	modid1 = ((struct link_map *) h1)->l_tls_modid;
-      else if (((struct link_map *) h1)->l_tls_modid != modid1)
-	{
-	  printf ("round %d: modid now %zd, initially %zd\n",
-		  i, ((struct link_map *) h1)->l_tls_modid, modid1);
-	  result = 1;
-	}
-
-      fp1 = dlsym (h1, "in_dso2");
-      if (fp1 == NULL)
-	{
-	  printf ("cannot get symbol 'in_dso2' in %s\n", modname1);
-	  exit (1);
-	}
-
-      result |= fp1 ();
-
-
-
-      h2 = dlopen (modname2, RTLD_LAZY);
-      if (h2 == NULL)
-	{
-	  printf ("cannot open '%s': %s\n", modname2, dlerror ());
-	  exit (1);
-	}
-
-      /* Dirty test code here: we peek into a private data structure.
-	 We make sure that the module gets assigned the same ID every
-	 time.  The value of the first round is used.  */
-      if (modid2 == (size_t) -1)
-	modid2 = ((struct link_map *) h1)->l_tls_modid;
-      else if (((struct link_map *) h1)->l_tls_modid != modid2)
-	{
-	  printf ("round %d: modid now %zd, initially %zd\n",
-		  i, ((struct link_map *) h1)->l_tls_modid, modid2);
-	  result = 1;
-	}
-
-      bazp = dlsym (h2, "baz");
-      if (bazp == NULL)
-	{
-	  printf ("cannot get symbol 'baz' in %s\n", modname2);
-	  exit (1);
-	}
-
-      *bazp = 42 + i;
-
-      fp2 = dlsym (h2, "in_dso");
-      if (fp2 == NULL)
-	{
-	  printf ("cannot get symbol 'in_dso' in %s\n", modname2);
-	  exit (1);
-	}
-
-      result |= fp2 (42 + i, bazp);
-
-      dlclose (h1);
-      dlclose (h2);
-
-
-      h1 = dlopen (modname1, RTLD_LAZY);
-      if (h1 == NULL)
-	{
-	  printf ("cannot open '%s': %s\n", modname1, dlerror ());
-	  exit (1);
-	}
-
-      /* Dirty test code here: we peek into a private data structure.
-	 We make sure that the module gets assigned the same ID every
-	 time.  The value of the first round is used.  */
-      if (((struct link_map *) h1)->l_tls_modid != modid1)
-	{
-	  printf ("round %d: modid now %zd, initially %zd\n",
-		  i, ((struct link_map *) h1)->l_tls_modid, modid1);
-	  result = 1;
-	}
-
-      fp1 = dlsym (h1, "in_dso2");
-      if (fp1 == NULL)
-	{
-	  printf ("cannot get symbol 'in_dso2' in %s\n", modname1);
-	  exit (1);
-	}
-
-      result |= fp1 ();
-
-
-
-      h2 = dlopen (modname2, RTLD_LAZY);
-      if (h2 == NULL)
-	{
-	  printf ("cannot open '%s': %s\n", modname2, dlerror ());
-	  exit (1);
-	}
-
-      /* Dirty test code here: we peek into a private data structure.
-	 We make sure that the module gets assigned the same ID every
-	 time.  The value of the first round is used.  */
-      if (((struct link_map *) h1)->l_tls_modid != modid2)
-	{
-	  printf ("round %d: modid now %zd, initially %zd\n",
-		  i, ((struct link_map *) h1)->l_tls_modid, modid2);
-	  result = 1;
-	}
-
-      bazp = dlsym (h2, "baz");
-      if (bazp == NULL)
-	{
-	  printf ("cannot get symbol 'baz' in %s\n", modname2);
-	  exit (1);
-	}
-
-      *bazp = 62 + i;
-
-      fp2 = dlsym (h2, "in_dso");
-      if (fp2 == NULL)
-	{
-	  printf ("cannot get symbol 'in_dso' in %s\n", modname2);
-	  exit (1);
-	}
-
-      result |= fp2 (62 + i, bazp);
-
-      /* This time the dlclose calls are in reverse order.  */
-      dlclose (h2);
-      dlclose (h1);
-    }
-
-  return result;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tls9-static.c b/elf/tst-tls9-static.c
deleted file mode 100644
index 51812ccc7d..0000000000
--- a/elf/tst-tls9-static.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-tls9.c"
diff --git a/elf/tst-tls9.c b/elf/tst-tls9.c
deleted file mode 100644
index ee21b47c70..0000000000
--- a/elf/tst-tls9.c
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <link.h>
-
-static int
-do_test (void)
-{
-  static const char modname1[] = "tst-tlsmod5.so";
-  static const char modname2[] = "tst-tlsmod6.so";
-  int result = 0;
-
-  void *h1 = dlopen (modname1, RTLD_LAZY);
-  if (h1 == NULL)
-    {
-      printf ("cannot open '%s': %s\n", modname1, dlerror ());
-      result = 1;
-    }
-  void *h2 = dlopen (modname2, RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      printf ("cannot open '%s': %s\n", modname2, dlerror ());
-      result = 1;
-    }
-
-  if (h1 != NULL)
-    dlclose (h1);
-  if (h2 != NULL)
-    dlclose (h2);
-
-  return result;
-}
-
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tlsalign-extern-static.c b/elf/tst-tlsalign-extern-static.c
deleted file mode 100644
index e84900eee4..0000000000
--- a/elf/tst-tlsalign-extern-static.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-tlsalign-extern.c"
diff --git a/elf/tst-tlsalign-extern.c b/elf/tst-tlsalign-extern.c
deleted file mode 100644
index 11384d085e..0000000000
--- a/elf/tst-tlsalign-extern.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/* Test for large alignment in TLS blocks (extern case), BZ#18383.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/* This is the same as tst-tlsalign-static.c, except that it uses
-   TLS variables that are defined in a separate translation unit
-   (ts-tlsalign-vars.c).  It turned out that the cause of BZ#18383
-   on ARM was actually an ARM assembler bug triggered by the ways of
-   using .tdata/.tbss sections and relocs referring to them that GCC
-   chooses when the variables are defined in the same translation
-   unit that contains the references.  */
-
-extern __thread int tdata1;
-extern __thread int tdata2;
-extern __thread int tdata3;
-extern __thread int tbss1;
-extern __thread int tbss2;
-extern __thread int tbss3;
-
-static int
-test_one (const char *which, unsigned int alignment, int *var, int value)
-{
-  uintptr_t addr = (uintptr_t) var;
-  unsigned int misalign = addr & (alignment - 1);
-
-  printf ("%s TLS address %p %% %u = %u\n",
-	  which, (void *) var, alignment, misalign);
-
-  int got = *var;
-  if (got != value)
-    {
-      printf ("%s value %d should be %d\n", which, got, value);
-      return 1;
-    }
-
-  return misalign != 0;
-}
-
-static int
-do_test (void)
-{
-  int fail = 0;
-
-  fail |= test_one ("tdata1", 4, &tdata1, 1);
-  fail |= test_one ("tdata2", 0x10, &tdata2, 2);
-  fail |= test_one ("tdata3", 0x1000, &tdata3, 4);
-
-  fail |= test_one ("tbss1", 4, &tbss1, 0);
-  fail |= test_one ("tbss2", 0x10, &tbss2, 0);
-  fail |= test_one ("tbss3", 0x1000, &tbss3, 0);
-
-  return fail ? EXIT_FAILURE : EXIT_SUCCESS;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tlsalign-lib.c b/elf/tst-tlsalign-lib.c
deleted file mode 100644
index 4371e581a6..0000000000
--- a/elf/tst-tlsalign-lib.c
+++ /dev/null
@@ -1,6 +0,0 @@
-__thread int mod_tdata1 = 1;
-__thread int mod_tdata2 __attribute__ ((aligned (0x10))) = 2;
-__thread int mod_tdata3 __attribute__ ((aligned (0x1000))) = 4;
-__thread int mod_tbss1;
-__thread int mod_tbss2 __attribute__ ((aligned (0x10)));
-__thread int mod_tbss3 __attribute__ ((aligned (0x1000)));
diff --git a/elf/tst-tlsalign-static.c b/elf/tst-tlsalign-static.c
deleted file mode 100644
index 1671abf28e..0000000000
--- a/elf/tst-tlsalign-static.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define NO_LIB
-#include "tst-tlsalign.c"
diff --git a/elf/tst-tlsalign-vars.c b/elf/tst-tlsalign-vars.c
deleted file mode 100644
index 01b3501d3b..0000000000
--- a/elf/tst-tlsalign-vars.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* This is for tst-tlsalign-extern.c, which see.  It's essential for the
-   purpose of the test that these definitions be in a separate translation
-   unit from the code using the variables.  */
-
-__thread int tdata1 = 1;
-__thread int tdata2 __attribute__ ((aligned (0x10))) = 2;
-__thread int tdata3 __attribute__ ((aligned (0x1000))) = 4;
-__thread int tbss1;
-__thread int tbss2 __attribute__ ((aligned (0x10)));
-__thread int tbss3 __attribute__ ((aligned (0x1000)));
-
-/* This function is never called.  But its presence in this translation
-   unit makes GCC emit the variables above in the order defined (perhaps
-   because it's the order in which they're used here?) rather than
-   reordering them into descending order of alignment requirement--and so
-   keeps it more similar to the tst-tlsalign-static.c case--just in case
-   that affects the bug (though there is no evidence that it does).  */
-
-void
-unused (void)
-{
-  tdata1 = -1;
-  tdata2 = -2;
-  tdata3 = -3;
-  tbss1 = -4;
-  tbss2 = -5;
-  tbss3 = -6;
-}
diff --git a/elf/tst-tlsalign.c b/elf/tst-tlsalign.c
deleted file mode 100644
index b129ebda0e..0000000000
--- a/elf/tst-tlsalign.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Test for large alignment in TLS blocks, BZ#18383.
-   Copyright (C) 2015-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static __thread int tdata1 = 1;
-static __thread int tdata2 __attribute__ ((aligned (0x10))) = 2;
-static __thread int tdata3 __attribute__ ((aligned (0x1000))) = 4;
-static __thread int tbss1;
-static __thread int tbss2 __attribute__ ((aligned (0x10)));
-static __thread int tbss3 __attribute__ ((aligned (0x1000)));
-
-#ifndef NO_LIB
-extern __thread int mod_tdata1;
-extern __thread int mod_tdata2;
-extern __thread int mod_tdata3;
-extern __thread int mod_tbss1;
-extern __thread int mod_tbss2;
-extern __thread int mod_tbss3;
-#endif
-
-static int
-test_one (const char *which, unsigned int alignment, int *var, int value)
-{
-  uintptr_t addr = (uintptr_t) var;
-  unsigned int misalign = addr & (alignment - 1);
-
-  printf ("%s TLS address %p %% %u = %u\n",
-          which, (void *) var, alignment, misalign);
-
-  int got = *var;
-  if (got != value)
-    {
-      printf ("%s value %d should be %d\n", which, got, value);
-      return 1;
-    }
-
-  return misalign != 0;
-}
-
-static int
-do_test (void)
-{
-  int fail = 0;
-
-  fail |= test_one ("tdata1", 4, &tdata1, 1);
-  fail |= test_one ("tdata2", 0x10, &tdata2, 2);
-  fail |= test_one ("tdata3", 0x1000, &tdata3, 4);
-
-  fail |= test_one ("tbss1", 4, &tbss1, 0);
-  fail |= test_one ("tbss2", 0x10, &tbss2, 0);
-  fail |= test_one ("tbss3", 0x1000, &tbss3, 0);
-
-#ifndef NO_LIB
-  fail |= test_one ("mod_tdata1", 4, &mod_tdata1, 1);
-  fail |= test_one ("mod_tdata2", 0x10, &mod_tdata2, 2);
-  fail |= test_one ("mod_tdata3", 0x1000, &mod_tdata3, 4);
-
-  fail |= test_one ("mod_tbss1", 4, &mod_tbss1, 0);
-  fail |= test_one ("mod_tbss2", 0x10, &mod_tbss2, 0);
-  fail |= test_one ("mod_tbss3", 0x1000, &mod_tbss3, 0);
-#endif
-
-  return fail ? EXIT_FAILURE : EXIT_SUCCESS;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-tlsmod1.c b/elf/tst-tlsmod1.c
deleted file mode 100644
index 8d9156791b..0000000000
--- a/elf/tst-tlsmod1.c
+++ /dev/null
@@ -1,62 +0,0 @@
-#include <stdio.h>
-
-#include "tls-macros.h"
-
-
-/* One define int variable, two externs.  */
-COMMON_INT_DEF(foo);
-VAR_INT_DEF(bar);
-VAR_INT_DECL(baz);
-
-extern int in_dso (void);
-
-int
-in_dso (void)
-{
-  int result = 0;
-  int *ap, *bp, *cp;
-
-  /* Get variables using initial exec model.  */
-  fputs ("get sum of foo and bar (IE)", stdout);
-  asm ("" ::: "memory");
-  ap = TLS_IE (foo);
-  bp = TLS_IE (bar);
-  printf (" = %d\n", *ap + *bp);
-  result |= *ap + *bp != 3;
-  if (*ap != 1)
-    {
-      printf ("foo = %d\n", *ap);
-      result = 1;
-    }
-  if (*bp != 2)
-    {
-      printf ("bar = %d\n", *bp);
-      result = 1;
-    }
-
-
-  /* Get variables using generic dynamic model.  */
-  fputs ("get sum of foo and bar and baz (GD)", stdout);
-  ap = TLS_GD (foo);
-  bp = TLS_GD (bar);
-  cp = TLS_GD (baz);
-  printf (" = %d\n", *ap + *bp + *cp);
-  result |= *ap + *bp + *cp != 6;
-  if (*ap != 1)
-    {
-      printf ("foo = %d\n", *ap);
-      result = 1;
-    }
-  if (*bp != 2)
-    {
-      printf ("bar = %d\n", *bp);
-      result = 1;
-    }
-  if (*cp != 3)
-    {
-      printf ("baz = %d\n", *cp);
-      result = 1;
-    }
-
-  return result;
-}
diff --git a/elf/tst-tlsmod10.c b/elf/tst-tlsmod10.c
deleted file mode 100644
index 32e54f3c04..0000000000
--- a/elf/tst-tlsmod10.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "tst-tlsmod8.c"
diff --git a/elf/tst-tlsmod11.c b/elf/tst-tlsmod11.c
deleted file mode 100644
index cffbd68edc..0000000000
--- a/elf/tst-tlsmod11.c
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "tst-tls10.h"
-
-__thread struct A a1 = { 4, 5, 6 };
-__thread struct A a2 = { 7, 8, 9 };
diff --git a/elf/tst-tlsmod12.c b/elf/tst-tlsmod12.c
deleted file mode 100644
index d0be51891a..0000000000
--- a/elf/tst-tlsmod12.c
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "tst-tls10.h"
-
-extern __thread struct A a2 __attribute__((tls_model("initial-exec")));
-
-void
-check1 (void)
-{
-  if (a1.a != 4 || a1.b != 5 || a1.c != 6)
-    abort ();
-  if (a2.a != 7 || a2.b != 8 || a2.c != 9)
-    abort ();
-}
diff --git a/elf/tst-tlsmod13.c b/elf/tst-tlsmod13.c
deleted file mode 100644
index 7712d8b8c8..0000000000
--- a/elf/tst-tlsmod13.c
+++ /dev/null
@@ -1,7 +0,0 @@
-__thread int a[2] __attribute__ ((tls_model ("initial-exec")));
-
-int
-foo (void)
-{
-  return a[0];
-}
diff --git a/elf/tst-tlsmod13a.c b/elf/tst-tlsmod13a.c
deleted file mode 100644
index ca4eaccbff..0000000000
--- a/elf/tst-tlsmod13a.c
+++ /dev/null
@@ -1,9 +0,0 @@
-__thread int b[2] __attribute__ ((tls_model ("initial-exec")));
-
-extern int foo (void);
-
-int
-bar (void)
-{
-  return foo () + b[0];
-}
diff --git a/elf/tst-tlsmod14a.c b/elf/tst-tlsmod14a.c
deleted file mode 100644
index 824c06d1f9..0000000000
--- a/elf/tst-tlsmod14a.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <stdint.h>
-#include <stdio.h>
-
-#define AL 4096
-struct foo
-{
-  int i;
-} __attribute ((aligned (AL)));
-
-static __thread struct foo f;
-static struct foo g;
-
-
-#ifndef FCT
-# define FCT in_dso1
-#endif
-
-
-int
-FCT (void)
-{
-  puts (__func__);
-
-  int result = 0;
-
-  int fail = (((uintptr_t) &f) & (AL - 1)) != 0;
-  printf ("&f = %p %s\n", &f, fail ? "FAIL" : "OK");
-  result |= fail;
-
-  fail = (((uintptr_t) &g) & (AL - 1)) != 0;
-  printf ("&g = %p %s\n", &g, fail ? "FAIL" : "OK");
-  result |= fail;
-
-  return result;
-}
diff --git a/elf/tst-tlsmod14b.c b/elf/tst-tlsmod14b.c
deleted file mode 100644
index 24d9ceaf7e..0000000000
--- a/elf/tst-tlsmod14b.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define FCT in_dso2
-#include "tst-tlsmod14a.c"
diff --git a/elf/tst-tlsmod15a.c b/elf/tst-tlsmod15a.c
deleted file mode 100644
index 66c707129a..0000000000
--- a/elf/tst-tlsmod15a.c
+++ /dev/null
@@ -1,6 +0,0 @@
-extern int nonexistent_dummy_var;
-int *
-foo (void)
-{
-  return &nonexistent_dummy_var;
-}
diff --git a/elf/tst-tlsmod15b.c b/elf/tst-tlsmod15b.c
deleted file mode 100644
index b37283686a..0000000000
--- a/elf/tst-tlsmod15b.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "tst-tls10.h"
-
-__thread int mod15b_var __attribute__((tls_model("initial-exec")));
-
-int
-in_dso (void)
-{
-  return mod15b_var;
-}
diff --git a/elf/tst-tlsmod16a.c b/elf/tst-tlsmod16a.c
deleted file mode 100644
index 4ec6a6c37d..0000000000
--- a/elf/tst-tlsmod16a.c
+++ /dev/null
@@ -1 +0,0 @@
-int __thread tlsvar;
diff --git a/elf/tst-tlsmod16b.c b/elf/tst-tlsmod16b.c
deleted file mode 100644
index 1ecba26dbe..0000000000
--- a/elf/tst-tlsmod16b.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern __thread int tlsvar __attribute__((tls_model("initial-exec")));
-
-void *
-in_dso (void)
-{
-  return &tlsvar;
-}
diff --git a/elf/tst-tlsmod17a.c b/elf/tst-tlsmod17a.c
deleted file mode 100644
index 24c84a1590..0000000000
--- a/elf/tst-tlsmod17a.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <stdio.h>
-
-#ifndef N
-#define N 0
-#endif
-#define CONCAT1(s, n) s##n
-#define CONCAT(s, n) CONCAT1(s, n)
-
-__thread int CONCAT (v, N) = 4;
-
-int
-CONCAT (tlsmod17a, N) (void)
-{
-  int *p = &CONCAT (v, N);
-  /* GCC assumes &var is never NULL, add optimization barrier.  */
-  asm volatile ("" : "+r" (p));
-  if (p == NULL || *p != 4)
-    {
-      printf ("fail %d %p\n", N, p);
-      return 1;
-    }
-  return 0;
-}
diff --git a/elf/tst-tlsmod17b.c b/elf/tst-tlsmod17b.c
deleted file mode 100644
index 6178828737..0000000000
--- a/elf/tst-tlsmod17b.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#define P(N) extern int tlsmod17a##N (void);
-#define PS P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) \
-	   P(10) P(12) P(13) P(14) P(15) P(16) P(17) P(18) P(19)
-PS
-#undef P
-
-int
-tlsmod17b (void)
-{
-  int res = 0;
-#define P(N) res |= tlsmod17a##N ();
-  PS
-#undef P
-  return res;
-}
diff --git a/elf/tst-tlsmod18a.c b/elf/tst-tlsmod18a.c
deleted file mode 100644
index 1d728daa05..0000000000
--- a/elf/tst-tlsmod18a.c
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <stdio.h>
-
-#ifndef N
-# define N 0
-#endif
-
-static __thread int var = 4;
-
-int
-test (void)
-{
-  int *p = &var;
-  /* GCC assumes &var is never NULL, add optimization barrier.  */
-  asm volatile ("" : "+r" (p));
-  if (p == NULL || *p != 4)
-    {
-      printf ("fail %d %p\n", N, p);
-      return 1;
-    }
-  return 0;
-}
diff --git a/elf/tst-tlsmod2.c b/elf/tst-tlsmod2.c
deleted file mode 100644
index 40eb1407f8..0000000000
--- a/elf/tst-tlsmod2.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-
-#include "tls-macros.h"
-
-
-COMMON_INT_DEF(foo);
-
-
-int
-in_dso (int n, int *caller_foop)
-{
-  int *foop;
-  int result = 0;
-
-  puts ("foo");			/* Make sure PLT is used before macros.  */
-  asm ("" ::: "memory");
-
-  foop = TLS_GD (foo);
-
-  if (caller_foop != NULL && foop != caller_foop)
-    {
-      printf ("callers address of foo differs: %p vs %p\n", caller_foop, foop);
-      result = 1;
-    }
-  else if (*foop != n)
-    {
-      printf ("foo != %d\n", n);
-      result = 1;
-    }
-
-  *foop = 16;
-
-  return result;
-}
diff --git a/elf/tst-tlsmod3.c b/elf/tst-tlsmod3.c
deleted file mode 100644
index 6d186c47ee..0000000000
--- a/elf/tst-tlsmod3.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <stdio.h>
-
-#include "tls-macros.h"
-
-extern int in_dso (int n, int *caller_foop);
-
-COMMON_INT_DEF(comm_n);
-
-
-
-
-int
-in_dso2 (void)
-{
-  int *foop;
-  int result = 0;
-  static int n;
-  int *np;
-
-  puts ("foo");			/* Make sure PLT is used before macros.  */
-  asm ("" ::: "memory");
-
-  foop = TLS_GD (foo);
-  np = TLS_GD (comm_n);
-
-  if (n != *np)
-    {
-      printf ("n = %d != comm_n = %d\n", n, *np);
-      result = 1;
-    }
-
-  result |= in_dso (*foop = 42 + n++, foop);
-
-  *foop = 16;
-
-  return result;
-}
diff --git a/elf/tst-tlsmod4.c b/elf/tst-tlsmod4.c
deleted file mode 100644
index 86889aac7e..0000000000
--- a/elf/tst-tlsmod4.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-
-#include "tls-macros.h"
-
-
-COMMON_INT_DEF(baz);
-
-
-int
-in_dso (int n, int *caller_bazp)
-{
-  int *bazp;
-  int result = 0;
-
-  puts ("foo");			/* Make sure PLT is used before macros.  */
-  asm ("" ::: "memory");
-
-  bazp = TLS_GD (baz);
-
-  if (caller_bazp != NULL && bazp != caller_bazp)
-    {
-      printf ("callers address of baz differs: %p vs %p\n", caller_bazp, bazp);
-      result = 1;
-    }
-  else if (*bazp != n)
-    {
-      printf ("baz != %d\n", n);
-      result = 1;
-    }
-
-  *bazp = 16;
-
-  return result;
-}
diff --git a/elf/tst-tlsmod5.c b/elf/tst-tlsmod5.c
deleted file mode 100644
index a97c7e5e0c..0000000000
--- a/elf/tst-tlsmod5.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "tls-macros.h"
-
-COMMON_INT_DEF(foo);
diff --git a/elf/tst-tlsmod6.c b/elf/tst-tlsmod6.c
deleted file mode 100644
index e968596dd4..0000000000
--- a/elf/tst-tlsmod6.c
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "tls-macros.h"
-
-COMMON_INT_DEF(bar);
diff --git a/elf/tst-tlsmod7.c b/elf/tst-tlsmod7.c
deleted file mode 100644
index 3df7907bcf..0000000000
--- a/elf/tst-tlsmod7.c
+++ /dev/null
@@ -1,101 +0,0 @@
-#include "tst-tls10.h"
-
-__thread int dummy __attribute__((visibility ("hidden"))) = 12;
-__thread struct A a1 = { 4, 5, 6 };
-__thread struct A a2 = { 7, 8, 9 };
-__thread struct A a3 __attribute__((tls_model("initial-exec")))
-  = { 10, 11, 12 };
-__thread struct A a4 __attribute__((tls_model("initial-exec")))
-  = { 13, 14, 15 };
-static __thread struct A local1 = { 16, 17, 18 };
-static __thread struct A local2 __attribute__((tls_model("initial-exec")))
-  = { 19, 20, 21 };
-
-void
-check1 (void)
-{
-  if (a1.a != 4 || a1.b != 5 || a1.c != 6)
-    abort ();
-  if (a2.a != 22 || a2.b != 23 || a2.c != 24)
-    abort ();
-  if (a3.a != 10 || a3.b != 11 || a3.c != 12)
-    abort ();
-  if (a4.a != 25 || a4.b != 26 || a4.c != 27)
-    abort ();
-  if (local1.a != 16 || local1.b != 17 || local1.c != 18)
-    abort ();
-  if (local2.a != 19 || local2.b != 20 || local2.c != 21)
-    abort ();
-}
-
-struct A *
-f1a (void)
-{
-  return &a1;
-}
-
-struct A *
-f2a (void)
-{
-  return &a2;
-}
-
-struct A *
-f3a (void)
-{
-  return &a3;
-}
-
-struct A *
-f4a (void)
-{
-  return &a4;
-}
-
-struct A *
-f5a (void)
-{
-  return &local1;
-}
-
-struct A *
-f6a (void)
-{
-  return &local2;
-}
-
-int
-f1b (void)
-{
-  return a1.a;
-}
-
-int
-f2b (void)
-{
-  return a2.b;
-}
-
-int
-f3b (void)
-{
-  return a3.c;
-}
-
-int
-f4b (void)
-{
-  return a4.a;
-}
-
-int
-f5b (void)
-{
-  return local1.b;
-}
-
-int
-f6b (void)
-{
-  return local2.c;
-}
diff --git a/elf/tst-tlsmod8.c b/elf/tst-tlsmod8.c
deleted file mode 100644
index 89772ac42f..0000000000
--- a/elf/tst-tlsmod8.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include "tst-tls10.h"
-
-__thread long long dummy __attribute__((visibility ("hidden"))) = 12;
-__thread struct A a2 = { 22, 23, 24 };
-__thread struct A a4 __attribute__((tls_model("initial-exec")))
-  = { 25, 26, 27 };
-static __thread struct A local1 = { 28, 29, 30 };
-static __thread struct A local2 __attribute__((tls_model("initial-exec")))
-  = { 31, 32, 33 };
-
-void
-check2 (void)
-{
-  if (a2.a != 22 || a2.b != 23 || a2.c != 24)
-    abort ();
-  if (a4.a != 25 || a4.b != 26 || a4.c != 27)
-    abort ();
-  if (local1.a != 28 || local1.b != 29 || local1.c != 30)
-    abort ();
-  if (local2.a != 31 || local2.b != 32 || local2.c != 33)
-    abort ();
-}
-
-struct A *
-f7a (void)
-{
-  return &a2;
-}
-
-struct A *
-f8a (void)
-{
-  return &a4;
-}
-
-struct A *
-f9a (void)
-{
-  return &local1;
-}
-
-struct A *
-f10a (void)
-{
-  return &local2;
-}
-
-int
-f7b (void)
-{
-  return a2.b;
-}
-
-int
-f8b (void)
-{
-  return a4.a;
-}
-
-int
-f9b (void)
-{
-  return local1.b;
-}
-
-int
-f10b (void)
-{
-  return local2.c;
-}
diff --git a/elf/tst-tlsmod9.c b/elf/tst-tlsmod9.c
deleted file mode 100644
index 6b11ed58b8..0000000000
--- a/elf/tst-tlsmod9.c
+++ /dev/null
@@ -1,99 +0,0 @@
-#include "tst-tls10.h"
-
-__thread int dummy __attribute__((visibility ("hidden"))) = 12;
-__thread struct A a1 = { 4, 5, 6 };
-__thread struct A a3 __attribute__((tls_model("initial-exec")))
-  = { 10, 11, 12 };
-extern __thread struct A a4 __attribute__((tls_model("initial-exec")));
-static __thread struct A local1 = { 16, 17, 18 };
-static __thread struct A local2 __attribute__((tls_model("initial-exec")))
-  = { 19, 20, 21 };
-
-void
-check1 (void)
-{
-  if (a1.a != 4 || a1.b != 5 || a1.c != 6)
-    abort ();
-  if (a2.a != 22 || a2.b != 23 || a2.c != 24)
-    abort ();
-  if (a3.a != 10 || a3.b != 11 || a3.c != 12)
-    abort ();
-  if (a4.a != 25 || a4.b != 26 || a4.c != 27)
-    abort ();
-  if (local1.a != 16 || local1.b != 17 || local1.c != 18)
-    abort ();
-  if (local2.a != 19 || local2.b != 20 || local2.c != 21)
-    abort ();
-}
-
-struct A *
-f1a (void)
-{
-  return &a1;
-}
-
-struct A *
-f2a (void)
-{
-  return &a2;
-}
-
-struct A *
-f3a (void)
-{
-  return &a3;
-}
-
-struct A *
-f4a (void)
-{
-  return &a4;
-}
-
-struct A *
-f5a (void)
-{
-  return &local1;
-}
-
-struct A *
-f6a (void)
-{
-  return &local2;
-}
-
-int
-f1b (void)
-{
-  return a1.a;
-}
-
-int
-f2b (void)
-{
-  return a2.b;
-}
-
-int
-f3b (void)
-{
-  return a3.c;
-}
-
-int
-f4b (void)
-{
-  return a4.a;
-}
-
-int
-f5b (void)
-{
-  return local1.b;
-}
-
-int
-f6b (void)
-{
-  return local2.c;
-}
diff --git a/elf/tst-unique1.c b/elf/tst-unique1.c
deleted file mode 100644
index b5e53e49a0..0000000000
--- a/elf/tst-unique1.c
+++ /dev/null
@@ -1,73 +0,0 @@
-#include <config.h>
-#include <dlfcn.h>
-#include <stdio.h>
-#include <sys/mman.h>
-
-static int
-do_test (void)
-{
-  void *h1 = dlopen ("tst-unique1mod1.so", RTLD_LAZY);
-  if (h1 == NULL)
-    {
-      puts ("cannot load tst-unique1mod1");
-      return 1;
-    }
-  int *(*f1) (void) = dlsym (h1, "f");
-  if (f1 == NULL)
-    {
-      puts ("cannot locate f in tst-unique1mod1");
-      return 1;
-    }
-  void *h2 = dlopen ("tst-unique1mod2.so", RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      puts ("cannot load tst-unique1mod2");
-      return 1;
-    }
-  int (*f2) (int *) = dlsym (h2, "f");
-  if (f2 == NULL)
-    {
-      puts ("cannot locate f in tst-unique1mod2");
-      return 1;
-    }
-  if (f2 (f1 ()))
-    {
-      puts ("f from tst-unique1mod2 failed");
-      return 1;
-    }
-  dlclose (h2);
-  dlclose (h1);
-  mmap (NULL, 1024 * 1024 * 16, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-  h2 = dlopen ("tst-unique1mod2.so", RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      puts ("cannot load tst-unique1mod2");
-      return 1;
-    }
-  f2 = dlsym (h2, "f");
-  if (f2 == NULL)
-    {
-      puts ("cannot locate f in tst-unique1mod2");
-      return 1;
-    }
-  h1 = dlopen ("tst-unique1mod1.so", RTLD_LAZY);
-  if (h1 == NULL)
-    {
-      puts ("cannot load tst-unique1mod1");
-      return 1;
-    }
-  f1 = dlsym (h1, "f");
-  if (f1 == NULL)
-    {
-      puts ("cannot locate f in tst-unique1mod1");
-      return 1;
-    }
-  if (f2 (f1 ()))
-    {
-      puts ("f from tst-unique1mod2 failed");
-      return 1;
-    }
-  return 0;
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-unique1mod1.c b/elf/tst-unique1mod1.c
deleted file mode 100644
index 84b1f908d6..0000000000
--- a/elf/tst-unique1mod1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <config.h>
-
-asm (".data;"
-     ".globl var\n"
-     ".type var, %gnu_unique_object\n"
-     ".size var, 4\n"
-     "var:.zero 4\n"
-     ".previous");
-extern int var;
-
-int *
-f (void)
-{
-  var = 1;
-  return &var;
-}
diff --git a/elf/tst-unique1mod2.c b/elf/tst-unique1mod2.c
deleted file mode 100644
index 126ca1ac6c..0000000000
--- a/elf/tst-unique1mod2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <config.h>
-
-asm (".data;"
-     ".globl var\n"
-     ".type var, %gnu_unique_object\n"
-     ".size var, 4\n"
-     "var:.zero 4\n"
-     ".previous");
-extern int var;
-
-int
-f (int *p)
-{
-  return &var != p || *p != 1;
-}
diff --git a/elf/tst-unique2.c b/elf/tst-unique2.c
deleted file mode 100644
index e0173b7bcc..0000000000
--- a/elf/tst-unique2.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <config.h>
-#include <dlfcn.h>
-#include <stdio.h>
-
-extern int var;
-
-static int
-do_test (void)
-{
-  var = 1;
-
-  void *h = dlopen ("tst-unique2mod2.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("cannot load tst-unique2mod2");
-      return 1;
-    }
-  int (*f) (int *) = dlsym (h, "f");
-  if (f == NULL)
-    {
-      puts ("cannot locate f in tst-unique2mod2");
-      return 1;
-    }
-  return f (&var);
-}
-
-#include <support/test-driver.c>
diff --git a/elf/tst-unique2mod1.c b/elf/tst-unique2mod1.c
deleted file mode 100644
index 7cdb0eb0a0..0000000000
--- a/elf/tst-unique2mod1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <config.h>
-
-asm (".data;"
-     ".globl var\n"
-     ".type var, %gnu_unique_object\n"
-     ".size var, 4\n"
-     "var:.zero 4\n"
-     ".previous");
diff --git a/elf/tst-unique2mod2.c b/elf/tst-unique2mod2.c
deleted file mode 100644
index 126ca1ac6c..0000000000
--- a/elf/tst-unique2mod2.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <config.h>
-
-asm (".data;"
-     ".globl var\n"
-     ".type var, %gnu_unique_object\n"
-     ".size var, 4\n"
-     "var:.zero 4\n"
-     ".previous");
-extern int var;
-
-int
-f (int *p)
-{
-  return &var != p || *p != 1;
-}
diff --git a/elf/tst-unique3.cc b/elf/tst-unique3.cc
deleted file mode 100644
index efdd6d78c2..0000000000
--- a/elf/tst-unique3.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "tst-unique3.h"
-
-#include <cstdio>
-#include "../dlfcn/dlfcn.h"
-
-int t = S<char>::i;
-
-int
-main (void)
-{
-  std::printf ("%d %d\n", S<char>::i, t);
-  int result = S<char>::i++ != 1 || t != 1;
-  result |= in_lib ();
-  void *d = dlopen ("$ORIGIN/tst-unique3lib2.so", RTLD_LAZY);
-  int (*fp) ();
-  if (d == NULL || (fp = (int(*)()) dlsym (d, "in_lib2")) == NULL)
-    {
-      std::printf ("failed to get symbol in_lib2\n");
-      return 1;
-    }
-  result |= fp ();
-  dlclose (d);
-  return result;
-}
diff --git a/elf/tst-unique3.h b/elf/tst-unique3.h
deleted file mode 100644
index 716d23641c..0000000000
--- a/elf/tst-unique3.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// BZ 12510
-template<typename T>
-struct S
-{
-  static int i;
-};
-
-extern int in_lib (void);
diff --git a/elf/tst-unique3lib.cc b/elf/tst-unique3lib.cc
deleted file mode 100644
index fa8e85a36c..0000000000
--- a/elf/tst-unique3lib.cc
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <cstdio>
-#include "tst-unique3.h"
-template<typename T> int S<T>::i = 1;
-static int i = S<char>::i;
-
-int
-in_lib (void)
-{
-  std::printf ("in_lib: %d %d\n", S<char>::i, i);
-  return S<char>::i++ != 2 || i != 1;
-}
diff --git a/elf/tst-unique3lib2.cc b/elf/tst-unique3lib2.cc
deleted file mode 100644
index 17d817e12e..0000000000
--- a/elf/tst-unique3lib2.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <cstdio>
-#include "tst-unique3.h"
-
-template<typename T> int S<T>::i;
-
-extern "C"
-int
-in_lib2 ()
-{
-  std::printf ("in_lib2: %d\n", S<char>::i);
-  return S<char>::i != 3;
-}
diff --git a/elf/tst-unique4.cc b/elf/tst-unique4.cc
deleted file mode 100644
index 575c70d3a1..0000000000
--- a/elf/tst-unique4.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// BZ 12511
-#include "tst-unique4.h"
-
-#include <cstdio>
-
-static int a[24] =
-  {
-    S<1>::i, S<2>::i, S<3>::i, S<4>::i, S<5>::i, S<6>::i, S<7>::i, S<8>::i,
-    S<9>::i, S<10>::i, S<11>::i, S<12>::i, S<13>::i, S<14>::i, S<15>::i,
-    S<16>::i, S<17>::i, S<18>::i, S<19>::i, S<20>::i, S<21>::i, S<22>::i,
-    S<23>::i, S<24>::i
-  };
-
-int
-main (void)
-{
-  int result = 0;
-  for (int i = 0; i < 24; ++i)
-    {
-      printf("%d ", a[i]);
-      result |= a[i] != i + 1;
-    }
-
-  printf("\n%d\n", S<1>::j);
-  result |= S<1>::j != -1;
-
-  return result;
-}
diff --git a/elf/tst-unique4.h b/elf/tst-unique4.h
deleted file mode 100644
index 2d377f5d51..0000000000
--- a/elf/tst-unique4.h
+++ /dev/null
@@ -1,7 +0,0 @@
-// BZ 12511
-template<int N>
-struct S
-{
-  static int i;
-  static const int j;
-};
diff --git a/elf/tst-unique4lib.cc b/elf/tst-unique4lib.cc
deleted file mode 100644
index 17a7cdf567..0000000000
--- a/elf/tst-unique4lib.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// BZ 12511
-#include "tst-unique4.h"
-
-template<int N>
-int S<N>::i = N;
-template<int N>
-const int S<N>::j __attribute__ ((used)) = -1;
-
-static int a[24] __attribute__ ((used)) =
-  {
-    S<1>::i, S<2>::i, S<3>::i, S<4>::i, S<5>::i, S<6>::i, S<7>::i, S<8>::i,
-    S<9>::i, S<10>::i, S<11>::i, S<12>::i, S<13>::i, S<14>::i, S<15>::i,
-    S<16>::i, S<17>::i, S<18>::i, S<19>::i, S<20>::i, S<21>::i, S<22>::i,
-    S<23>::i, S<24>::i
-  };
-
-static int b __attribute__ ((used)) = S<1>::j;
diff --git a/elf/unload.c b/elf/unload.c
deleted file mode 100644
index 4566f226f8..0000000000
--- a/elf/unload.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Test for unloading (really unmapping) of objects.  By Franz Sirl.
-   This test does not have to passed in all dlopen() et.al. implementation
-   since it is not required the unloading actually happens.  But we
-   require it for glibc.  */
-
-#include <dlfcn.h>
-#include <link.h>
-#include <mcheck.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#define MAPS ((struct link_map *) _r_debug.r_map)
-
-#define OUT \
-  for (map = MAPS; map != NULL; map = map->l_next)			      \
-    if (map->l_type == lt_loaded)					      \
-      printf ("name = \"%s\", direct_opencount = %d\n",			      \
-	      map->l_name, (int) map->l_direct_opencount);		      \
-  fflush (stdout)
-
-typedef struct
-{
-  void *next;
-} strct;
-
-int
-main (void)
-{
-   void *sohandle;
-   strct *testdat;
-   int ret;
-   int result = 0;
-   struct link_map *map;
-
-   mtrace ();
-
-   puts ("\nBefore");
-   OUT;
-
-   sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL);
-   if (sohandle == NULL)
-     {
-       printf ("*** first dlopen failed: %s\n", dlerror ());
-       exit (1);
-     }
-
-   puts ("\nAfter loading unloadmod.so");
-   OUT;
-
-   testdat = dlsym (sohandle, "testdat");
-   testdat->next = (void *) -1;
-
-   ret = dlclose (sohandle);
-   if (ret != 0)
-     {
-       puts ("*** first dlclose failed");
-       result = 1;
-     }
-
-   puts ("\nAfter closing unloadmod.so");
-   OUT;
-
-   sohandle = dlopen ("unloadmod.so", RTLD_NOW | RTLD_GLOBAL);
-   if (sohandle == NULL)
-     {
-       printf ("*** second dlopen failed: %s\n", dlerror ());
-       exit (1);
-     }
-
-   puts ("\nAfter loading unloadmod.so the second time");
-   OUT;
-
-   testdat = dlsym (sohandle, "testdat");
-   if (testdat->next == (void *) -1)
-     {
-       puts ("*** testdat->next == (void *) -1");
-       result = 1;
-     }
-
-   ret = dlclose (sohandle);
-   if (ret != 0)
-     {
-       puts ("*** second dlclose failed");
-       result = 1;
-     }
-
-   puts ("\nAfter closing unloadmod.so again");
-   OUT;
-
-   return result;
-}
diff --git a/elf/unload2.c b/elf/unload2.c
deleted file mode 100644
index eef2bfd426..0000000000
--- a/elf/unload2.c
+++ /dev/null
@@ -1,59 +0,0 @@
-#include <dlfcn.h>
-#include <elf.h>
-#include <errno.h>
-#include <error.h>
-#include <link.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#define MAPS ((struct link_map *) _r_debug.r_map)
-
-#define OUT \
-  for (map = MAPS; map != NULL; map = map->l_next)			      \
-    if (map->l_type == lt_loaded)					      \
-      printf ("name = \"%s\", direct_opencount = %d\n",			      \
-	      map->l_name, (int) map->l_direct_opencount);		      \
-  fflush (stdout)
-
-int
-main (void)
-{
-  void *h[3];
-  struct link_map *map;
-  void (*fp) (void);
-
-  h[0] = dlopen ("unload2mod.so", RTLD_LAZY);
-  h[1] = dlopen ("unload2mod.so", RTLD_LAZY);
-  if (h[0] == NULL || h[1] == NULL)
-    error (EXIT_FAILURE, errno, "cannot load \"unload2mod.so\"");
-  h[2] = dlopen ("unload2dep.so", RTLD_LAZY);
-  if (h[2] == NULL)
-    error (EXIT_FAILURE, errno, "cannot load \"unload2dep.so\"");
-
-  puts ("\nAfter loading everything:");
-  OUT;
-
-  dlclose (h[0]);
-
-  puts ("\nAfter unloading \"unload2mod.so\" once:");
-  OUT;
-
-  dlclose (h[1]);
-
-  puts ("\nAfter unloading \"unload2mod.so\" twice:");
-  OUT;
-
-  fp = dlsym (h[2], "foo");
-  puts ("\nnow calling `foo'");
-  fflush (stdout);
-  fp ();
-  puts ("managed to call `foo'");
-  fflush (stdout);
-
-  dlclose (h[2]);
-
-  puts ("\nAfter unloading \"unload2dep.so\":");
-  OUT;
-
-  return 0;
-}
diff --git a/elf/unload2dep.c b/elf/unload2dep.c
deleted file mode 100644
index 0d319515d5..0000000000
--- a/elf/unload2dep.c
+++ /dev/null
@@ -1,6 +0,0 @@
-extern void foo (void);
-
-void
-foo (void)
-{
-}
diff --git a/elf/unload2mod.c b/elf/unload2mod.c
deleted file mode 100644
index 9c2ea586bc..0000000000
--- a/elf/unload2mod.c
+++ /dev/null
@@ -1,8 +0,0 @@
-extern void foo (void);
-extern void bar (void);
-
-void
-bar (void)
-{
-  foo ();
-}
diff --git a/elf/unload3.c b/elf/unload3.c
deleted file mode 100644
index 6f1af707e6..0000000000
--- a/elf/unload3.c
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-main (void)
-{
-  void *g = dlopen ("unload3mod1.so", RTLD_GLOBAL | RTLD_NOW);
-  void *h = dlopen ("unload3mod2.so", RTLD_GLOBAL | RTLD_NOW);
-  if (g == NULL || h == NULL)
-    {
-      printf ("dlopen unload3mod{1,2}.so failed: %p %p\n", g, h);
-      return 1;
-    }
-  dlclose (h);
-  dlclose (g);
-
-  g = dlopen ("unload3mod3.so", RTLD_GLOBAL | RTLD_NOW);
-  h = dlopen ("unload3mod4.so", RTLD_GLOBAL | RTLD_NOW);
-  if (g == NULL || h == NULL)
-    {
-      printf ("dlopen unload3mod{3,4}.so failed: %p %p\n", g, h);
-      return 1;
-    }
-
-  int (*fn) (int);
-  fn = dlsym (h, "bar");
-  if (fn == NULL)
-    {
-      puts ("dlsym failed");
-      return 1;
-    }
-
-  int val = fn (16);
-  if (val != 24)
-    {
-      printf ("bar returned %d != 24\n", val);
-      return 1;
-    }
-
-  return 0;
-}
diff --git a/elf/unload3mod1.c b/elf/unload3mod1.c
deleted file mode 100644
index e886b11c18..0000000000
--- a/elf/unload3mod1.c
+++ /dev/null
@@ -1 +0,0 @@
-int dummy1;
diff --git a/elf/unload3mod2.c b/elf/unload3mod2.c
deleted file mode 100644
index 03252a523b..0000000000
--- a/elf/unload3mod2.c
+++ /dev/null
@@ -1 +0,0 @@
-int dummy2;
diff --git a/elf/unload3mod3.c b/elf/unload3mod3.c
deleted file mode 100644
index 046022c55d..0000000000
--- a/elf/unload3mod3.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int
-foo (int x)
-{
-  puts ("foo");
-  return x * 2;
-}
diff --git a/elf/unload3mod4.c b/elf/unload3mod4.c
deleted file mode 100644
index 52f808e79b..0000000000
--- a/elf/unload3mod4.c
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <stdio.h>
-
-extern int foo (int x);
-
-int
-bar (int x)
-{
-  puts ("bar");
-  fflush (stdout);
-  x = foo (x - 4);
-  puts ("bar after foo");
-  return x;
-}
diff --git a/elf/unload4.c b/elf/unload4.c
deleted file mode 100644
index 6e171a22e0..0000000000
--- a/elf/unload4.c
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <malloc.h>
-
-int
-main (void)
-{
-#ifdef M_PERTURB
-  mallopt (M_PERTURB, 0xaa);
-#endif
-
-  void *h;
-  int (*fn) (int);
-  h = dlopen ("unload4mod1.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("1st dlopen failed");
-      return 1;
-    }
-  fn = dlsym (h, "foo");
-  if (fn == NULL)
-    {
-      puts ("dlsym failed");
-      return 1;
-    }
-  int n = fn (10);
-  if (n != 28)
-    {
-      printf ("foo (10) returned %d != 28\n", n);
-      return 1;
-    }
-  dlclose (h);
-  h = dlopen ("unload4mod3.so", RTLD_LAZY);
-  fn = dlsym (h, "mod3fn2");
-  if (fn == NULL)
-    {
-      puts ("second dlsym failed");
-      return 1;
-    }
-  n = fn (10);
-  if (n != 22)
-    {
-      printf ("mod3fn2 (10) returned %d != 22\n", n);
-      return 1;
-    }
-  dlclose (h);
-  return 0;
-}
diff --git a/elf/unload4mod1.c b/elf/unload4mod1.c
deleted file mode 100644
index 38c5b0168d..0000000000
--- a/elf/unload4mod1.c
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <stdio.h>
-
-extern int bar (int);
-
-int
-foo (int x)
-{
-  puts ("in foo");
-  return bar (x / 2) + 2;
-}
diff --git a/elf/unload4mod2.c b/elf/unload4mod2.c
deleted file mode 100644
index 497ef5d93b..0000000000
--- a/elf/unload4mod2.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int
-baz (int x)
-{
-  puts ("in baz");
-  return x * 4;
-}
diff --git a/elf/unload4mod3.c b/elf/unload4mod3.c
deleted file mode 100644
index 4b280bc05b..0000000000
--- a/elf/unload4mod3.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-
-int
-__attribute__((noinline))
-mod3fn1 (int x)
-{
-  puts ("in mod3fn1");
-  return x + 6;
-}
-
-int
-mod3fn2 (int x)
-{
-  puts ("in mod3fn2");
-  return mod3fn1 (x / 2) * 2;
-}
diff --git a/elf/unload4mod4.c b/elf/unload4mod4.c
deleted file mode 100644
index ba5a144d38..0000000000
--- a/elf/unload4mod4.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-int
-__attribute__((noinline))
-baz (int x)
-{
-  abort ();
-}
-
-int
-bar (int x)
-{
-  puts ("in bar");
-  return baz (x + 1) + 2;
-}
diff --git a/elf/unload5.c b/elf/unload5.c
deleted file mode 100644
index 0555052ce8..0000000000
--- a/elf/unload5.c
+++ /dev/null
@@ -1,42 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-main (void)
-{
-  void *g = dlopen ("unload3mod1.so", RTLD_GLOBAL | RTLD_NOW);
-  void *h = dlopen ("unload3mod2.so", RTLD_GLOBAL | RTLD_NOW);
-  if (g == NULL || h == NULL)
-    {
-      printf ("dlopen unload3mod{1,2}.so failed: %p %p\n", g, h);
-      return 1;
-    }
-  dlopen ("unload3mod4.so", RTLD_GLOBAL | RTLD_NOW);
-  dlclose (h);
-  dlclose (g);
-
-  g = dlopen ("unload3mod3.so", RTLD_GLOBAL | RTLD_NOW);
-  h = dlopen ("unload3mod4.so", RTLD_GLOBAL | RTLD_NOW);
-  if (g == NULL || h == NULL)
-    {
-      printf ("dlopen unload3mod{3,4}.so failed: %p %p\n", g, h);
-      return 1;
-    }
-
-  int (*fn) (int);
-  fn = dlsym (h, "bar");
-  if (fn == NULL)
-    {
-      puts ("dlsym failed");
-      return 1;
-    }
-
-  int val = fn (16);
-  if (val != 24)
-    {
-      printf ("bar returned %d != 24\n", val);
-      return 1;
-    }
-
-  return 0;
-}
diff --git a/elf/unload6.c b/elf/unload6.c
deleted file mode 100644
index 1efc7eb841..0000000000
--- a/elf/unload6.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-main (void)
-{
-  void *h = dlopen ("unload6mod1.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("dlopen unload6mod1.so failed");
-      return 1;
-    }
-
-  int (*fn) (int);
-  fn = dlsym (h, "foo");
-  if (fn == NULL)
-    {
-      puts ("dlsym failed");
-      return 1;
-    }
-
-  int val = fn (16);
-  if (val != 24)
-    {
-      printf ("foo returned %d != 24\n", val);
-      return 1;
-    }
-
-  return 0;
-}
diff --git a/elf/unload6mod1.c b/elf/unload6mod1.c
deleted file mode 100644
index 24f2e5a19a..0000000000
--- a/elf/unload6mod1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-foo (int i)
-{
-  void *h = dlopen ("unload6mod2.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("dlopen unload6mod2.so failed");
-      return 1;
-    }
-
-  dlclose (h);
-  return i + 8;
-}
diff --git a/elf/unload6mod2.c b/elf/unload6mod2.c
deleted file mode 100644
index 980efa4b0e..0000000000
--- a/elf/unload6mod2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <unistd.h>
-
-static void *h;
-
-static void __attribute__((constructor))
-mod2init (void)
-{
-  h = dlopen ("unload6mod3.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("dlopen unload6mod3.so failed");
-      fflush (stdout);
-      _exit (1);
-    }
-}
-
-static void __attribute__((destructor))
-mod2fini (void)
-{
-  dlclose (h);
-}
diff --git a/elf/unload6mod3.c b/elf/unload6mod3.c
deleted file mode 100644
index 7b29e1d626..0000000000
--- a/elf/unload6mod3.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <unistd.h>
-
-static void *h;
-
-static void __attribute__((constructor))
-mod3init (void)
-{
-  h = dlopen ("unload6mod1.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("dlopen unload6mod1.so failed");
-      fflush (stdout);
-      _exit (1);
-    }
-}
-
-static void __attribute__((destructor))
-mod3fini (void)
-{
-  dlclose (h);
-}
diff --git a/elf/unload7.c b/elf/unload7.c
deleted file mode 100644
index 198f7db286..0000000000
--- a/elf/unload7.c
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-main (void)
-{
-  void *h = dlopen ("$ORIGIN/unload7mod1.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("dlopen unload7mod1.so failed");
-      return 1;
-    }
-
-  int (*fn) (void);
-  fn = dlsym (h, "foo");
-  if (fn == NULL)
-    {
-      puts ("dlsym failed");
-      return 1;
-    }
-
-  int ret = 0;
-  if (fn () == 0)
-    ++ret;
-
-  void *h2 = dlopen ("$ORIGIN/unload7mod2.so", RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      puts ("dlopen unload7mod2.so failed");
-      return 1;
-    }
-  dlclose (h2);
-
-  if (fn () == 0)
-    ++ret;
-
-  dlclose (h);
-  return ret;
-}
diff --git a/elf/unload7mod1.c b/elf/unload7mod1.c
deleted file mode 100644
index 7435adce2c..0000000000
--- a/elf/unload7mod1.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-foo (int i)
-{
-  if (dlsym (RTLD_DEFAULT, "unload7_nonexistent_symbol") == NULL)
-    return 1;
-  puts ("dlsym returned non-NULL");
-  return 0;
-}
diff --git a/elf/unload7mod2.c b/elf/unload7mod2.c
deleted file mode 100644
index 6d1a0d47b7..0000000000
--- a/elf/unload7mod2.c
+++ /dev/null
@@ -1 +0,0 @@
-int x;
diff --git a/elf/unload8.c b/elf/unload8.c
deleted file mode 100644
index f984a38098..0000000000
--- a/elf/unload8.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-
-int
-main (void)
-{
-  void *h = dlopen ("$ORIGIN/unload8mod1.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("dlopen unload8mod1.so failed");
-      return 1;
-    }
-
-  void *h2 = dlopen ("$ORIGIN/unload8mod1x.so", RTLD_LAZY);
-  if (h2 == NULL)
-    {
-      puts ("dlopen unload8mod1x.so failed");
-      return 1;
-    }
-  dlclose (h2);
-
-  int (*mod1) (void) = dlsym (h, "mod1");
-  if (mod1 == NULL)
-    {
-      puts ("dlsym failed");
-      return 1;
-    }
-
-  mod1 ();
-  dlclose (h);
-
-  return 0;
-}
diff --git a/elf/unload8mod1.c b/elf/unload8mod1.c
deleted file mode 100644
index fe7e81c1c3..0000000000
--- a/elf/unload8mod1.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern void mod2 (void);
-
-void
-mod1 (void)
-{
-  mod2 ();
-}
diff --git a/elf/unload8mod1x.c b/elf/unload8mod1x.c
deleted file mode 100644
index 835b634914..0000000000
--- a/elf/unload8mod1x.c
+++ /dev/null
@@ -1 +0,0 @@
-int mod1x;
diff --git a/elf/unload8mod2.c b/elf/unload8mod2.c
deleted file mode 100644
index 2fd8b6768a..0000000000
--- a/elf/unload8mod2.c
+++ /dev/null
@@ -1,7 +0,0 @@
-extern void mod3 (void);
-
-void
-mod2 (void)
-{
-  mod3 ();
-}
diff --git a/elf/unload8mod3.c b/elf/unload8mod3.c
deleted file mode 100644
index d49e22b24c..0000000000
--- a/elf/unload8mod3.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-void
-mod3_fini2 (void)
-{
-}
-
-void
-mod3_fini (void)
-{
-  mod3_fini2 ();
-}
-
-void
-mod3 (void)
-{
-  void *h = dlopen ("$ORIGIN/unload8mod2.so", RTLD_LAZY);
-  if (h == NULL)
-    {
-      puts ("dlopen unload8mod2.so failed");
-      exit (1);
-    }
-
-  atexit (mod3_fini);
-}
diff --git a/elf/unloadmod.c b/elf/unloadmod.c
deleted file mode 100644
index 3aa5403edf..0000000000
--- a/elf/unloadmod.c
+++ /dev/null
@@ -1,4 +0,0 @@
-struct testdat
-{
-  void *next;
-} testdat;
diff --git a/elf/vismain.c b/elf/vismain.c
deleted file mode 100644
index 43f1d8f095..0000000000
--- a/elf/vismain.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-/* This file must be compiled as PIE to avoid copy relocation when
-   accessing protected symbols defined in shared libaries since copy
-   relocation doesn't work with protected symbols and linker in
-   binutils 2.26 enforces this rule.  */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "vismod.h"
-
-/* Prototype for our test function.  */
-extern int do_test (void);
-
-
-/* This defines the `main' function and some more.  */
-#include <support/test-driver.c>
-
-
-/* Prototypes for local functions.  */
-extern int protlocal (void);
-
-const char *protvarlocal = __FILE__;
-extern const char *protvarinmod;
-extern const char *protvaritcpt;
-
-int
-do_test (void)
-{
-  int res = 0;
-  int val;
-
-  /* First test: check whether .protected is handled correctly by the
-     assembler/linker.  The uses of `protlocal' in the DSOs and in the
-     main program should all be resolved with the local definitions.  */
-  val = protlocal () + calllocal1 () + calllocal2 ();
-  if (val != 0x155)
-    {
-      puts ("\
-The handling of `.protected' seems to be implemented incorrectly: giving up");
-      abort ();
-    }
-  puts ("`.protected' seems to be handled correctly, good!");
-
-  /* Function pointers: for functions which are marked local and for
-     which definitions are available all function pointers must be
-     distinct.  */
-  if (protlocal == getlocal1 ())
-    {
-      puts ("`protlocal' in main and mod1 have same address");
-      res = 1;
-    }
-  if (protlocal == getlocal2 ())
-    {
-      puts ("`protlocal' in main and mod2 have same address");
-      res = 1;
-    }
-  if (getlocal1 () == getlocal2 ())
-    {
-      puts ("`protlocal' in mod1 and mod2 have same address");
-      res = 1;
-    }
-  if (getlocal1 () () + getlocal2 () () != 0x44)
-    {
-      puts ("pointers to `protlocal' in mod1 or mod2 incorrect");
-      res = 1;
-    }
-
-  /* Next test.  This is similar to the last one but the function we
-     are calling is not defined in the main object.  This means that
-     the invocation in the main object uses the definition in the
-     first DSO.  */
-  if (protinmod != getinmod1 ())
-    {
-      printf ("&protinmod in main (%p) != &protinmod in mod1 (%p)\n",
-	      protinmod, getinmod1 ());
-      res = 1;
-    }
-  if (protinmod == getinmod2 ())
-    {
-      puts ("`protinmod' in main and mod2 have same address");
-      res = 1;
-    }
-  if (getinmod1 () == getinmod2 ())
-    {
-      puts ("`protinmod' in mod1 and mod2 have same address");
-      res = 1;
-    }
-  if (protinmod () + getinmod1 () () + getinmod2 () () != 0x4800)
-    {
-      puts ("pointers to `protinmod' in mod1 or mod2 incorrect");
-      res = 1;
-    }
-  val = protinmod () + callinmod1 () + callinmod2 ();
-  if (val != 0x15800)
-    {
-      printf ("calling of `protinmod' leads to wrong result (%#x)\n", val);
-      res = 1;
-    }
-
-  /* A very similar text.  Same setup for the main object and the modules
-     but this time we have another definition in a preloaded module. This
-     one intercepts the references from the main object.  */
-  if (protitcpt != getitcpt3 ())
-    {
-      printf ("&protitcpt in main (%p) != &protitcpt in mod3 (%p)\n",
-	      &protitcpt, getitcpt3 ());
-      res = 1;
-    }
-  if (protitcpt == getitcpt1 ())
-    {
-      puts ("`protitcpt' in main and mod1 have same address");
-      res = 1;
-    }
-  if (protitcpt == getitcpt2 ())
-    {
-      puts ("`protitcpt' in main and mod2 have same address");
-      res = 1;
-    }
-  if (getitcpt1 () == getitcpt2 ())
-    {
-      puts ("`protitcpt' in mod1 and mod2 have same address");
-      res = 1;
-    }
-  val = protitcpt () + getitcpt1 () () + getitcpt2 () () + getitcpt3 () ();
-  if (val != 0x8440000)
-    {
-      printf ("\
-pointers to `protitcpt' in mod1 or mod2 or mod3 incorrect (%#x)\n", val);
-      res = 1;
-    }
-  val = protitcpt () + callitcpt1 () + callitcpt2 () + callitcpt3 ();
-  if (val != 0x19540000)
-    {
-      printf ("calling of `protitcpt' leads to wrong result (%#x)\n", val);
-      res = 1;
-    }
-
-  /* Now look at variables.  First a variable which is available
-     everywhere.  We must have three different addresses.  */
-  if (&protvarlocal == getvarlocal1 ())
-    {
-      puts ("`protvarlocal' in main and mod1 have same address");
-      res = 1;
-    }
-  if (&protvarlocal == getvarlocal2 ())
-    {
-      puts ("`protvarlocal' in main and mod2 have same address");
-      res = 1;
-    }
-  if (getvarlocal1 () == getvarlocal2 ())
-    {
-      puts ("`protvarlocal' in mod1 and mod2 have same address");
-      res = 1;
-    }
-  if (strcmp (protvarlocal, __FILE__) != 0)
-    {
-      puts ("`protvarlocal in main has wrong value");
-      res = 1;
-    }
-  if (strcmp (*getvarlocal1 (), "vismod1.c") != 0)
-    {
-      puts ("`getvarlocal1' returns wrong value");
-      res = 1;
-    }
-  if (strcmp (*getvarlocal2 (), "vismod2.c") != 0)
-    {
-      puts ("`getvarlocal2' returns wrong value");
-      res = 1;
-    }
-
-  /* Now the case where there is no local definition.  */
-  if (&protvarinmod != getvarinmod1 ())
-    {
-      printf ("&protvarinmod in main (%p) != &protitcpt in mod1 (%p)\n",
-	      &protvarinmod, getvarinmod1 ());
-      // XXX Possibly enable once fixed.
-      // res = 1;
-    }
-  if (&protvarinmod == getvarinmod2 ())
-    {
-      puts ("`protvarinmod' in main and mod2 have same address");
-      res = 1;
-    }
-  if (strcmp (*getvarinmod1 (), "vismod1.c") != 0)
-    {
-      puts ("`getvarinmod1' returns wrong value");
-      res = 1;
-    }
-  if (strcmp (*getvarinmod2 (), "vismod2.c") != 0)
-    {
-      puts ("`getvarinmod2' returns wrong value");
-      res = 1;
-    }
-
-  /* And a test where a variable definition is intercepted.  */
-  if (&protvaritcpt == getvaritcpt1 ())
-    {
-      puts ("`protvaritcpt' in main and mod1 have same address");
-      res = 1;
-    }
-  if (&protvaritcpt == getvaritcpt2 ())
-    {
-      puts ("`protvaritcpt' in main and mod2 have same address");
-      res = 1;
-    }
-  if (&protvaritcpt != getvaritcpt3 ())
-    {
-      printf ("&protvaritcpt in main (%p) != &protvaritcpt in mod3 (%p)\n",
-	      &protvaritcpt, getvaritcpt3 ());
-      // XXX Possibly enable once fixed.
-      // res = 1;
-    }
-  if (getvaritcpt1 () == getvaritcpt2 ())
-    {
-      puts ("`protvaritcpt' in mod1 and mod2 have same address");
-      res = 1;
-    }
-  if (strcmp (protvaritcpt, "vismod3.c") != 0)
-    {
-      puts ("`protvaritcpt in main has wrong value");
-      res = 1;
-    }
-  if (strcmp (*getvaritcpt1 (), "vismod1.c") != 0)
-    {
-      puts ("`getvaritcpt1' returns wrong value");
-      res = 1;
-    }
-  if (strcmp (*getvaritcpt2 (), "vismod2.c") != 0)
-    {
-      puts ("`getvaritcpt2' returns wrong value");
-      res = 1;
-    }
-
-  return res;
-}
-
-
-int
-protlocal (void)
-{
-  return 0x1;
-}
diff --git a/elf/vismod.h b/elf/vismod.h
deleted file mode 100644
index ef05ffd5e9..0000000000
--- a/elf/vismod.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* Prototypes for the functions in the DSOs.  */
-extern int calllocal1 (void);
-extern int (*getlocal1 (void)) (void);
-extern int callinmod1 (void);
-extern int (*getinmod1 (void)) (void);
-extern int callitcpt1 (void);
-extern int (*getitcpt1 (void)) (void);
-extern const char **getvarlocal1 (void);
-extern const char **getvarinmod1 (void);
-extern const char **getvaritcpt1 (void);
-extern int calllocal2 (void);
-extern int (*getlocal2 (void)) (void);
-extern int callinmod2 (void);
-extern int (*getinmod2 (void)) (void);
-extern int callitcpt2 (void);
-extern int (*getitcpt2 (void)) (void);
-extern const char **getvarlocal2 (void);
-extern const char **getvarinmod2 (void);
-extern const char **getvaritcpt2 (void);
-extern int callitcpt3 (void);
-extern int (*getitcpt3 (void)) (void);
-extern const char **getvaritcpt3 (void);
-
-extern int protinmod (void);
-extern int protitcpt (void);
-extern int protlocal (void);
-
diff --git a/elf/vismod1.c b/elf/vismod1.c
deleted file mode 100644
index 3e56404ce7..0000000000
--- a/elf/vismod1.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include "vismod.h"
-
-int
-protlocal (void)
-{
-  return 0x4;
-}
-asm (".protected protlocal");
-
-
-int
-calllocal1 (void)
-{
-  return protlocal () + 0x10;
-}
-
-int
-(*getlocal1 (void)) (void)
-{
-  return protlocal;
-}
-
-int
-protinmod (void)
-{
-  return 0x400;
-}
-asm (".protected protinmod");
-
-int
-callinmod1 (void)
-{
-  return protinmod () + 0x1000;
-}
-
-int
-(*getinmod1 (void)) (void)
-{
-  return protinmod;
-}
-
-int
-protitcpt (void)
-{
-  return 0x40000;
-}
-asm (".protected protitcpt");
-
-int
-callitcpt1 (void)
-{
-  return protitcpt () + 0x100000;
-}
-
-int
-(*getitcpt1 (void)) (void)
-{
-  return protitcpt;
-}
-
-const char *protvarlocal = __FILE__;
-asm (".protected protvarlocal");
-
-const char **
-getvarlocal1 (void)
-{
-  return &protvarlocal;
-}
-
-const char *protvarinmod = __FILE__;
-asm (".protected protvarinmod");
-
-const char **
-getvarinmod1 (void)
-{
-  return &protvarinmod;
-}
-
-const char *protvaritcpt = __FILE__;
-asm (".protected protvaritcpt");
-
-const char **
-getvaritcpt1 (void)
-{
-  return &protvaritcpt;
-}
diff --git a/elf/vismod2.c b/elf/vismod2.c
deleted file mode 100644
index 89be69728a..0000000000
--- a/elf/vismod2.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <stdlib.h>
-#include "vismod.h"
-
-int
-protlocal (void)
-{
-  return 0x40;
-}
-asm (".protected protlocal");
-
-
-int
-calllocal2 (void)
-{
-  return protlocal () + 0x100;
-}
-
-int
-(*getlocal2 (void)) (void)
-{
-  return protlocal;
-}
-
-int
-protinmod (void)
-{
-  return 0x4000;
-}
-asm (".protected protinmod");
-
-int
-callinmod2 (void)
-{
-  return protinmod () + 0x10000;
-}
-
-int
-(*getinmod2 (void)) (void)
-{
-  return protinmod;
-}
-
-int
-protitcpt (void)
-{
-  return 0x400000;
-}
-asm (".protected protitcpt");
-
-int
-callitcpt2 (void)
-{
-  return protitcpt () + 0x1000000;
-}
-
-int
-(*getitcpt2 (void)) (void)
-{
-  return protitcpt;
-}
-
-const char *protvarlocal = __FILE__;
-asm (".protected protvarlocal");
-
-const char **
-getvarlocal2 (void)
-{
-  return &protvarlocal;
-}
-
-const char *protvarinmod = __FILE__;
-asm (".protected protvarinmod");
-
-const char **
-getvarinmod2 (void)
-{
-  return &protvarinmod;
-}
-
-const char *protvaritcpt = __FILE__;
-asm (".protected protvaritcpt");
-
-const char **
-getvaritcpt2 (void)
-{
-  return &protvaritcpt;
-}
-
-/* We must never call these functions.  */
-int
-callitcpt3 (void)
-{
-  abort ();
-}
-
-int
-(*getitcpt3 (void)) (void)
-{
-  abort ();
-}
-
-const char **
-getvaritcpt3 (void)
-{
-  abort ();
-}
diff --git a/elf/vismod3.c b/elf/vismod3.c
deleted file mode 100644
index 1074d1bcda..0000000000
--- a/elf/vismod3.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Copyright (C) 2000-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include "vismod.h"
-
-int
-protitcpt (void)
-{
-  return 0x4000000;
-}
-asm (".protected protitcpt");
-
-int
-callitcpt3 (void)
-{
-  return protitcpt () + 0x10000000;
-}
-
-int
-(*getitcpt3 (void)) (void)
-{
-  return protitcpt;
-}
-
-const char *protvaritcpt = __FILE__;
-asm (".protected protvaritcpt");
-
-const char **
-getvaritcpt3 (void)
-{
-  return &protvaritcpt;
-}