summaryrefslogtreecommitdiffstats
path: root/scripts/t
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 18:35:28 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 18:35:28 +0000
commitea314d2f45c40a006c0104157013ab4b857f665f (patch)
tree3ef2971cb3675c318b8d9effd987854ad3f6d3e8 /scripts/t
parentInitial commit. (diff)
downloaddpkg-ea314d2f45c40a006c0104157013ab4b857f665f.tar.xz
dpkg-ea314d2f45c40a006c0104157013ab4b857f665f.zip
Adding upstream version 1.22.4.upstream/1.22.4
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--scripts/t/Dpkg_Arch.t201
-rw-r--r--scripts/t/Dpkg_BuildAPI.t93
-rw-r--r--scripts/t/Dpkg_BuildAPI/ctrl-api-default4
-rw-r--r--scripts/t/Dpkg_BuildAPI/ctrl-api-desync10
-rw-r--r--scripts/t/Dpkg_BuildAPI/ctrl-api-explicit6
-rw-r--r--scripts/t/Dpkg_BuildAPI/ctrl-api-gt-max6
-rw-r--r--scripts/t/Dpkg_BuildAPI/ctrl-api-no-int6
-rw-r--r--scripts/t/Dpkg_BuildAPI/ctrl-api-no-ver6
-rw-r--r--scripts/t/Dpkg_BuildAPI/ctrl-api-rel-noeq6
-rw-r--r--scripts/t/Dpkg_BuildEnv.t48
-rw-r--r--scripts/t/Dpkg_BuildFlags.t174
-rw-r--r--scripts/t/Dpkg_BuildFlags_Ubuntu.t92
-rw-r--r--scripts/t/Dpkg_BuildInfo.t26
-rw-r--r--scripts/t/Dpkg_BuildOptions.t109
-rw-r--r--scripts/t/Dpkg_BuildProfiles.t59
-rw-r--r--scripts/t/Dpkg_BuildTree.t64
-rw-r--r--scripts/t/Dpkg_BuildTypes.t87
-rw-r--r--scripts/t/Dpkg_Changelog.t383
-rw-r--r--scripts/t/Dpkg_Changelog/countme41
-rw-r--r--scripts/t/Dpkg_Changelog/date-format17
-rw-r--r--scripts/t/Dpkg_Changelog/fields40
-rw-r--r--scripts/t/Dpkg_Changelog/misplaced-tz12
-rw-r--r--scripts/t/Dpkg_Changelog/regressions7
-rw-r--r--scripts/t/Dpkg_Changelog/shadow1755
-rw-r--r--scripts/t/Dpkg_Changelog/stop-modeline13
-rw-r--r--scripts/t/Dpkg_Changelog/unreleased11
-rw-r--r--scripts/t/Dpkg_Changelog_Ubuntu.t25
-rw-r--r--scripts/t/Dpkg_Checksums.t149
-rw-r--r--scripts/t/Dpkg_Checksums/data-11
-rw-r--r--scripts/t/Dpkg_Checksums/data-21
-rw-r--r--scripts/t/Dpkg_Checksums/empty0
-rw-r--r--scripts/t/Dpkg_Compression.t176
-rw-r--r--scripts/t/Dpkg_Conf.t119
-rw-r--r--scripts/t/Dpkg_Conf/config-mixed26
-rw-r--r--scripts/t/Dpkg_Control.t148
-rw-r--r--scripts/t/Dpkg_Control/bogus-armor-double.dsc13
-rw-r--r--scripts/t/Dpkg_Control/bogus-armor-formfeed.dsc19
-rw-r--r--scripts/t/Dpkg_Control/bogus-armor-inline.dsc9
-rw-r--r--scripts/t/Dpkg_Control/bogus-armor-nested.dsc15
-rw-r--r--scripts/t/Dpkg_Control/bogus-armor-no-sig.dsc4
-rw-r--r--scripts/t/Dpkg_Control/bogus-armor-spaces.dsc18
-rw-r--r--scripts/t/Dpkg_Control/bogus-armor-trail.dsc14
-rw-r--r--scripts/t/Dpkg_Control/bogus-unsigned.dsc5
-rw-r--r--scripts/t/Dpkg_Control/control-130
-rw-r--r--scripts/t/Dpkg_Control_Fields.t540
-rw-r--r--scripts/t/Dpkg_Control_Tests.t71
-rw-r--r--scripts/t/Dpkg_Control_Tests/tests-missing-fields7
-rw-r--r--scripts/t/Dpkg_Control_Tests/tests-plain-text6
-rw-r--r--scripts/t/Dpkg_Control_Tests/tests-valid18
-rw-r--r--scripts/t/Dpkg_Deps.t368
-rw-r--r--scripts/t/Dpkg_Dist_Files.t214
-rw-r--r--scripts/t/Dpkg_Dist_Files/files-byhand5
-rw-r--r--scripts/t/Dpkg_Dist_Files/files-fragment-a1
-rw-r--r--scripts/t/Dpkg_Dist_Files/files-fragment-b1
-rw-r--r--scripts/t/Dpkg_ErrorHandling.t25
-rw-r--r--scripts/t/Dpkg_Exit.t66
-rw-r--r--scripts/t/Dpkg_File.t78
-rw-r--r--scripts/t/Dpkg_File/append-me3
-rw-r--r--scripts/t/Dpkg_File/dump-partial2
-rw-r--r--scripts/t/Dpkg_File/slurp-me3
-rw-r--r--scripts/t/Dpkg_Getopt.t38
-rw-r--r--scripts/t/Dpkg_Gettext.t25
-rw-r--r--scripts/t/Dpkg_IPC.t71
-rw-r--r--scripts/t/Dpkg_Index.t25
-rw-r--r--scripts/t/Dpkg_Interface_Storable.t25
-rw-r--r--scripts/t/Dpkg_Lock.t25
-rw-r--r--scripts/t/Dpkg_OpenPGP.t114
-rw-r--r--scripts/t/Dpkg_OpenPGP/dpkg-test-pub.asc24
-rw-r--r--scripts/t/Dpkg_OpenPGP/dpkg-test-sec.asc28
-rw-r--r--scripts/t/Dpkg_OpenPGP/sign-file5
-rw-r--r--scripts/t/Dpkg_OpenPGP/sign-file-inline.asc16
-rw-r--r--scripts/t/Dpkg_OpenPGP/sign-file-inline.sigbin0 -> 382 bytes
-rw-r--r--scripts/t/Dpkg_OpenPGP/sign-file.asc8
-rw-r--r--scripts/t/Dpkg_OpenPGP/sign-file.sigbin0 -> 191 bytes
-rw-r--r--scripts/t/Dpkg_OpenPGP_KeyHandle.t90
-rw-r--r--scripts/t/Dpkg_Package.t42
-rw-r--r--scripts/t/Dpkg_Path.t237
-rw-r--r--scripts/t/Dpkg_Shlibs.t786
-rw-r--r--scripts/t/Dpkg_Shlibs/basictags.c63
-rw-r--r--scripts/t/Dpkg_Shlibs/basictags.symbols15
-rw-r--r--scripts/t/Dpkg_Shlibs/ld.so.conf9
-rw-r--r--scripts/t/Dpkg_Shlibs/ld.so.conf.d/inf_recurse.conf1
-rw-r--r--scripts/t/Dpkg_Shlibs/ld.so.conf.d/normal.conf1
-rw-r--r--scripts/t/Dpkg_Shlibs/ld.so.conf.d/recursive.conf1
-rw-r--r--scripts/t/Dpkg_Shlibs/ld.so.conf_21
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.basictags-amd6478
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.basictags-i38680
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.basictags-mips79
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.dbd-pg309
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.glib-ia64350
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.internal15
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.libc6-2.32276
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.libc6-2.62345
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.ls536
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.patterns235
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.space8
-rw-r--r--scripts/t/Dpkg_Shlibs/objdump.spacesyms119
-rw-r--r--scripts/t/Dpkg_Shlibs/patterns.cpp99
-rw-r--r--scripts/t/Dpkg_Shlibs/patterns.map9
-rw-r--r--scripts/t/Dpkg_Shlibs/patterns.symbols47
-rwxr-xr-xscripts/t/Dpkg_Shlibs/spacesyms-c-gen.pl37
-rwxr-xr-xscripts/t/Dpkg_Shlibs/spacesyms-o-map.pl25
-rw-r--r--scripts/t/Dpkg_Shlibs/spacesyms.map7
-rw-r--r--scripts/t/Dpkg_Shlibs/symbols.fake-13
-rw-r--r--scripts/t/Dpkg_Shlibs/symbols.fake-29
-rw-r--r--scripts/t/Dpkg_Shlibs/symbols.fake-35
-rw-r--r--scripts/t/Dpkg_Shlibs/symbols.include-19
-rw-r--r--scripts/t/Dpkg_Shlibs/symbols.include-23
-rw-r--r--scripts/t/Dpkg_Shlibs/symbols.include-35
-rw-r--r--scripts/t/Dpkg_Shlibs/symbols.internal4
-rw-r--r--scripts/t/Dpkg_Shlibs/symbols.internal-allow3
-rw-r--r--scripts/t/Dpkg_Shlibs/symbols.internal-allow-groups4
-rw-r--r--scripts/t/Dpkg_Shlibs/symbols.internal-filter3
-rw-r--r--scripts/t/Dpkg_Shlibs_Cppfilt.t90
-rw-r--r--scripts/t/Dpkg_Source_Archive.t122
-rw-r--r--scripts/t/Dpkg_Source_Format.t63
-rw-r--r--scripts/t/Dpkg_Source_Functions.t25
-rw-r--r--scripts/t/Dpkg_Source_Package.t62
-rw-r--r--scripts/t/Dpkg_Source_Package/package_1.0.orig.tar0
-rw-r--r--scripts/t/Dpkg_Source_Package/package_1.0.orig.tar.asc16
-rw-r--r--scripts/t/Dpkg_Source_Package/package_1.0.orig.tar.sigbin0 -> 566 bytes
-rw-r--r--scripts/t/Dpkg_Source_Patch.t72
-rw-r--r--scripts/t/Dpkg_Source_Patch/c-style.patch4
-rw-r--r--scripts/t/Dpkg_Source_Patch/ghost-hunk.patch7
-rw-r--r--scripts/t/Dpkg_Source_Patch/indent-header.patch9
-rw-r--r--scripts/t/Dpkg_Source_Patch/index-+++.patch4
-rw-r--r--scripts/t/Dpkg_Source_Patch/index-alone.patch3
-rw-r--r--scripts/t/Dpkg_Source_Patch/index-inert.patch8
-rw-r--r--scripts/t/Dpkg_Source_Patch/partial.patch3
-rw-r--r--scripts/t/Dpkg_Source_Quilt.t36
-rw-r--r--scripts/t/Dpkg_Source_Quilt/parse/debian/patches/series9
-rw-r--r--scripts/t/Dpkg_Substvars.t280
-rw-r--r--scripts/t/Dpkg_Substvars/substvars110
-rw-r--r--scripts/t/Dpkg_Substvars/substvars27
-rw-r--r--scripts/t/Dpkg_Vendor.t40
-rw-r--r--scripts/t/Dpkg_Version.t214
-rw-r--r--scripts/t/dpkg_buildpackage.t244
-rw-r--r--scripts/t/dpkg_buildpackage/dpkgdb/status0
-rwxr-xr-xscripts/t/dpkg_buildpackage/hook25
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0.dsc15
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0_all.changes26
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0_all.hook18
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0_any.changes26
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0_any.hook18
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0_binary.changes30
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0_binary.hook18
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0_full.changes36
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0_full.hook18
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0_source.changes26
-rw-r--r--scripts/t/dpkg_buildpackage/test-source_0_source.hook16
-rw-r--r--scripts/t/dpkg_mergechangelogs.t66
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-a94
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-b89
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-badver-a5
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-badver-b11
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-badver-merged11
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-badver-old5
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-merged115
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-merged-basic138
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-merged-pr108
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-merged-pr-basic140
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-old87
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-unreleased-a12
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-unreleased-b12
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-unreleased-merged24
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-unreleased-merged-basic25
-rw-r--r--scripts/t/dpkg_mergechangelogs/ch-unreleased-old5
-rw-r--r--scripts/t/dpkg_source.t184
-rw-r--r--scripts/t/dpkg_source/testsuite_0.dsc16
-rw-r--r--scripts/t/dpkg_source/testsuite_1.dsc16
-rw-r--r--scripts/t/dpkg_source/testsuite_2.dsc17
-rw-r--r--scripts/t/dpkg_source/testsuite_3.dsc15
-rw-r--r--scripts/t/mk.t153
-rw-r--r--scripts/t/mk/architecture.mk36
-rw-r--r--scripts/t/mk/buildapi.mk4
-rw-r--r--scripts/t/mk/buildflags.mk26
-rw-r--r--scripts/t/mk/buildopts.mk4
-rw-r--r--scripts/t/mk/buildtools.mk33
-rw-r--r--scripts/t/mk/debian/changelog5
-rw-r--r--scripts/t/mk/debian/control6
-rw-r--r--scripts/t/mk/pkg-info.mk11
-rw-r--r--scripts/t/mk/vendor-v0.mk6
-rw-r--r--scripts/t/mk/vendor-v1.mk6
-rw-r--r--scripts/t/mk/vendor.mk6
-rwxr-xr-xscripts/t/mock-bin/dpkg20
-rwxr-xr-xscripts/t/mock-bin/gcc20
-rw-r--r--scripts/t/origins/debian3
-rw-r--r--scripts/t/origins/default3
-rw-r--r--scripts/t/origins/devuan4
-rw-r--r--scripts/t/origins/gnewsense4
-rw-r--r--scripts/t/origins/ubuntu4
191 files changed, 16957 insertions, 0 deletions
diff --git a/scripts/t/Dpkg_Arch.t b/scripts/t/Dpkg_Arch.t
new file mode 100644
index 0000000..85301e2
--- /dev/null
+++ b/scripts/t/Dpkg_Arch.t
@@ -0,0 +1,201 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 7142;
+
+use_ok('Dpkg::Arch', qw(debarch_to_debtuple debarch_to_multiarch
+ debarch_eq debarch_is debarch_is_wildcard
+ debarch_is_illegal
+ debarch_to_abiattrs debarch_to_cpubits
+ debarch_list_parse
+ debtuple_to_debarch gnutriplet_to_debarch
+ debtuple_to_gnutriplet gnutriplet_to_debtuple
+ get_host_gnu_type
+ get_valid_arches));
+
+my $KNOWN_ARCHES_TOTAL = 206;
+my @valid_arches = get_valid_arches();
+
+sub get_valid_wildcards
+{
+ my %wildcards;
+ my @wildcards_base = qw(
+ any
+ any-any
+ any-any-any
+ any-any-any-any
+ );
+
+ foreach my $archname (@valid_arches) {
+ my @tuple = debarch_to_debtuple($archname);
+
+ my @wildcards_arch = (
+ # Two element tuples.
+ "$tuple[2]-any",
+ "any-$tuple[3]",
+
+ # Three element tuples.
+ "$tuple[1]-$tuple[2]-any",
+ "$tuple[1]-any-$tuple[3]",
+ "$tuple[1]-any-any",
+ "any-$tuple[2]-$tuple[3]",
+ "any-$tuple[2]-any",
+ "any-any-$tuple[3]",
+
+ # Four element tuples.
+ "$tuple[0]-$tuple[1]-$tuple[2]-any",
+ "$tuple[0]-$tuple[1]-any-$tuple[3]",
+ "$tuple[0]-$tuple[1]-any-any",
+ "$tuple[0]-any-$tuple[2]-$tuple[3]",
+ "$tuple[0]-any-$tuple[2]-any",
+ "$tuple[0]-any-any-$tuple[3]",
+ "$tuple[0]-any-any-any",
+ "any-$tuple[1]-$tuple[2]-$tuple[3]",
+ "any-$tuple[1]-$tuple[2]-any",
+ "any-$tuple[1]-any-$tuple[3]",
+ "any-$tuple[1]-any-any",
+ "any-any-$tuple[2]-$tuple[3]",
+ "any-any-$tuple[2]-any",
+ "any-any-any-$tuple[3]",
+ );
+
+ foreach my $wildcard ((@wildcards_base, @wildcards_arch)) {
+ push @{$wildcards{$wildcard}}, $archname;
+ }
+ }
+
+ return \%wildcards;
+}
+
+my @tuple_new;
+my @tuple_ref;
+
+@tuple_new = debarch_to_debtuple('unknown');
+is_deeply(\@tuple_new, [], 'unknown tuple');
+
+@tuple_ref = qw(base gnu linux amd64);
+@tuple_new = debarch_to_debtuple('amd64');
+is_deeply(\@tuple_new, \@tuple_ref, 'valid tuple');
+
+@tuple_ref = qw(base gnu linux amd64);
+@tuple_new = debarch_to_debtuple('amd64');
+is_deeply(\@tuple_new, \@tuple_ref, 'valid tuple');
+@tuple_new = debarch_to_debtuple('linux-amd64');
+is_deeply(\@tuple_new, \@tuple_ref, 'valid tuple');
+
+is(debarch_to_multiarch('i386'), 'i386-linux-gnu',
+ 'normalized i386 multiarch triplet');
+is(debarch_to_multiarch('amd64'), 'x86_64-linux-gnu',
+ 'normalized amd64 multiarch triplet');
+
+ok(!debarch_eq('amd64', 'i386'), 'no match, simple arch');
+ok(!debarch_eq('', 'amd64'), 'no match, empty first arch');
+ok(!debarch_eq('amd64', ''), 'no match, empty second arch');
+ok(!debarch_eq('amd64', 'unknown'), 'no match, with first unknown arch');
+ok(!debarch_eq('unknown', 'i386'), 'no match, second unknown arch');
+ok(debarch_eq('unknown', 'unknown'), 'match equal unknown arch');
+ok(debarch_eq('amd64', 'amd64'), 'match equal known arch');
+ok(debarch_eq('amd64', 'linux-amd64'), 'match implicit linux arch');
+
+ok(!debarch_is('unknown', 'linux-any'), 'no match unknown on wildcard cpu');
+ok(!debarch_is('unknown', 'any-amd64'), 'no match unknown on wildcard os');
+ok(!debarch_is('amd64', 'unknown'), 'no match amd64 on unknown wildcard');
+ok(!debarch_is('amd64', 'unknown-any'), 'no match amd64 on unknown wildcard');
+ok(!debarch_is('amd64', 'any-unknown'), 'no match amd64 on unknown wildcard');
+ok(debarch_is('unknown', 'any'), 'match unknown on global wildcard');
+ok(debarch_is('linux-amd64', 'linux-any'), 'match implicit linux-amd64 on wildcard cpu');
+ok(debarch_is('linux-amd64', 'any-amd64'), 'match implicit linux-amd64 on wildcard os');
+
+my $wildcards = get_valid_wildcards();
+
+foreach my $wildcard (sort keys %{$wildcards}) {
+ ok(debarch_is_wildcard($wildcard), "$wildcard is a wildcard");
+
+ foreach my $arch (sort @{$wildcards->{$wildcard}}) {
+ ok(debarch_is($arch, $wildcard), "wildcard $wildcard matches $arch");
+ }
+}
+
+ok(!debarch_is_wildcard('unknown'), 'unknown is not a wildcard');
+ok(!debarch_is_wildcard('all'), 'all is not a wildcard');
+ok(!debarch_is_wildcard('amd64'), '<arch> is not a wildcard');
+
+ok(!debarch_is_illegal('0'), '');
+ok(!debarch_is_illegal('a'), '');
+ok(!debarch_is_illegal('amd64'), '');
+ok(!debarch_is_illegal('!arm64'), '');
+ok(!debarch_is_illegal('kfreebsd-any'), '');
+ok(debarch_is_illegal('!amd64!arm'), '');
+ok(debarch_is_illegal('arch%name'), '');
+ok(debarch_is_illegal('-any'), '');
+ok(debarch_is_illegal('!'), '');
+
+my @arch_new;
+my @arch_ref;
+
+@arch_ref = qw(amd64 !arm64 linux-i386 !kfreebsd-any);
+@arch_new = debarch_list_parse('amd64 !arm64 linux-i386 !kfreebsd-any');
+is_deeply(\@arch_new, \@arch_ref, 'parse valid arch list');
+
+@arch_ref = qw(amd64 arm64 linux-i386 kfreebsd-any);
+@arch_new = debarch_list_parse('amd64 arm64 linux-i386 kfreebsd-any', positive => 1);
+is_deeply(\@arch_new, \@arch_ref, 'parse valid positive arch list');
+
+eval { @arch_new = debarch_list_parse('!amd64!arm64') };
+ok($@, 'parse concatenated arches failed');
+
+eval { @arch_new = debarch_list_parse('amd64 !arm64 !mips', positive => 1) };
+ok($@, 'parse disallowed negated arches failed');
+
+is(debarch_to_abiattrs(undef), undef, 'undef ABI attrs');
+is_deeply([ debarch_to_abiattrs('amd64') ], [ qw(64 little) ], 'amd64 ABI attrs');
+is_deeply([ debarch_to_abiattrs('x32') ], [ qw(32 little) ], 'x32 ABI attrs');
+
+is(debarch_to_cpubits(undef), undef, 'undef CPU bits');
+is(debarch_to_cpubits('i386'), 32, 'i386 CPU bits');
+is(debarch_to_cpubits('amd64'), 64, 'amd64 CPU bits');
+
+is(debtuple_to_debarch((undef) x 4), undef, 'undef debtuple');
+is(debtuple_to_debarch('base', 'gnu', 'linux', 'amd64'), 'amd64', 'known debtuple');
+is(debtuple_to_debarch('unknown', 'unknown', 'unknown', 'unknown'), undef, 'unknown debtuple');
+
+is(gnutriplet_to_debarch(undef), undef, 'undef gnutriplet');
+is(gnutriplet_to_debarch('unknown-unknown-unknown'), undef, 'unknown gnutriplet');
+is(gnutriplet_to_debarch('x86_64-linux-gnu'), 'amd64', 'known gnutriplet');
+
+foreach my $arch (@valid_arches) {
+ my @tuple = debarch_to_debtuple($arch);
+ is(debtuple_to_debarch(@tuple), $arch,
+ "bijective arch $arch to tuple @tuple");
+
+ my $triplet = debtuple_to_gnutriplet(@tuple);
+ is_deeply([ gnutriplet_to_debtuple($triplet) ], \@tuple,
+ "bijective triplet $triplet to tuple @tuple");
+}
+
+is(scalar @valid_arches, $KNOWN_ARCHES_TOTAL,
+ 'expected amount of known architectures');
+
+{
+ local $ENV{CC} = 'false';
+ is(get_host_gnu_type(), '', 'CC does not support -dumpmachine');
+
+ $ENV{CC} = 'echo CC';
+ is(get_host_gnu_type(), 'CC -dumpmachine',
+ 'CC does not report expected synthetic result for -dumpmachine');
+}
diff --git a/scripts/t/Dpkg_BuildAPI.t b/scripts/t/Dpkg_BuildAPI.t
new file mode 100644
index 0000000..b948a8a
--- /dev/null
+++ b/scripts/t/Dpkg_BuildAPI.t
@@ -0,0 +1,93 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 17;
+use Test::Dpkg qw(:paths);
+
+$ENV{DEB_HOST_ARCH} = 'amd64';
+
+use Dpkg::Control;
+use Dpkg::Control::Info;
+
+BEGIN {
+ use_ok('Dpkg::BuildAPI', qw(get_build_api reset_build_api));
+}
+
+my $datadir = test_get_data_path();
+
+sub test_load_ctrl {
+ my $file = shift;
+
+ my $ctrl = Dpkg::Control::Info->new(type => CTRL_TMPL_SRC);
+ $ctrl->load("$datadir/$file");
+
+ return $ctrl;
+}
+
+sub test_parse_env_invalid {
+ my ($value, $desc) = @_;
+
+ my $api;
+
+ eval {
+ local $ENV{DPKG_BUILD_API} = $value;
+ reset_build_api();
+ $api = get_build_api();
+ };
+
+ ok($@, "failed to parse build API $desc: $@");
+ is($api, undef, "parsing invalid build API $desc returns undef");
+}
+
+sub test_parse_ctrl_invalid {
+ my ($file, $desc) = @_;
+
+ my $ctrl = test_load_ctrl($file);
+ my $api;
+
+ eval {
+ reset_build_api();
+ $api = get_build_api($ctrl);
+ };
+ ok($@, "failed to parse build API $desc from $file: $@");
+ is($api, undef, "parsing invalid build API $desc from $file returns undef");
+}
+
+sub test_parse_ctrl {
+ my ($file, $exp_api, $desc) = @_;
+
+ my $ctrl = test_load_ctrl($file);
+
+ reset_build_api();
+ my $api = get_build_api($ctrl);
+ is($api, $exp_api, "build API $desc matches");
+}
+
+test_parse_env_invalid('aa', 'text level');
+test_parse_env_invalid('999999999', 'out of range');
+
+test_parse_ctrl_invalid('ctrl-api-desync', 'multiple build API levels out of sync');
+test_parse_ctrl_invalid('ctrl-api-no-ver', 'build API with no level');
+test_parse_ctrl_invalid('ctrl-api-rel-noeq', 'API level with non-eq operator');
+test_parse_ctrl_invalid('ctrl-api-gt-max', 'API level > max');
+test_parse_ctrl_invalid('ctrl-api-no-int', 'API level is not an integer');
+
+test_parse_ctrl('ctrl-api-default', 0, 'default API level');
+test_parse_ctrl('ctrl-api-explicit', 1, 'explicit API level');
+
+# TODO: Add more test cases.
diff --git a/scripts/t/Dpkg_BuildAPI/ctrl-api-default b/scripts/t/Dpkg_BuildAPI/ctrl-api-default
new file mode 100644
index 0000000..f83ca38
--- /dev/null
+++ b/scripts/t/Dpkg_BuildAPI/ctrl-api-default
@@ -0,0 +1,4 @@
+Source: pkg-source
+
+Package: pkg-binary
+Architecture: all
diff --git a/scripts/t/Dpkg_BuildAPI/ctrl-api-desync b/scripts/t/Dpkg_BuildAPI/ctrl-api-desync
new file mode 100644
index 0000000..dd959ac
--- /dev/null
+++ b/scripts/t/Dpkg_BuildAPI/ctrl-api-desync
@@ -0,0 +1,10 @@
+Source: pkg-source
+Build-Depends:
+ dpkg-build-api (= 0),
+Build-Depends-Arch:
+ dpkg-build-api (= 1),
+Build-Depends-Indep:
+ dpkg-build-api (= 2),
+
+Package: pkg-binary
+Architecture: all
diff --git a/scripts/t/Dpkg_BuildAPI/ctrl-api-explicit b/scripts/t/Dpkg_BuildAPI/ctrl-api-explicit
new file mode 100644
index 0000000..cb168f8
--- /dev/null
+++ b/scripts/t/Dpkg_BuildAPI/ctrl-api-explicit
@@ -0,0 +1,6 @@
+Source: pkg-source
+Build-Depends:
+ dpkg-build-api (= 1),
+
+Package: pkg-binary
+Architecture: all
diff --git a/scripts/t/Dpkg_BuildAPI/ctrl-api-gt-max b/scripts/t/Dpkg_BuildAPI/ctrl-api-gt-max
new file mode 100644
index 0000000..f3ed403
--- /dev/null
+++ b/scripts/t/Dpkg_BuildAPI/ctrl-api-gt-max
@@ -0,0 +1,6 @@
+Source: pkg-source
+Build-Depends:
+ dpkg-build-api (= 999999999),
+
+Package: pkg-binary
+Architecture: all
diff --git a/scripts/t/Dpkg_BuildAPI/ctrl-api-no-int b/scripts/t/Dpkg_BuildAPI/ctrl-api-no-int
new file mode 100644
index 0000000..82d3cff
--- /dev/null
+++ b/scripts/t/Dpkg_BuildAPI/ctrl-api-no-int
@@ -0,0 +1,6 @@
+Source: pkg-source
+Build-Depends:
+ dpkg-build-api (= 1.0),
+
+Package: pkg-binary
+Architecture: all
diff --git a/scripts/t/Dpkg_BuildAPI/ctrl-api-no-ver b/scripts/t/Dpkg_BuildAPI/ctrl-api-no-ver
new file mode 100644
index 0000000..9fce731
--- /dev/null
+++ b/scripts/t/Dpkg_BuildAPI/ctrl-api-no-ver
@@ -0,0 +1,6 @@
+Source: pkg-source
+Build-Depends:
+ dpkg-build-api,
+
+Package: pkg-binary
+Architecture: all
diff --git a/scripts/t/Dpkg_BuildAPI/ctrl-api-rel-noeq b/scripts/t/Dpkg_BuildAPI/ctrl-api-rel-noeq
new file mode 100644
index 0000000..3b2e0f8
--- /dev/null
+++ b/scripts/t/Dpkg_BuildAPI/ctrl-api-rel-noeq
@@ -0,0 +1,6 @@
+Source: pkg-source
+Build-Depends:
+ dpkg-build-api (>= 1),
+
+Package: pkg-binary
+Architecture: all
diff --git a/scripts/t/Dpkg_BuildEnv.t b/scripts/t/Dpkg_BuildEnv.t
new file mode 100644
index 0000000..2e40ec7
--- /dev/null
+++ b/scripts/t/Dpkg_BuildEnv.t
@@ -0,0 +1,48 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 14;
+
+BEGIN {
+ use_ok('Dpkg::BuildEnv');
+}
+
+$ENV{DPKG_TEST_VAR_A} = 100;
+$ENV{DPKG_TEST_VAR_B} = 200;
+delete $ENV{DPKG_TEST_VAR_Z};
+
+is(scalar Dpkg::BuildEnv::list_accessed(), 0, 'no accessed variables');
+is(scalar Dpkg::BuildEnv::list_modified(), 0, 'no modified variables');
+
+is(Dpkg::BuildEnv::get('DPKG_TEST_VAR_A'), 100, 'get value');
+
+is(scalar Dpkg::BuildEnv::list_accessed(), 1, '1 accessed variables');
+is(scalar Dpkg::BuildEnv::list_modified(), 0, 'no modified variables');
+
+is(Dpkg::BuildEnv::get('DPKG_TEST_VAR_B'), 200, 'get value');
+Dpkg::BuildEnv::set('DPKG_TEST_VAR_B', 300);
+is(Dpkg::BuildEnv::get('DPKG_TEST_VAR_B'), 300, 'set value');
+
+is(scalar Dpkg::BuildEnv::list_accessed(), 2, '2 accessed variables');
+is(scalar Dpkg::BuildEnv::list_modified(), 1, '1 modified variable');
+
+ok(Dpkg::BuildEnv::has('DPKG_TEST_VAR_A'), 'variables is present');
+ok(!Dpkg::BuildEnv::has('DPKG_TEST_VAR_Z'), 'variables is not present');
+
+is(scalar Dpkg::BuildEnv::list_accessed(), 3, '2 accessed variables');
+is(scalar Dpkg::BuildEnv::list_modified(), 1, '1 modified variable');
diff --git a/scripts/t/Dpkg_BuildFlags.t b/scripts/t/Dpkg_BuildFlags.t
new file mode 100644
index 0000000..530871c
--- /dev/null
+++ b/scripts/t/Dpkg_BuildFlags.t
@@ -0,0 +1,174 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 40;
+
+BEGIN {
+ $ENV{DEB_BUILD_ARCH} = 'amd64';
+ $ENV{DEB_HOST_ARCH} = 'amd64';
+ use_ok('Dpkg::BuildFlags');
+}
+
+sub test_has_flag
+{
+ my ($bf, $flag, $optflag) = @_;
+
+ my $value = $bf->get($flag);
+ ok($value =~ m/$optflag/, "$flag contains $optflag: $value");
+}
+
+sub test_has_noflag
+{
+ my ($bf, $flag, $optflag) = @_;
+
+ my $value = $bf->get($flag);
+ ok($value !~ m/$optflag/, "$flag does not contain $optflag: $value");
+}
+my $bf = Dpkg::BuildFlags->new();
+
+ok($bf->has('CPPFLAGS'), 'CPPFLAGS is present');
+is($bf->get_origin('CPPFLAGS'), 'vendor', 'CPPFLAGS has a vendor origin');
+
+$bf->set('DPKGFLAGS', '-Wflag -On -fsome', 'system');
+is($bf->get('DPKGFLAGS'), '-Wflag -On -fsome', 'get flag');
+is($bf->get_origin('DPKGFLAGS'), 'system', 'flag has a system origin');
+ok(!$bf->is_maintainer_modified('DPKGFLAGS'), 'set marked flag as non-maint modified');
+
+$bf->strip('DPKGFLAGS', '-On', 'user', undef);
+is($bf->get('DPKGFLAGS'), '-Wflag -fsome', 'get stripped flag');
+is($bf->get_origin('DPKGFLAGS'), 'user', 'flag has a user origin');
+ok(!$bf->is_maintainer_modified('DPKGFLAGS'), 'strip marked flag as non-maint modified');
+
+my @strip_tests = (
+ {
+ value => '-fsingle',
+ strip => '-fsingle',
+ exp => '',
+ }, {
+ value => '-fdupe -fdupe',
+ strip => '-fdupe',
+ exp => '',
+ }, {
+ value => '-Wa -fdupe -fdupe -Wb',
+ strip => '-fdupe',
+ exp => '-Wa -Wb',
+ }, {
+ value => '-fdupe -Wa -Wb -fdupe',
+ strip => '-fdupe',
+ exp => '-Wa -Wb',
+ }, {
+ value => '-fdupe -Wa -fdupe -Wb',
+ strip => '-fdupe',
+ exp => '-Wa -Wb',
+ }, {
+ value => '-Wa -fdupe -Wb -fdupe',
+ strip => '-fdupe',
+ exp => '-Wa -Wb',
+ }
+);
+
+foreach my $test (@strip_tests) {
+ $bf->set('DPKGSTRIPFLAGS', $test->{value}, 'system');
+ $bf->strip('DPKGSTRIPFLAGS', $test->{strip}, 'user', undef);
+ is($bf->get('DPKGSTRIPFLAGS'), $test->{exp},
+ "strip flag '$test->{strip}' from '$test->{value}' to '$test->{exp}'");
+}
+
+$bf->append('DPKGFLAGS', '-Wl,other', 'vendor', 0);
+is($bf->get('DPKGFLAGS'), '-Wflag -fsome -Wl,other', 'get appended flag');
+is($bf->get_origin('DPKGFLAGS'), 'vendor', 'flag has a vendor origin');
+ok(!$bf->is_maintainer_modified('DPKGFLAGS'), 'append marked flag as non-maint modified');
+
+$bf->prepend('DPKGFLAGS', '-Idir', 'env', 1);
+is($bf->get('DPKGFLAGS'), '-Idir -Wflag -fsome -Wl,other', 'get prepended flag');
+is($bf->get_origin('DPKGFLAGS'), 'env', 'flag has an env origin');
+ok($bf->is_maintainer_modified('DPKGFLAGS'), 'prepend marked flag as maint modified');
+
+my %known_features = (
+ future => [ qw(
+ lfs
+ ) ],
+ abi => [ qw(
+ lfs
+ time64
+ ) ],
+ hardening => [ qw(
+ bindnow
+ branch
+ format
+ fortify
+ pie
+ relro
+ stackclash
+ stackprotector
+ stackprotectorstrong
+ ) ],
+ qa => [ qw(
+ bug
+ bug-implicit-func
+ canary
+ ) ],
+ reproducible => [ qw(
+ fixdebugpath
+ fixfilepath
+ timeless
+ ) ],
+ optimize => [ qw(
+ lto
+ ) ],
+ sanitize => [ qw(
+ address
+ leak
+ thread
+ undefined
+ ) ],
+);
+
+is_deeply([ sort $bf->get_feature_areas() ], [ sort keys %known_features ],
+ 'supported feature areas');
+
+foreach my $area (sort keys %known_features) {
+ ok($bf->has_features($area), "has feature area $area");
+ my %features = $bf->get_features($area);
+ is_deeply([ sort keys %features ],
+ $known_features{$area},
+ "supported features for area $area");
+}
+
+# Test lfs alias from abi to future, we need a 32-bit arch that does does
+# not currently have this flag built-in.
+$ENV{DEB_BUILD_ARCH} = 'i386';
+$ENV{DEB_HOST_ARCH} = 'i386';
+
+$ENV{DEB_BUILD_MAINT_OPTIONS} = 'future=+lfs';
+$bf = Dpkg::BuildFlags->new();
+test_has_flag($bf, 'CPPFLAGS', '-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64');
+
+$ENV{DEB_BUILD_MAINT_OPTIONS} = 'abi=+lfs';
+$bf = Dpkg::BuildFlags->new();
+test_has_flag($bf, 'CPPFLAGS', '-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64');
+
+$ENV{DEB_BUILD_MAINT_OPTIONS} = 'future=-lfs abi=+lfs';
+$bf = Dpkg::BuildFlags->new();
+test_has_flag($bf, 'CPPFLAGS', '-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64');
+
+$ENV{DEB_BUILD_MAINT_OPTIONS} = 'future=+lfs abi=-lfs';
+$bf = Dpkg::BuildFlags->new();
+test_has_noflag($bf, 'CPPFLAGS', '-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64');
+
+# TODO: Add more test cases.
diff --git a/scripts/t/Dpkg_BuildFlags_Ubuntu.t b/scripts/t/Dpkg_BuildFlags_Ubuntu.t
new file mode 100644
index 0000000..822fbf6
--- /dev/null
+++ b/scripts/t/Dpkg_BuildFlags_Ubuntu.t
@@ -0,0 +1,92 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 19;
+
+BEGIN {
+ use_ok('Dpkg::BuildFlags');
+}
+
+sub test_optflag
+{
+ my ($bf, $optflag) = @_;
+
+ foreach my $flag (qw(CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS
+ FFLAGS FCFLAGS)) {
+ my $value = $bf->get($flag);
+ ok($value =~ m/$optflag/, "$flag contains $optflag: $value");
+ }
+}
+
+sub test_ltoflag
+{
+ my $bf = shift;
+
+ # Test the LTO flags enabled by default on some arches.
+ ok($bf->get('LDFLAGS') =~ m/-flto=auto -ffat-lto-objects/,
+ "LDFLAGS contains LTO flags on $ENV{DEB_HOST_ARCH}");
+}
+
+sub test_no_ltoflag
+{
+ my $bf = shift;
+
+ # Test the LTO flags not being enabled.
+ ok($bf->get('LDFLAGS') !~ m/-flto=auto -ffat-lto-objects/,
+ "LDFLAGS does not contain LTO flags on $ENV{DEB_HOST_ARCH}");
+}
+
+my $bf;
+
+# Force loading the Dpkg::Vendor::Ubuntu module.
+$ENV{DEB_VENDOR} = 'Ubuntu';
+
+# Test the optimization flag inherited from the Dpkg::Vendor::Debian module.
+$ENV{DEB_HOST_ARCH} = 'amd64';
+$bf = Dpkg::BuildFlags->new();
+
+test_optflag($bf, '-O2');
+test_ltoflag($bf);
+
+# Test the overlaid Ubuntu-specific linker flag.
+ok($bf->get('LDFLAGS') =~ m/-Wl,-Bsymbolic-functions/,
+ 'LDFLAGS contains -Bsymbolic-functions');
+
+# Test the optimization flag override only for ppc64el.
+$ENV{DEB_HOST_ARCH} = 'ppc64el';
+$bf = Dpkg::BuildFlags->new();
+
+test_optflag($bf, '-O3');
+test_ltoflag($bf);
+
+# Test the optimization flag not enabled for riscv64.
+$ENV{DEB_HOST_ARCH} = 'riscv64';
+$bf = Dpkg::BuildFlags->new();
+
+test_no_ltoflag($bf);
+
+# Test the optimization flag override by DEB_BUILD_MAINT_OPTIONS.
+$ENV{DEB_BUILD_MAINT_OPTIONS} = 'optimize=+lto';
+$bf = Dpkg::BuildFlags->new();
+
+test_ltoflag($bf);
+
+$ENV{DEB_HOST_ARCH} = 'amd64';
+$ENV{DEB_BUILD_MAINT_OPTIONS} = 'optimize=-lto';
+$bf = Dpkg::BuildFlags->new();
+test_no_ltoflag($bf);
diff --git a/scripts/t/Dpkg_BuildInfo.t b/scripts/t/Dpkg_BuildInfo.t
new file mode 100644
index 0000000..edc1818
--- /dev/null
+++ b/scripts/t/Dpkg_BuildInfo.t
@@ -0,0 +1,26 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+
+BEGIN {
+ use_ok('Dpkg::BuildInfo');
+}
+
+is(scalar Dpkg::BuildInfo::get_build_env_allowed(), 60,
+ 'allowed environment variables array');
diff --git a/scripts/t/Dpkg_BuildOptions.t b/scripts/t/Dpkg_BuildOptions.t
new file mode 100644
index 0000000..f3080a2
--- /dev/null
+++ b/scripts/t/Dpkg_BuildOptions.t
@@ -0,0 +1,109 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 28;
+
+use Dpkg::ErrorHandling;
+
+use_ok('Dpkg::BuildOptions');
+
+{
+ no warnings; ## no critic (TestingAndDebugging::ProhibitNoWarnings)
+ # Disable warnings related to invalid values fed during
+ # the tests
+ report_options(quiet_warnings => 1);
+}
+
+$ENV{DEB_BUILD_OPTIONS} = 'noopt foonostripbar parallel=3 bazNOCHECK';
+
+my $dbo = Dpkg::BuildOptions->new();
+ok($dbo->has('noopt'), 'has noopt');
+is($dbo->get('noopt'), undef, 'noopt value');
+ok($dbo->has('foonostripbar'), 'has foonostripbar');
+is($dbo->get('foonostripbar'), undef, 'foonostripbar value');
+ok($dbo->has('parallel'), 'has parallel');
+is($dbo->get('parallel'), 3, 'parallel value');
+ok(!$dbo->has('bazNOCHECK'), 'not has bazNOCHECK');
+
+$dbo->reset();
+$dbo->merge('no opt no-strip parallel = 5 nocheck', 'test');
+ok($dbo->has('no'), 'has no');
+is($dbo->get('no'), undef, 'no value');
+ok($dbo->has('opt'), 'has opt');
+is($dbo->get('opt'), undef, 'opt value');
+ok($dbo->has('no-strip'), 'has no-strip');
+is($dbo->get('no-strip'), undef, 'no-strip value');
+ok($dbo->has('parallel'), 'has parallel');
+is($dbo->get('parallel'), '', 'parallel value');
+ok($dbo->has('nocheck'), 'has nocheck');
+is($dbo->get('nocheck'), undef, 'nocheck value');
+
+$dbo->reset();
+$dbo->set('parallel', 5);
+$dbo->set('noopt', undef);
+
+my $env = $dbo->export();
+is($env, 'noopt parallel=5', 'value of export');
+is($ENV{DEB_BUILD_OPTIONS}, $env, 'env match return value of export');
+$env = $dbo->export('OTHER_VARIABLE');
+is($ENV{OTHER_VARIABLE}, $env, 'export to other variable');
+
+$ENV{DEB_BUILD_OPTIONS} = 'foobar';
+$dbo = Dpkg::BuildOptions->new();
+$dbo->set('noopt', 1);
+is($dbo->output(), 'foobar noopt', 'output');
+
+$dbo = Dpkg::BuildOptions->new(envvar => 'OTHER_VARIABLE');
+is($dbo->get('parallel'), 5, 'import from other variable, check parallel');
+ok($dbo->has('noopt'), 'import from other variable, check noopt');
+
+my %theme = (
+ metal => undef,
+ pink => undef,
+ rusty => undef,
+ sky => undef,
+);
+my %theme_ref;
+
+$dbo = Dpkg::BuildOptions->new();
+
+$theme_ref{$_} = 1 foreach keys %theme;
+$dbo->set('theme', '+all');
+$dbo->parse_features('theme', \%theme);
+is_deeply(\%theme, \%theme_ref, 'features set with +all');
+
+$theme{$_} = undef foreach keys %theme;
+$theme_ref{$_} = 1 foreach keys %theme;
+$theme_ref{rusty} = 0;
+$dbo->set('theme', '+all,-rusty');
+$dbo->parse_features('theme', \%theme);
+is_deeply(\%theme, \%theme_ref, 'features set with +all,-rusty');
+
+$theme{$_} = undef foreach keys %theme;
+$theme_ref{$_} = 0 foreach keys %theme;
+$theme_ref{metal} = 1;
+$dbo->set('theme', '-all,+metal');
+$dbo->parse_features('theme', \%theme);
+is_deeply(\%theme, \%theme_ref, 'features set with +all,-rusty');
+
+$theme{$_} = $theme_ref{$_} = undef foreach keys %theme;
+$theme_ref{pink} = 1;
+$theme_ref{sky} = 0;
+$dbo->set('theme', '+pink,-sky');
+$dbo->parse_features('theme', \%theme);
+is_deeply(\%theme, \%theme_ref, 'features set with +pink,-sky');
diff --git a/scripts/t/Dpkg_BuildProfiles.t b/scripts/t/Dpkg_BuildProfiles.t
new file mode 100644
index 0000000..48e1e7e
--- /dev/null
+++ b/scripts/t/Dpkg_BuildProfiles.t
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 8;
+
+BEGIN {
+ use_ok('Dpkg::BuildProfiles', qw(parse_build_profiles
+ set_build_profiles
+ get_build_profiles));
+}
+
+# TODO: Add actual test cases.
+
+my $formula;
+
+$formula = [ ];
+is_deeply([ parse_build_profiles('') ], $formula,
+ 'parse build profiles formula empty');
+
+$formula = [ [ qw(nocheck) ] ];
+is_deeply([ parse_build_profiles('<nocheck>') ], $formula,
+ 'parse build profiles formula single');
+
+$formula = [ [ qw(nocheck nodoc stage1) ] ];
+is_deeply([ parse_build_profiles('<nocheck nodoc stage1>') ], $formula,
+ 'parse build profiles formula AND');
+
+$formula = [ [ qw(nocheck) ], [ qw(nodoc) ] ];
+is_deeply([ parse_build_profiles('<nocheck> <nodoc>') ], $formula,
+ 'parse build profiles formula OR');
+
+$formula = [ [ qw(nocheck nodoc) ], [ qw(stage1) ] ];
+is_deeply([ parse_build_profiles('<nocheck nodoc> <stage1>') ], $formula,
+ 'parse build profiles formula AND, OR');
+
+{
+ local $ENV{DEB_BUILD_PROFILES} = 'cross nodoc profile.name';
+ is_deeply([ get_build_profiles() ], [ qw(cross nodoc profile.name) ],
+ 'get active build profiles from environment');
+}
+
+set_build_profiles(qw(nocheck stage1));
+is_deeply([ get_build_profiles() ], [ qw(nocheck stage1) ],
+ 'get active build profiles explicitly set');
diff --git a/scripts/t/Dpkg_BuildTree.t b/scripts/t/Dpkg_BuildTree.t
new file mode 100644
index 0000000..baef2aa
--- /dev/null
+++ b/scripts/t/Dpkg_BuildTree.t
@@ -0,0 +1,64 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 11;
+use Test::Dpkg qw(:paths);
+
+use Cwd qw(realpath);
+use File::Path qw(make_path rmtree);
+use File::Spec::Functions qw(abs2rel);
+
+use Dpkg::File;
+
+use_ok('Dpkg::BuildTree');
+
+my $tmpdir = test_get_temp_path();
+
+make_path("$tmpdir/debian/tmp");
+
+my @srcfiles = qw(
+ changelog
+ control
+ copyright
+ shlibs.local
+);
+
+my @genfiles = qw(
+ files
+ files.new
+ substvars
+ substvars.new
+ tmp/build-object
+ tmp/generated
+);
+
+foreach my $file (@srcfiles, @genfiles) {
+ file_touch("$tmpdir/debian/$file");
+}
+
+my $bt = Dpkg::BuildTree->new(dir => $tmpdir);
+
+$bt->clean();
+
+foreach my $srcfile (@srcfiles) {
+ ok(-e "$tmpdir/debian/$srcfile", "source file $tmpdir/$srcfile exists");
+}
+
+foreach my $genfile (@genfiles) {
+ ok(! -e "$tmpdir/debian/$genfile", "generated file $tmpdir/$genfile does not exist");
+}
diff --git a/scripts/t/Dpkg_BuildTypes.t b/scripts/t/Dpkg_BuildTypes.t
new file mode 100644
index 0000000..639d8b2
--- /dev/null
+++ b/scripts/t/Dpkg_BuildTypes.t
@@ -0,0 +1,87 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 39;
+
+BEGIN {
+ use_ok('Dpkg::BuildTypes');
+}
+
+ok(build_is(BUILD_DEFAULT | BUILD_FULL), 'build is default full');
+is(get_build_options_from_type(), 'full', 'build is full');
+
+set_build_type(BUILD_DEFAULT | BUILD_BINARY, '--default-binary');
+is(get_build_options_from_type(), 'binary', 'build is binary');
+ok(build_is(BUILD_DEFAULT | BUILD_BINARY), 'build is default binary');
+
+set_build_type(BUILD_SOURCE | BUILD_ARCH_INDEP, '--build=source,all');
+is(get_build_options_from_type(), 'source,all', 'build is source,all');
+
+set_build_type_from_options('any,all', '--build=any,all', nocheck => 1);
+is(get_build_options_from_type(), 'binary', 'build is binary from any,all');
+ok(build_is(BUILD_BINARY), 'build is any,all');
+
+set_build_type_from_options('binary', '--build=binary', nocheck => 1);
+is(get_build_options_from_type(), 'binary', 'build is binary');
+ok(build_is(BUILD_BINARY), 'build is binary');
+
+set_build_type_from_options('source,all', '--build=source,all', nocheck => 1);
+ok(build_is(BUILD_SOURCE | BUILD_ARCH_INDEP), 'build source,all is source,all');
+ok(!build_is(BUILD_SOURCE | BUILD_ARCH_DEP), 'build source,all is not source,any');
+ok(build_has_any(BUILD_SOURCE), 'build source,all has_any source');
+ok(build_has_any(BUILD_ARCH_INDEP), 'build source,all has_any any');
+ok(build_has_none(BUILD_DEFAULT), 'build source,all has_none default');
+ok(build_has_none(BUILD_ARCH_DEP), 'build source,all has_none any');
+ok(!build_has_all(BUILD_BINARY), 'build source,all not has_all binary');
+ok(!build_has_all(BUILD_SOURCE | BUILD_ARCH_DEP),
+ 'build source,all not has_all source,any');
+ok(!build_has_all(BUILD_FULL), 'build source,all has_all full');
+
+set_build_type_from_targets('build-arch,build-indep',
+ '--targets=build-arch,build-indep', nocheck => 1);
+is(get_build_options_from_type(), 'binary',
+ 'build is binary from build-arch,build-indep');
+ok(build_is(BUILD_BINARY), 'build is binary from build-arch,build-indep');
+
+set_build_type_from_targets('binary', '--targets=binary', nocheck => 1);
+is(get_build_options_from_type(), 'binary', 'build is binary from binary');
+ok(build_is(BUILD_BINARY), 'build is binary from binary');
+
+set_build_type_from_targets('clean,binary-indep',
+ '--targets=clean,binary-indep', nocheck => 1);
+ok(build_is(BUILD_SOURCE | BUILD_ARCH_INDEP), 'build source,all is source,all');
+ok(!build_is(BUILD_SOURCE | BUILD_ARCH_DEP), 'build source,all is not source,any');
+ok(build_has_any(BUILD_SOURCE), 'build source,all has_any source');
+ok(build_has_any(BUILD_ARCH_INDEP), 'build source,all has_any any');
+ok(build_has_none(BUILD_DEFAULT), 'build source,all has_none default');
+ok(build_has_none(BUILD_ARCH_DEP), 'build source,all has_none any');
+ok(!build_has_all(BUILD_BINARY), 'build source,all not has_all binary');
+ok(!build_has_all(BUILD_SOURCE | BUILD_ARCH_DEP),
+ 'build source,all not has_all source,any');
+ok(!build_has_all(BUILD_FULL), 'build source,all has_all full');
+
+set_build_type(BUILD_BINARY, '--build=binary', nocheck => 1);
+ok(build_is(BUILD_BINARY), 'build binary is binary');
+ok(build_has_any(BUILD_ARCH_DEP), 'build binary has_any any');
+ok(build_has_any(BUILD_ARCH_INDEP), 'build binary has_any all');
+ok(build_has_all(BUILD_BINARY), 'build binary has_all binary');
+ok(build_has_none(BUILD_SOURCE), 'build binary has_none source');
+
+set_build_type(BUILD_FULL, '--build=full', nocheck => 1);
+ok(build_has_any(BUILD_SOURCE), 'build full has_any source');
+ok(build_has_all(BUILD_BINARY), 'build full has_all binary');
diff --git a/scripts/t/Dpkg_Changelog.t b/scripts/t/Dpkg_Changelog.t
new file mode 100644
index 0000000..c3e7413
--- /dev/null
+++ b/scripts/t/Dpkg_Changelog.t
@@ -0,0 +1,383 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 102;
+use Test::Dpkg qw(:paths);
+
+use File::Basename;
+
+use Dpkg::File;
+
+BEGIN {
+ use_ok('Dpkg::Changelog');
+ use_ok('Dpkg::Changelog::Debian');
+ use_ok('Dpkg::Vendor', qw(get_current_vendor));
+};
+
+my $datadir = test_get_data_path();
+
+my $vendor = get_current_vendor();
+
+#########################
+
+foreach my $file ("$datadir/countme", "$datadir/shadow", "$datadir/fields",
+ "$datadir/regressions", "$datadir/date-format", "$datadir/stop-modeline") {
+
+ my $changes = Dpkg::Changelog::Debian->new(verbose => 0);
+ $changes->load($file);
+
+ my $content = file_slurp($file);
+ cmp_ok($content, 'eq', "$changes", "string output of Dpkg::Changelog on $file");
+
+ my $errors = $changes->get_parse_errors();
+ my $basename = basename( $file );
+ is($errors, '', "Parse example changelog $file without errors" );
+
+ my @data = @$changes;
+ ok(@data, 'data is not empty');
+
+ if ($file eq "$datadir/countme") {
+ # test range options
+ cmp_ok(@data, '==', 7, 'no options -> count');
+ my $all_versions = join( '/', map { $_->get_version() } @data);
+
+ sub check_options {
+ my (%opts) = @_;
+
+ my @cnt = $changes->get_range($opts{range});
+ cmp_ok(@cnt, '==', $opts{count}, "$opts{name} -> count");
+ if ($opts{count} == @{$opts{data}}) {
+ is_deeply(\@cnt, $opts{data}, "$opts{name} -> returns all");
+ } else {
+ is_deeply([ map { $_->get_version() } @cnt ],
+ $opts{versions}, "$opts{name} -> versions" );
+ }
+ }
+
+ my %ref = (
+ changes => $changes,
+ data => \@data,
+ );
+
+ check_options(%ref, range => { count => 3 },
+ count => 3,
+ versions => [ '2:2.0-1', '1:2.0~rc2-3', '1:2.0~rc2-2' ],
+ name => 'positive count');
+ check_options(%ref, range => { count => 3, reverse => 1 },
+ count => 3,
+ versions => [ '1:2.0~rc2-2', '1:2.0~rc2-3', '2:2.0-1' ],
+ name => 'positive reverse count');
+ check_options(%ref, range => { count => -3 },
+ count => 3,
+ versions => [
+ '1:2.0~rc2-1sarge2',
+ '1:2.0~rc2-1sarge1',
+ '1.5-1',
+ ],
+ name => 'negative count');
+ check_options(%ref, range => { count => 1 },
+ count => 1,
+ versions => [ '2:2.0-1' ],
+ name => 'count 1');
+ check_options(%ref, range => { count => 1, default_all => 1 },
+ count => 1,
+ versions => [ '2:2.0-1' ],
+ name => 'count 1 (d_a 1)');
+ check_options(%ref, range => { count => -1 },
+ count => 1,
+ versions => [ '1.5-1' ],
+ name => 'count -1');
+
+ check_options(%ref, range => { count => 3, offset => 2 },
+ count => 3,
+ versions => [
+ '1:2.0~rc2-2',
+ '1:2.0~rc2-1sarge3',
+ '1:2.0~rc2-1sarge2',
+ ],
+ name => 'positive count + positive offset');
+ check_options(%ref, range => { count => -3, offset => 4 },
+ count => 3,
+ versions => [
+ '1:2.0~rc2-3',
+ '1:2.0~rc2-2',
+ '1:2.0~rc2-1sarge3',
+ ],
+ name => 'negative count + positive offset');
+
+ check_options(%ref, range => { count => 4, offset => 5 },
+ count => 2,
+ versions => [ '1:2.0~rc2-1sarge1', '1.5-1' ],
+ name => 'positive count + positive offset (>max)');
+ check_options(%ref, range => { count => -4, offset => 2 },
+ count => 2,
+ versions => [ '2:2.0-1', '1:2.0~rc2-3' ],
+ name => 'negative count + positive offset (<0)');
+
+ check_options(%ref, range => { count => 3, offset => -4 },
+ count => 3,
+ versions => [
+ '1:2.0~rc2-1sarge3',
+ '1:2.0~rc2-1sarge2',
+ '1:2.0~rc2-1sarge1',
+ ],
+ name => 'positive count + negative offset');
+ check_options(%ref, range => { count => -3, offset => -3 },
+ count => 3,
+ versions => [
+ '1:2.0~rc2-3',
+ '1:2.0~rc2-2',
+ '1:2.0~rc2-1sarge3',
+ ],
+ name => 'negative count + negative offset');
+
+ check_options(%ref, range => { count => 5, offset => -2 },
+ count => 2,
+ versions => [ '1:2.0~rc2-1sarge1', '1.5-1' ],
+ name => 'positive count + negative offset (>max)');
+ check_options(%ref, range => { count => -5, offset => -4 },
+ count => 3,
+ versions => [ '2:2.0-1', '1:2.0~rc2-3', '1:2.0~rc2-2' ],
+ name => 'negative count + negative offset (<0)');
+
+ check_options(%ref, range => { count => 7 },
+ count => 7,
+ name => 'count 7 (max)');
+ check_options(%ref, range => { count => -7 },
+ count => 7,
+ name => 'count -7 (-max)');
+ check_options(%ref, range => { count => 10 },
+ count => 7,
+ name => 'count 10 (>max)');
+ check_options(%ref, range => { count => -10 },
+ count => 7,
+ name => 'count -10 (<-max)');
+
+ check_options(%ref, range => { from => '1:2.0~rc2-1sarge3' },
+ count => 4,
+ versions => [
+ '2:2.0-1',
+ '1:2.0~rc2-3',
+ '1:2.0~rc2-2',
+ '1:2.0~rc2-1sarge3',
+ ],
+ name => 'from => "1:2.0~rc2-1sarge3"');
+ check_options(%ref, range => { since => '1:2.0~rc2-1sarge3' },
+ count => 3,
+ versions => [
+ '2:2.0-1',
+ '1:2.0~rc2-3',
+ '1:2.0~rc2-2',
+ ],
+ name => 'since => "1:2.0~rc2-1sarge3"');
+ $SIG{__WARN__} = sub {};
+ check_options(%ref, range => { since => 0 },
+ count => 7,
+ name => 'since => 0 returns all');
+ delete $SIG{__WARN__};
+ check_options(%ref, range => { to => '1:2.0~rc2-1sarge2' },
+ count => 3,
+ versions => [
+ '1:2.0~rc2-1sarge2',
+ '1:2.0~rc2-1sarge1',
+ '1.5-1',
+ ],
+ name => 'to => "1:2.0~rc2-1sarge2"');
+ ## no critic (ControlStructures::ProhibitUntilBlocks)
+ check_options(%ref, range => { until => '1:2.0~rc2-1sarge2' },
+ count => 2,
+ versions => [ '1:2.0~rc2-1sarge1', '1.5-1' ],
+ name => 'until => "1:2.0~rc2-1sarge2"');
+ ## use critic
+ #TODO: test combinations
+ }
+ if ($file eq "$datadir/fields") {
+ my $str = $changes->format_range('dpkg', { all => 1 });
+ my $expected = 'Source: fields
+Version: 2.0-0etch1
+Distribution: stable
+Urgency: high
+Maintainer: Frank Lichtenheld <frank@lichtenheld.de>
+Timestamp: 1200235759
+Date: Sun, 13 Jan 2008 15:49:19 +0100
+Closes: 1000000 1111111 2222222
+Changes:
+ fields (2.0-0etch1) stable; urgency=low
+ .
+ * Upload to stable (Closes: #1111111, #2222222)
+ * Fix more stuff. (LP: #54321, #2424242)
+ .
+ fields (2.0-1) unstable frozen; urgency=medium
+ .
+ [ Frank Lichtenheld ]
+ * Upload to unstable (Closes: #1111111, #2222222)
+ * Fix stuff. (LP: #12345, #424242)
+ .
+ [ Raphaël Hertzog ]
+ * New upstream release.
+ - implements a
+ - implements b
+ * Update S-V.
+ .
+ fields (2.0~b1-1) unstable; urgency=low,xc-userfield=foobar
+ .
+ * Beta
+ .
+ fields (1.0) experimental; urgency=high,xb-userfield2=foobar
+ .
+ * First upload (Closes: #1000000)
+Xb-Userfield2: foobar
+Xc-Userfield: foobar
+
+';
+ if ($vendor eq 'Ubuntu') {
+ $expected =~ s/^(Closes:.*)/$1\nLaunchpad-Bugs-Fixed: 12345 54321 424242 2424242/m;
+ }
+ cmp_ok($str, 'eq', $expected, 'fields handling');
+
+ $str = $changes->format_range('dpkg', { offset => 1, count => 2 });
+ $expected = 'Source: fields
+Version: 2.0-1
+Distribution: unstable frozen
+Urgency: medium
+Maintainer: Frank Lichtenheld <djpig@debian.org>
+Timestamp: 1200149359
+Date: Sun, 12 Jan 2008 15:49:19 +0100
+Closes: 1111111 2222222
+Changes:
+ fields (2.0-1) unstable frozen; urgency=medium
+ .
+ [ Frank Lichtenheld ]
+ * Upload to unstable (Closes: #1111111, #2222222)
+ * Fix stuff. (LP: #12345, #424242)
+ .
+ [ Raphaël Hertzog ]
+ * New upstream release.
+ - implements a
+ - implements b
+ * Update S-V.
+ .
+ fields (2.0~b1-1) unstable; urgency=low,xc-userfield=foobar
+ .
+ * Beta
+Xc-Userfield: foobar
+
+';
+ if ($vendor eq 'Ubuntu') {
+ $expected =~ s/^(Closes:.*)/$1\nLaunchpad-Bugs-Fixed: 12345 424242/m;
+ }
+ cmp_ok($str, 'eq', $expected, 'fields handling 2');
+
+ $str = $changes->format_range('rfc822', { offset => 2, count => 2 });
+ $expected = 'Source: fields
+Version: 2.0~b1-1
+Distribution: unstable
+Urgency: low
+Maintainer: Frank Lichtenheld <frank@lichtenheld.de>
+Timestamp: 1200062959
+Date: Sun, 11 Jan 2008 15:49:19 +0100
+Changes:
+ fields (2.0~b1-1) unstable; urgency=low,xc-userfield=foobar
+ .
+ * Beta
+Xc-Userfield: foobar
+
+Source: fields
+Version: 1.0
+Distribution: experimental
+Urgency: high
+Maintainer: Frank Lichtenheld <djpig@debian.org>
+Timestamp: 1199976559
+Date: Sun, 10 Jan 2008 15:49:19 +0100
+Closes: 1000000
+Changes:
+ fields (1.0) experimental; urgency=high,xb-userfield2=foobar
+ .
+ * First upload (Closes: #1000000)
+Xb-Userfield2: foobar
+
+';
+ cmp_ok($str, 'eq', $expected, 'fields handling 3');
+
+ # Test Dpkg::Changelog::Entry methods
+ is($data[1]->get_version(), '2.0-1', 'get_version');
+ is($data[1]->get_source(), 'fields', 'get_source');
+ is(scalar $data[1]->get_distributions(), 'unstable', 'get_distribution');
+ is(join('|', $data[1]->get_distributions()), 'unstable|frozen',
+ 'get_distributions');
+ is($data[3]->get_optional_fields(),
+ "Urgency: high\nCloses: 1000000\nXb-Userfield2: foobar\n",
+ 'get_optional_fields');
+ is($data[1]->get_maintainer(), 'Frank Lichtenheld <djpig@debian.org>',
+ 'get_maintainer');
+ is($data[1]->get_timestamp(), 'Sun, 12 Jan 2008 15:49:19 +0100',
+ 'get_timestamp');
+ my @items = $data[1]->get_change_items();
+ is($items[0], " [ Frank Lichtenheld ]\n", 'change items 1');
+ is($items[4], ' * New upstream release.
+ - implements a
+ - implements b
+', 'change items 2');
+ is($items[5], " * Update S-V.\n", 'change items 3');
+ }
+ if ($file eq "$datadir/date-format") {
+ is($data[0]->get_timestamp(), '01 Jul 2100 23:59:59 -1200',
+ 'get date w/o DoW, and negative timezone offset');
+ is($data[1]->get_timestamp(), 'Tue, 27 Feb 2050 12:00:00 +1245',
+ 'get date w/ DoW, and positive timezone offset');
+ is($data[2]->get_timestamp(), 'Mon, 01 Jan 2000 00:00:00 +0000',
+ 'get date w/ DoW, and zero timezone offset');
+ }
+ if ($file eq "$datadir/stop-modeline") {
+ is($changes->get_unparsed_tail(), "vim: et\n",
+ 'get unparsed modeline at EOF');
+ }
+ if ($file eq "$datadir/regressions") {
+ my $f = ($changes->format_range('dpkg'))[0];
+ is("$f->{Version}", '0', 'version 0 correctly parsed');
+ }
+
+ SKIP: {
+ skip('avoid spurious warning with only one entry', 2)
+ if @data == 1;
+
+ my $str;
+ my $oldest_version = $data[-1]->{Version};
+ $str = $changes->format_range('dpkg', { since => $oldest_version });
+
+ $str = $changes->format_range('rfc822');
+
+ ok(1, 'TODO check rfc822 output');
+
+ $str = $changes->format_range('rfc822', { since => $oldest_version });
+
+ ok(1, 'TODO check rfc822 output with ranges');
+ }
+}
+
+foreach my $test (([ "$datadir/misplaced-tz", 6 ],
+ [ "$datadir/unreleased", 5, 7 ])) {
+
+ my $file = shift @$test;
+ my $changes = Dpkg::Changelog::Debian->new(verbose => 0);
+ $changes->load($file);
+ my @errors = $changes->get_parse_errors();
+
+ ok(@errors, 'errors occured');
+ is_deeply( [ map { $_->[1] } @errors ], $test, 'check line numbers' );
+}
diff --git a/scripts/t/Dpkg_Changelog/countme b/scripts/t/Dpkg_Changelog/countme
new file mode 100644
index 0000000..166b72f
--- /dev/null
+++ b/scripts/t/Dpkg_Changelog/countme
@@ -0,0 +1,41 @@
+countme (2:2.0-1) unstable; urgency=low
+
+ * Final
+
+ -- Frank Lichtenheld <frank@lichtenheld.de> Tue, 4 Oct 2005 01:49:05 +0200
+
+countme (1:2.0~rc2-3) unstable; urgency=low
+
+ * kadabra
+
+ -- Frank Lichtenheld <frank@lichtenheld.de> Tue, 4 Oct 2005 01:48:05 +0200
+
+countme (1:2.0~rc2-2) unstable; urgency=low
+
+ * Abra
+
+ -- Frank Lichtenheld <frank@lichtenheld.de> Tue, 4 Oct 2005 01:47:48 +0200
+
+countme (1:2.0~rc2-1sarge3) unstable; urgency=low
+
+ * Baz
+
+ -- Frank Lichtenheld <frank@lichtenheld.de> Tue, 4 Oct 2005 01:47:19 +0200
+
+countme (1:2.0~rc2-1sarge2) unstable; urgency=low
+
+ * Bar
+
+ -- Frank Lichtenheld <frank@lichtenheld.de> Tue, 4 Oct 2005 01:47:08 +0200
+
+countme (1:2.0~rc2-1sarge1) unstable; urgency=low
+
+ * Foo
+
+ -- Frank Lichtenheld <frank@lichtenheld.de> Tue, 4 Oct 2005 01:46:49 +0200
+
+countme (1.5-1) unstable; urgency=low
+
+ * Initial
+
+ -- Frank Lichtenheld <frank@lichtenheld.de> Thu, 01 Jan 1970 00:00:00 +0000
diff --git a/scripts/t/Dpkg_Changelog/date-format b/scripts/t/Dpkg_Changelog/date-format
new file mode 100644
index 0000000..0916fb2
--- /dev/null
+++ b/scripts/t/Dpkg_Changelog/date-format
@@ -0,0 +1,17 @@
+date-format (0.2) unstable; urgency=low
+
+ * Date without day of week name and negative timezone offset.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> 01 Jul 2100 23:59:59 -1200
+
+date-format (0.1) unstable; urgency=low
+
+ * Date with day of week name and positive timezone offset.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Tue, 27 Feb 2050 12:00:00 +1245
+
+date-format (0.0) unstable; urgency=low
+
+ * Date with day of week name and zero timezone offset.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Mon, 01 Jan 2000 00:00:00 +0000
diff --git a/scripts/t/Dpkg_Changelog/fields b/scripts/t/Dpkg_Changelog/fields
new file mode 100644
index 0000000..df4638f
--- /dev/null
+++ b/scripts/t/Dpkg_Changelog/fields
@@ -0,0 +1,40 @@
+fields (2.0-0etch1) stable; urgency=low
+
+ * Upload to stable (Closes: #1111111, #2222222)
+ * Fix more stuff. (LP: #54321, #2424242)
+
+ -- Frank Lichtenheld <frank@lichtenheld.de> Sun, 13 Jan 2008 15:49:19 +0100
+
+fields (2.0-1) unstable frozen; urgency=medium
+
+ [ Frank Lichtenheld ]
+ * Upload to unstable (Closes: #1111111, #2222222)
+ * Fix stuff. (LP: #12345, #424242)
+
+ [ Raphaël Hertzog ]
+ * New upstream release.
+ - implements a
+ - implements b
+ * Update S-V.
+
+ -- Frank Lichtenheld <djpig@debian.org> Sun, 12 Jan 2008 15:49:19 +0100
+
+fields (2.0~b1-1) unstable; urgency=low,xc-userfield=foobar
+
+ * Beta
+
+ -- Frank Lichtenheld <frank@lichtenheld.de> Sun, 11 Jan 2008 15:49:19 +0100
+
+fields (1.0) experimental; urgency=high,xb-userfield2=foobar
+
+ * First upload (Closes: #1000000)
+
+ -- Frank Lichtenheld <djpig@debian.org> Sun, 10 Jan 2008 15:49:19 +0100
+
+fields (0.5) experimental
+
+ * This entry is in an older changelog format and it should not be
+ parsed. So let's put some non-conforming content.
+
+This line starts on the first column.
+-- Raphaël Hertzog
diff --git a/scripts/t/Dpkg_Changelog/misplaced-tz b/scripts/t/Dpkg_Changelog/misplaced-tz
new file mode 100644
index 0000000..39dc8e3
--- /dev/null
+++ b/scripts/t/Dpkg_Changelog/misplaced-tz
@@ -0,0 +1,12 @@
+error-tz (1.1-1) unstable; urgency=low
+
+ *
+
+ -- Frank Lichtenheld <djpig@debian.org> Mon, 16 Jul 2007 02:54:18 +0200
++0200
+
+error-tz (1.0-1) unstable; urgency=low
+
+ *
+
+ -- Frank Lichtenheld <djpig@debian.org> Mon, 16 Jul 2007 02:54:18 +0200
diff --git a/scripts/t/Dpkg_Changelog/regressions b/scripts/t/Dpkg_Changelog/regressions
new file mode 100644
index 0000000..4c8ad30
--- /dev/null
+++ b/scripts/t/Dpkg_Changelog/regressions
@@ -0,0 +1,7 @@
+re-gressions++1.2.3 (0) ALLOWED.chars-567+890; urgency=low
+
+ * Test allowed chars in package name and distribution name.
+ (Closes: #361171)
+ * Test how version 0 is exported through methods.
+
+ -- Frank Lichtenheld <frank@lichtenheld.de> Thu, 01 Jan 1970 00:00:00 +0000
diff --git a/scripts/t/Dpkg_Changelog/shadow b/scripts/t/Dpkg_Changelog/shadow
new file mode 100644
index 0000000..a23da58
--- /dev/null
+++ b/scripts/t/Dpkg_Changelog/shadow
@@ -0,0 +1,1755 @@
+shadow (1:4.0.3-36) unstable; urgency=low
+
+ * Debian specific programs fixes:
+ - Re-enable logging and displaying failures on login when login is
+ compiled with PAM and when FAILLOG_ENAB is set to yes. And create the
+ faillog file if it does not exist on postinst (as on Woody).
+ Closes: #192849
+ - do not localize login's syslog messages.
+ * Debian packaging fixes:
+ - Fix FTBFS with new dpkg 1.13 and use a correct dpkg-architecture
+ invocation. Closes: #314407
+ - Add a comment about potential sensitive information exposure
+ when LOG_UNKFAIL_ENAB is set in login.defs
+ Closes: #298773
+ - Remove limits.5 and limits.conf.5 man pages which do not
+ reflect the way we deal with limits in Debian
+ Closes: #288106, #244754
+ - debian/login.defs:
+ - Make SU_PATH and PATH consistent with the values used in /etc/profile
+ Closes: #286616
+ - Comment the UMASK setting which is more confusing than useful
+ as it only affects console logins. Better use pam_umask instead
+ Closes: #314539, #248150
+ - Add a comment about "appropriate" values for umask
+ Closes: #269583
+ - Correct the assertion about the variable defined by QMAIL_DIR
+ which is MAILDIR, not MAIL
+ Closes: #109279
+ - Move the PASS_MAX_LEN variable at the end of login.defs as this
+ is obsoleted when using PAM
+ Closes: #87301
+ - debian/passwd.config:
+ - Re-enable the password confirmation question at critical priority
+ Closes: #304350
+ - Do no prompt again for the login name when the two passwords don't
+ match while creating a new user
+ Closes: #245332
+ - debian/add-shell.sh, debian/remove-shell.sh, debian/shadowconfig.sh,
+ debian/passwd.config, debian/passwd.postinst:
+ - checked for bashisms, replaced "#!/bin/bash" with "#!/bin/sh",
+ Closes: #315767
+ - replaced "test XXX -a YYY" XSI:isms with "test XXX && test YYY",
+ for rationale see:
+ http://www.opengroup.org/onlinepubs/009695399/utilities/test.html
+ - replaced all unneeded "egrep"s with basic "grep"s
+ Closes: #256732
+ - debian/rules:
+ Remove the setuid bit on login
+ Closes: #298060
+ - debian/passwd.templates:
+ Templates rewrite to shorten them down a little and make them DTSG
+ compliant. Give more details about what the user's full name is used
+ for.
+ Closes: #287410
+ - Updated to Standards: 3.6.2 (checked)
+ * Debconf translation updates:
+ - Estonian added. Closes: #312471
+ - Basque updated. Closes: #314303
+ - Malagasy updated. Closes: #290842
+ - Punjabi updated. Closes: #315372
+ - Danish updated. Closes: #315378
+ - Polish updated. Closes: #315391
+ - Japanese updated. Closes: #315407
+ - Brazilian Portuguese updated. Closes: #315426
+ - Czech updated. Closes: #315429
+ - Spanish updated. Closes: #315434
+ - Lithuanian updated. Closes: #315483
+ - Galician updated. Closes: #315362
+ - Portuguese updated. Closes: #315375
+ - Simplified Chinese updated. Closes: #315567
+ - French updated
+ - Ukrainian updated. Closes: #315727
+ - Welsh updated. Closes: #315809
+ - Slovak updated. Closes: #315812
+ - Romanian updated. Closes: #315783
+ - Finnish updated. Closes: #315972
+ - Catalan updated. Closes: #316026
+ * Man pages translation updates:
+ - Remove the too outdated Korean translation of newgrp.1
+ which doesn't even mention sg
+ Closes: #261490
+ * Man pages correction for Debian specific issues:
+ - 402_usermod.8-system-users-range-286258:
+ Document the system user range from 0 to 999 in Debian
+ Closes: #286258
+ * Upstream bugs not fixed in upstream releases or CVS:
+ - 423_su_pass_args_without_concatenation
+ Thanks to Helmut Waitzmann.
+ Closes: #276419
+ * pass the argument to the shell or command without concatenation
+ before the call to exec.
+ * If no command is provided, the arguments after the username are for
+ the shell, no -c has to be appended.
+ - 008_su_ignore_SIGINT
+ * Also ignore SIGQUIT in su to avoid defeating the delay.
+ The gain in security is very minor.
+ Closes: #288827
+ - 424_pwck.8_quiet_option
+ pwck(8): document the -q option. Closes: #309408
+ - 425_lastlog_8_sparse
+ lastlog(8): Document that lastlog is a sparse file, and don't need to be
+ rotated. Closes: #219321
+ - 426_grpck_group-gshadow_members_consistency
+ * (grpck) warn for inconsistencies between members in /etc/group and gshadow
+ Closes: #75181
+ * (pwck and grpck) warn and propose a fix for entries present in the
+ regular /etc/group or /etc/passwd files and not in shadow/gshadow.
+ - 427_chage_expiry_0
+ Fix chage display in the case of null expiry fields (do not display
+ Never, but 01 Jan 1970)
+ Closes: #78961
+ * Upstream bugs already fixed in upstream releases or CVS:
+ - Corrected typos in chfn.1. Closes: #312428
+ - Corrected typos in gshadow.5. Closes: #312429
+ - Corrected typos in shadow.5. Closes: #312430
+ - Corrected typos in grpck.8. Closes: #312431
+ - Added patch (356th) for su to propagate SIGSTOP up and SIGCONT down.
+ Added similar patch (357th) for newgrp. Both changes only affect
+ operation with CLOSE_SESSION set to yes (in /etc/login.defs).
+ Closes: #314727
+ * Translation updates:
+ - debian/patches/010_more-i18ned-messages
+ - More messages are translatable. We will deal with the translation
+ updates after syncing with upstream.
+ Closes: #266281
+ - debian/patches/114_eu:
+ - Basque translation update. Closes: #314423
+ - debian/patches/132_vi.dpatch:
+ - Vietnamese translation update. Closes: #315840
+ -- Christian Perrier <bubulle@debian.org> Mon, 20 Jun 2005 23:37:56 +0300
+
+shadow (1:4.0.3-35) unstable; urgency=low
+
+ * Re-apply the debian/patches/036_CAN-2004-1001_passwd_check patch
+ which fixed the "Adjusted password check to fix authentication bypass"
+ security issue (CAN-2004-1001)
+ * Debian packaging fixes:
+ - Add --host to config_options on cross build. Patch from NIIBE Yutaka.
+ Closes: #283729
+ - Enable login for GNU/Hurd in rules. First patch from Robert Millan.
+ Closes: #249372
+ - Cleanup passwd debconf stuff as md5 passwords are assumed since
+ 1:4.0.3-19 and the resolution of #223664.
+ - Document the TTYPERM variable set to 0600 in the default login.defs file
+ Closes: #59439
+ - Make login and su use limits.so PAM module by default
+ (change made in sarge branch also)
+ Closes: #300720
+ - debian/rules: Add removal of config.log in the clean target
+ - debian/control:
+ - Add Martin to Uploaders
+ - Remove Sam Hartman from Uploaders. The team is now setup and this
+ does not really have a real meaning now. You're still welcome for
+ NMU's, Sam, and thanks for the good work.
+ - Switching from dpatch to quilt.
+ * Debconf translation updates:
+ - Portuguese spellchecked by Miguel Figueiredo
+ - Punjabi (Gumurkhi) added, by Amanpreet Singh Alam. Closes: #309800
+ * Man pages translation updates:
+ - German completed by reference to original man page
+ Closes: #311554
+ * Debian specific programs fixes:
+ - NONE
+ * Upstream bugs not fixed in upstream releases or CVS:
+ - 421_login.1_pishing:
+ Document how to initiate a trusted path under Linux
+ Closes: #305600
+ - set CLOSE_SESSIONS to yes in login.defs, and document why.
+ Closes: #163635
+ * Upstream bugs already fixed in upstream releases or CVS:
+ - 324_configure.in-no-debian-dir:
+ Separated from 004_configure.in : this change will not be needed when
+ syncing with upstream
+ - 325_gshadow_5_manpage:
+ Add a gshadow.5 man page, and clarifications in the newgrp and gpasswd
+ man pages.
+ Closes: #113191, #166173, #169046, #251926
+ - 326_su.1_pwconv.8-typos:
+ Correct typos in su.1 and pwconv.8 man pages.
+ Closes: #309666
+ * Translation updates:
+ - 004_configure.in, 100_LINGUAS
+ Add Vietnamese to LINGUAS. Patch for LINGUAS in configure.in moved
+ from 004_configure.in to the new 100_LINGUAS patch
+ - 101_cs: Czech updated by Miroslav Kure
+ Closes: #308658
+ - 102_de: German updated by Dennis Stampfer
+ - 104_fr: French updated by Jean-Luc Coulon
+ Closes: #308909
+ - 111_ca: Catalan completed by Guillem Jover
+ Closes: #309212
+ - 108_sv: Swedish completed with the help of Magnus Holmgren
+ Encoding issues fixed
+ Closes: #309380
+ - 109_uk: Ukrainian completed by Eugeniy Meshcheryakov
+ Closes: #308647
+ - 120_nl: Dutch updated by Bart Cornelis
+ Closes: #308662
+ - 124_ru: Russian updated by Yuri Kozlov
+ Closes: #308839
+ - 129_ru: Romanian updated by Sorin Batariuc
+ Closes: #308921
+ - 130_zh_TW: Tradition Chinese updated by Tetralet
+ Closes: #311588
+ - 131_tl: Tagalog updated by Eric Pareja
+ Closes: #310386
+ - 132_vi: Correct file used for Vietnamese translation
+ Closes: #306614, #307251, #307262, #308479
+
+ -- Christian Perrier <bubulle@debian.org> Fri, 3 Jun 2005 07:32:07 +0200
+
+shadow (1:4.0.3-34) unstable; urgency=low
+
+ * Debian packaging fixes:
+ - NONE
+ * Debian specific programs fixes:
+ - NONE
+ * Upstream bugs not fixed in upstream releases or CVS:
+ - 406_good_name:
+ - relaxed user/group names checking is now fixed and accepts
+ _only_ names matching '^[^-:\n][^:\n]*$'
+ Closes: #264879, #308478
+ * Upstream bugs already fixed in upstream releases or CVS:
+ - 311_high-uids.dpatch:
+ - Add large file support to lastlog and faillog. Closes: #280212
+ * Translation updates:
+ - 132_vi:
+ Vietnamese programs translation added (from upstream CVS)
+ Closes: #308479
+ - 118_it:
+ Italian programs translation updated
+ Closes: #308327
+
+ -- Christian Perrier <bubulle@debian.org> Tue, 10 May 2005 18:24:12 +0200
+
+shadow (1:4.0.3-33) unstable; urgency=low
+
+ * The "Don't believe lintian blindly" release
+ * Urgency left to low because RC bug fixed but we leave priority
+ to sarge-targeted work
+ * Debian packaging fixes:
+ - Remove CVS id tag from the supplied login.defs file
+ Closes: #308019
+ - revert dependency on debconf which would make it required
+ Closes: #308145
+ - Add the missing add-shell, remove-shell, cppw and cpgr
+ (Debian specific) man pages
+ Closes: #162241
+ - make lintian ignore warnings about missing debconf dependency
+ in passwd.lintian-overrides
+ * Debian specific programs fixes:
+ - NONE
+ * Upstream bugs not already fixed in upstream releases or CVS:
+ - NONE
+ * Upstream bugs already fixed in upstream releases or CVS:
+ - 313_pam_access_with_preauth:
+ - allow PAM account authorization when preauthenticated
+ Closes: #193869
+ - 314_passwd.1_formatting:
+ - minor formatting fixes of passwd(1) man page
+ Closes: #304447
+ - 315_chage.1_document_expiration_removal:
+ - document expiration removal in chage(1)
+ Closes: #304542
+ - 316_vipw-race-242407:
+ - make vipw to remove /etc/{passwd|shadow|group|gshadow}.edit
+ and only then unlock
+ Closes: #242407
+ - 317_lastlog_usage_249611:
+ - Fix the lastlog usage and all the translations accordingly
+ (--user instead of --login).
+ Closes: #249611
+ - 323_passwd.1-typo:
+ - correct a typo in passwd(1) man page. Closes: #302740
+
+ -- Christian Perrier <bubulle@debian.org> Sun, 8 May 2005 14:32:20 +0200
+
+shadow (1:4.0.3-32) unstable; urgency=low
+
+ * Switch to dpatch for upstream patches
+ This should bring more clarity to modifications
+ we make to upstream sources and help integrating
+ new upstream releases
+ Old patches have been moved quite roughly to
+ debian/patches
+ * Modified debian/rules for "Calling GNU configure properly", see
+ /usr/share/doc/autotools-dev/README.Debian.gz
+ * Debian packaging fixes:
+ - Lintian fixes:
+ - Description synopsis initial capital letters removed
+ - passwd now depends on debconf (>=0.5.00) as it uses the seen flag
+ - add login.lintian-overrides and passwd.lintian-overrides
+ files to mention setuid and setgid files and avoid lintian warning
+ about them
+ - debian/pam.d/login:
+ - Remove the confusing comment about "nullok". Closes: #207816
+ - debian/rules:
+ - Add call for dh_installdirs
+ - debian/passwd.dirs:
+ - Added
+ - debian/login.dirs:
+ - Added
+ * Debian specific programs fixes:
+ - fixed /usr/sbin/remove-shell bug with handling of non-existing/empty
+ /etc/shells file. Closes: #271565
+ * GNU config automated update: config.sub (20010907 to 20050422),
+ config.guess (20010904 to 20050422)
+
+ -- Christian Perrier <bubulle@debian.org> Tue, 3 May 2005 11:53:12 +0200
+
+shadow (1:4.0.3-31sarge3) unstable; urgency=low
+
+ * The "please buy me a brain" release
+ * *Really* shorten down the Dutch debconf translation for the root password
+ input so that it fits in one screen. Closes: #277750
+ * man/usermod.8: *Really* document -o option in usermod
+ Closes: #302388
+ * man/fr/po4a/fr: Removed. This directory only clutters up the diff
+ and is not used during the build process
+ * man/de/passwd.1: Updated. Closes: #304757
+ * man/de/chsh.1: Updated.
+ * man/it/*: All files updated. Closes: #305095
+ * Translation updates:
+ - Portuguese (from the translation file sent for 4.0.8 upstream)
+ Closes: #305257
+
+ -- Christian Perrier <bubulle@debian.org> Tue, 19 Apr 2005 19:31:43 +0200
+
+shadow (1:4.0.3-31sarge2) unstable; urgency=low
+
+ * Shorten down the Dutch debconf translation for the root password
+ input so that it fits in one screen. Closes: #277750
+ * man/usermod.8: Document -o option in usermod
+ Closes: #302388
+
+ -- Christian Perrier <bubulle@debian.org> Mon, 4 Apr 2005 20:28:47 +0200
+
+shadow (1:4.0.3-31sarge1) unstable; urgency=high
+
+ * Urgency set to high because of RC bug fixed. Reuploaded
+ because I messed up with the changelog first. Use this occasion
+ to start a sarge series just in case. Changes below were made
+ in the former version already.
+ * Avoid package file conflicts for woody->sarge upgrade:
+ - Add manpages-it and manpages-ko to Replaces: for login
+ - Remove manpages-de from Replaces: for login (useless)
+ - Improve readability of the Replaces line for passwd
+ Closes: #299549
+
+ -- Christian Perrier <bubulle@debian.org> Tue, 15 Mar 2005 13:55:34 +0100
+
+shadow (1:4.0.3-31) unstable; urgency=low
+
+ * New maintainer
+
+ -- Christian Perrier <bubulle@debian.org> Fri, 11 Mar 2005 19:28:38 +0100
+
+shadow (1:4.0.3-30.10) unstable; urgency=low
+
+ * Non-maintainer upload targeted at sarge.
+ * Programs translations:
+ - Greek updated. Closes: #293911
+ - French updated. Closes: #294330
+ * Debconf translations:
+ - Galician updated. Closes: #295543
+
+ -- Christian Perrier <bubulle@debian.org> Mon, 7 Feb 2005 08:18:56 +0100
+
+shadow (1:4.0.3-30.9) unstable; urgency=low
+
+ * Non-maintainer upload targeted at sarge.
+ * Programs translations:
+ - German updated. Closes: #291703
+ - Tagalog added. Closes: #292353
+ - Korean updated.
+
+ -- Christian Perrier <bubulle@debian.org> Sun, 23 Jan 2005 09:30:49 +0100
+
+shadow (1:4.0.3-30.8) unstable; urgency=low
+
+ * Non-maintainer upload targeted at sarge.
+ * Debconf translations:
+ - Tagalog added. Closes: #289837
+ * Programs translations:
+ - Traditional Chinese added. Closes: #288879
+
+ -- Christian Perrier <bubulle@debian.org> Tue, 11 Jan 2005 11:39:18 +0100
+
+shadow (1:4.0.3-30.7) unstable; urgency=low
+
+ * Non-maintainer upload targeted at sarge.
+ * Resolv conflict with manpage-spl in login
+ as well as passwd. Thanks to Robert Luberda for
+ the notice
+
+ -- Christian Perrier <bubulle@debian.org> Thu, 23 Dec 2004 22:23:11 +0100
+
+shadow (1:4.0.3-30.6) unstable; urgency=low
+
+ * Revert back to Ian Gulliver genuine patch
+ to chpasswd. Update man page accordingly.
+ Closes: #283961
+ (again)
+ * Programs translations
+ - German updated. Closes: #286522
+ * Debconf translations
+ - German updated. Closes: #286522
+
+ -- Christian Perrier <bubulle@debian.org> Mon, 20 Dec 2004 23:51:39 +0100
+
+shadow (1:4.0.3-30.5) unstable; urgency=high
+
+ * Non-maintainer upload targeted at sarge.
+ Fix release critical bug
+ * Resolve conflict with woody's manpages-pl package
+ which prevent woody->sarge upgrade if
+ manpages-pl was installed
+ Closes: #284239
+ * Programs translations
+ - Romanian added. Closes: #284338
+ * Add MD5 support to chpasswd
+ Thanks to Ian Gulliver for the patch
+ Closes: #283961
+ * Correct typos in man pages
+ Thanks to Nicolas François for the patch
+ Closes: #141322
+ * Replace "C/" with "../../" in man/fr/shadow.conf
+ for best integration in the package build process
+
+ -- Christian Perrier <bubulle@debian.org> Thu, 16 Dec 2004 21:48:56 +0100
+
+shadow (1:4.0.3-30.4) unstable; urgency=low
+
+ * Non-maintainer upload targeted at sarge.
+ Localisation and d-i related updates only
+ * Programs translations
+ - Albanian (very partial) added.
+ * Debconf translations
+ - Hindi added. Closes: #282443
+ - Malagasy added. Closes: #282580
+ - Albanian added. Closes: #282160
+
+ -- Christian Perrier <bubulle@debian.org> Thu, 25 Nov 2004 07:21:53 +0100
+
+shadow (1:4.0.3-30.3) unstable; urgency=high
+
+ * Non-maintainer upload: security fix using the woody patch
+ by the Security Team
+ * Adjusted password check to fix authentication bypass
+ [debian/patches/036_CAN-2004-1001_passwd_check]
+ * Debconf translations
+ - Brazilian Portuguese updated. Closes: #278051
+ - Norwegian Bokmal fixed. Closes: #277563
+ * Programs translations
+ - Indonesian updated. Closes: #277751, #277741
+
+ -- Christian Perrier <bubulle@debian.org> Tue, 2 Nov 2004 22:28:26 +0100
+
+shadow (1:4.0.3-30.2) unstable; urgency=low
+
+ * Non-maintainer upload targeted at sarge.
+ Localisation and d-i related updates only
+ * Debconf translations
+ - Macedonian added. Closes: #275781
+ - Slovakian updated. Closes: #273585
+ - Slovenian added.
+ * Man pages translations
+ - German for vipw.8/vigr.8. Closes: #260645
+ * Fix preseeding for d-i : do not mark debconf templates as seen
+ Also remove the hack for Joey Hess login name..:)
+ Closes: #271407
+ * Ask for the user full name at critical priority so that
+ it is never empty. Closes: #257700
+
+ -- Christian Perrier <bubulle@debian.org> Sun, 10 Oct 2004 19:02:50 +0200
+
+shadow (1:4.0.3-30.1) unstable; urgency=low
+
+ * Non-maintainer upload targeted at sarge. Localisation updates only
+ * Debconf translations
+ - Arabic added. Closes: #261022
+ - Swedish updated. Closes: #261553
+ - Bulgarian added. Closes: #262928
+ - Brazilian Portuguese updated. Closes: #263957
+ - Simplified Chinese updated. Closes: #268646
+ - Traditional Chinese updated. Closes: #268151
+ - German updated. Closes: #268051
+ - Basque synced with templates.pot
+ * Programs translations
+ - Swedish updated. Closes: #261553
+ - Russian updated. Closes: #268412
+ - Norwegian Bokmal updated. Closes: #269907
+ - Norwegian Nynorsk updated. Closes: #269907
+ - Hebrew updated. Closes: #269967
+ - Danish updated. Closes: #270083
+ - Catalan updated. Closes: #254956
+ * Man pages translations
+ - French translation completely rewritten and reviewed
+ Closes: #270168
+ - Add expiry.1 and limits.conf.5 to the list of installed man
+ pages (add two lines to passwd.files and one to rules)
+ From #270168 also.
+
+ -- Christian Perrier <bubulle@debian.org> Tue, 7 Sep 2004 20:20:21 +0200
+
+shadow (1:4.0.3-30) unstable; urgency=high
+ * Attempt to fix FTBFS and dependency problems on hurd. Closes: #235641
+ * don't run dh_undocumented anymore as it has become angstful.
+
+ * Thanks to Christian Perrier:
+ * Debconf translations
+ - Brazilian updated. Closes: #261387
+ - Croatian added. Closes: #261418
+ - Minor corrections fo ja.po and pl.po headers
+ * Programs translations
+ - Dutch updated. Closes: #260361
+ - Hebrew added. Closes: #260722
+ * Urgency set to high because of RC bug fixed:
+ * Correct check for root password being already set in passwd.config
+ Closes: #260799
+
+ * Acknowledge 29.1 NMU:
+ Closes: #256664, #257949, #258241, #258563, #258566, #258957,
+ #190567, #259389, #260223, #257949, #259663, #259827
+
+ -- Karl Ramm <kcr@debian.org> Tue, 27 Jul 2004 09:38:32 -0400
+
+shadow (1:4.0.3-29.1) unstable; urgency=low
+
+ * NMU with maintainer consent
+ * Programs translations
+ - Greek updated. Closes: #256664
+ - Finnish updated. Closes: #257949
+ - Spanish updated. Closes: #258241
+ - Polish updated. Closes: #258563
+ - Indonesian added (configure.in changed accordingly). Closes: #258566
+ - French updated. Closes: #258957, #190567
+ - Slovak updated. Closes: #259389
+ - Portuguese updated. Closes: #260223
+ * Debconf translations
+ - Finnish updated. Closes: #257949
+ * Typo correction in su.1 man page. Closes: #259663
+ * Removed malloc definition in libmisc/xmalloc.c
+ Closes: #259827
+ * Lintian-driven corrections
+ - Corrected section number in several man pages:
+ - grpck.8
+ - pwck.8
+ - ja/grpck.8
+ - pl/grpck.8
+ - pl/pwck.8
+ - Replace the full GPL text in copyright by a pointer
+ - Bumped Standards to 3.6.1.1 (changes checked)
+
+ -- Christian Perrier <bubulle@debian.org> Mon, 19 Jul 2004 17:52:24 +0200
+
+shadow (1:4.0.3-29) unstable; urgency=low
+ * Be up front on the origin of our su. Closes: #244297
+ * The following thanks to Christian Perrier:
+ * Debconf translations
+ - Hungarian added. Closes: #256493
+ - Greek updated. Closes: #251990
+ - Brazilian portuguese updated. Closes: #256771
+ * po/POTFILES.in
+ - corrected file. No more mentions unexisting files
+ Closes: #253792
+ this change was already in 28.5 but was forgotten in the
+ changelog
+ * Acknowledge NMUs:
+ closes: #244604, #244734, #246302, #246376, #246848, #246859,
+ #247084, #247698, #247770, #248386, #248391, #248392,
+ #248392, #248516, #248516, #248648, #248938, #248957,
+ #249141, #249257, #249682, #250169, #250339, #250496,
+ #251140, #251141, #251317, #251495, #251716, #251990,
+ #252087, #252499, #253165, #253186, #253570, #254503,
+ #254760
+
+ -- Karl Ramm <kcr@debian.org> Sat, 3 Jul 2004 00:24:55 -0400
+
+shadow (1:4.0.3-28.5) unstable; urgency=low
+
+ * debian/*.files
+ - care about adding ALL existing translations. Removed hard-coded
+ file names. Closes: #248516
+ Thanks to Ruben Porras for noticing
+ This involves changes to debian/*.files with the use of
+ regexp in these files
+ * libmisc/failure.c
+ - Make use of plural forms. Closes: #251317
+ * Programs translations
+ - Norwegian Bokmal and Norwegian Nynorsk translations. Closes: #252499
+ - Dutch updated. Closes: #253165
+ - Brazilian Portuguese updated
+ - Turkish updated
+ - Korean updated
+ - Czech updated
+ - Japanese updated
+ - German updated
+ - Catalan added. Closes: #254760
+ - Italian updated
+ * Debconf translations
+ - Finnish added. Closes: #253570
+ - Danish updated
+ - Hebrew added. Closes: #253186
+ - Traditional Chinese added. Closes: #254503
+ - French updated for clarification and shorten the root password screen
+
+ -- Christian Perrier <bubulle@debian.org> Tue, 22 Jun 2004 09:44:45 +0200
+
+shadow (1:4.0.3-28.4) unstable; urgency=low
+
+ * NMU for l10n stuff again
+ * Programs translations
+ - All languages "activated" in configure.in. Closes: #248516
+ - Russian. Closes: #250496
+ - Bosnian added. Closes: #251141
+ - Finnish update. Closes: #251495
+ - Italian update. Closes: #252087
+ * Debconf translations
+ - Norwegian Bokmal update. Closes: #250339
+ - Bosnian added. Closes: #251140
+ - Catalan updated. Closes: #251716
+ - Greek update. Closes: #251990
+ - Welsh added (directly sent by Dafydd Harries
+ * Christian Perrier
+ - debian/passwd.config : a few rewards to a few people. Just check
+ the code
+
+ -- Christian Perrier <bubulle@debian.org> Tue, 1 Jun 2004 09:11:01 -0300
+
+shadow (1:4.0.3-28.3) unstable; urgency=high
+
+ * NMU for correcting my mistake
+ * Remove an extra "fi" in passwd.config. Closes: #250169
+ * Debconf translation updates:
+ - Norwegian Nynorsk. Closes: #249682
+
+ -- Christian Perrier <bubulle@debian.org> Fri, 21 May 2004 06:50:13 +0200
+
+shadow (1:4.0.3-28.2) unstable; urgency=high
+
+ * NMU for Debian Installer rc1 release schedule
+ * Removed duplicate sentence in templates. Closes: #244734, #244604
+ * Move the "root password empty" check before the root password
+ confirmation. Closes: #247770
+ * Debconf translation updates:
+ - Danish. Closes: #246859
+ - Spanish. Closes: #246302
+ - Russian. Closes: #248392
+ - Simplified Chinese. Closes: #248938
+ - Lithuanian. Closes: #249141
+ - Italian. Closes: #249257
+ - Dutch sent directly by Bart Cornelis
+ - Korean sent directly by Changwoo Ryu
+ - Galician sent directly by Héctor Fernández
+ - Romanian sent directly by Eddy Petrisor
+ * Programs translation updates:
+ - Korean. Closes: #242055
+ - Japanese. Closes: #242586
+ - Polish. Closes: #246376
+ - Slovak. Closes: #247084
+ - Basque. Closes: #248386
+ - German. Closes: #248391
+ - Russian. Closes: #248392
+ - Spanish. Closes: #248516
+ - Czech. Closes: #248648
+ - Simplified Chinese. Closes: #248957
+ - Indonesian. Closes: #242813
+ - Italian sent directly by Giuseppe Sacco
+ * Translated man pages
+ - Typo correction in Brazilian Portuguese for gpasswd. Closes: #247698
+
+ -- Christian Perrier <bubulle@debian.org> Tue, 18 May 2004 12:09:34 +0200
+
+shadow (1:4.0.3-28.1) unstable; urgency=high
+
+ * NMU for special purposes below
+ * Urgency set to high for helping out Brazilian DD's building CD's
+ for FISL conference
+ * Translation updates:
+ - Debconf:
+ - Brazilian Portuguese. Closes: #246848
+ - Spanish. Was unfortunately based on older templates hence
+ this does not close 246302
+ - Basque: Closes: #243545
+ - German: Closes: #242116
+
+ -- Christian Perrier <bubulle@debian.org> Mon, 10 May 2004 23:23:25 +0200
+
+shadow (1:4.0.3-28) unstable; urgency=low
+
+ * Fix login and passwd in preinst to avoid prompts on woody upgrade,
+ Closes: #243099
+ * Fix login and passwd configuration file to support common-passwd
+ * Apply NMU patch from Christian Perrier, Closes: #241438
+
+ -- Sam Hartman <hartmans@debian.org> Thu, 29 Apr 2004 16:31:25 -0400
+
+shadow (1:4.0.3-27) unstable; urgency=low
+
+ * update "da" debconf translation, closes: #241262
+ * new "pt_BR" program translation, closes: #241366
+
+ -- Karl Ramm <kcr@debian.org> Thu, 1 Apr 2004 00:19:44 -0500
+
+shadow (1:4.0.3-26.1) unstable; urgency=low
+
+ * NMU for Debian Installer needs
+ * Translation updates:
+ - Debconf:
+ - French. Closes: #241438
+ - Ukrainian. Closes: #241514
+ - Swedish: #241558
+ - Japanese. Closes: #241802
+ - Danish. Closes: #241262
+ - Portuguese. Closes: #241675
+ - Polish. Closes: #243185, #242996
+ - Czech. Closes: #241877
+ - Korean. Closes: #241928
+ - Greek. Closes: #242396
+ - Turkish. Closes: #243103
+ - Slovak. Closes: #245671
+
+ -- Christian Perrier <bubulle@debian.org> Wed, 28 Apr 2004 11:47:34 +0200
+
+shadow (1:4.0.3-26) unstable; urgency=low
+
+ * Have passwd.config fall back gracefully to useradd if adduser is
+ unavailable. closes: #240894
+
+ -- Karl Ramm <kcr@debian.org> Wed, 31 Mar 2004 00:26:17 -0500
+
+shadow (1:4.0.3-25) unstable; urgency=low
+
+ * Update "da" program translation, thanks to Claus Hindsgaul.
+ * Update "sv" translation, closes: #239198
+ * lower debconf priority of shadow password question to 'low'
+
+ -- Karl Ramm <kcr@debian.org> Tue, 30 Mar 2004 19:39:59 -0500
+
+shadow (1:4.0.3-24) unstable; urgency=low
+
+ * add new program translations to the file manifest. *sigh*
+ closes: #241016
+ * add "tr" debconf translation. closes: #239148
+ * Rearrange username creation dialog text to make sense in
+ new order. closes: #240607
+ * Edit the debconf templates for content.
+ * Remove the program .gmo files in the clean step. closes: #200054
+
+ -- Karl Ramm <kcr@debian.org> Tue, 30 Mar 2004 11:37:22 -0500
+
+shadow (1:4.0.3-23) unstable; urgency=low
+
+ * increase maximum group name size to 32 for no particularly good reason
+ closes: #240456
+ * fix su man page to reflect code. closes: #239805
+ * fix username defaulting in passwd.config. closes: #238781
+ * update "it" debconf translation. closes: #237504
+ * update "ru" debconf translation. closes: #238211
+ * update "de" debconf translation. closes: #238779
+ * update "el" debconf translation. closes: #240473
+ * add "nn" debconf translation. closes: #238590
+ * add "da" program translation. closes: #238005
+ * add "nl" program translation. closes: #238488
+ * add "pt" program translation. closes: #238796
+ * add "pt" debconf translation. closes: #239641
+ * remove spurious const, closes: #240677
+
+ -- Karl Ramm <kcr@debian.org> Sun, 28 Mar 2004 19:46:34 -0500
+
+shadow (1:4.0.3-22) unstable; urgency=low
+
+ * Don't assume that lastlog.ll_time or utmp.ut_time or utmpx.ut_tv are made
+ up of time_ts and timevals, because they aren't on x86-64. Dismaying
+ but true.
+
+ -- Karl Ramm <kcr@debian.org> Sun, 14 Mar 2004 16:53:21 -0500
+
+shadow (1:4.0.3-21) unstable; urgency=low
+
+ * Try and get the right French translation update in the right place,
+ Karl, you can do it even if you do only speak English. Closes: #236993
+
+ -- Karl Ramm <kcr@debian.org> Wed, 10 Mar 2004 15:31:35 -0500
+
+shadow (1:4.0.3-20) unstable; urgency=low
+
+ * Added Norwegian Bokmal debconf translation, closes: #206349
+ * tell shadow build system about new message translations
+
+ -- Karl Ramm <kcr@debian.org> Thu, 4 Mar 2004 11:04:44 -0500
+
+shadow (1:4.0.3-19) unstable; urgency=low
+
+ * When creating a user account in passwd.config, ask for full name
+ first, and make up a default username. Closes: #235386
+ * "No really, assume md5 passwords". Closes: #223664
+
+ -- Karl Ramm <kcr@debian.org> Thu, 4 Mar 2004 00:42:08 -0500
+
+shadow (1:4.0.3-18) unstable; urgency=low
+
+ * Removed po/cs.po and added new debian/po/cs.po
+ Updated Czech translation, closes: #229125
+ * Updated Japanese debconf translation, closes: #227237
+ * Updated Danish debconf translation, closes: #227619
+ * Updated Dutch debconf translation, closes: #227883
+ * Updated Brazilian Portuguese debconf translation, closes: #228080
+ * Added Simplified Chinese debconf translation
+ Added Simplified Chinese programs translation
+ Closes: #229334
+ * Added Greek debconf translation
+ Added Greek programs translation
+ Closes: #229504, #229528
+ * Added Finnish programs translation, closes: #230369
+ charset changed from UTF-8 to ISO-8859-1 as the bug patch was wrong
+ * Updated German debconf translation, closes: #232710
+ * Updated Russian debconf translation, closes: #235541
+ * Added Ukrainian debconf translation, closes: #233560
+ * Added Lithuanian debconf translation, closes: #235698
+ * thanks to Christian Perrier <bubulle@debian.org>
+
+ -- Karl Ramm <kcr@debian.org> Wed, 3 Mar 2004 22:56:31 -0500
+
+shadow (1:4.0.3-17) unstable; urgency=low
+
+ * Fix braino in version number of example dependency in README.shells.
+ Apologies to anyone foolhardy enough to believe my documentation.
+ * Add Swedish debconf translation, closes: #225059
+ * New French debconf translation, closes: #225914
+ * Add Catalan debconf translation, closes: #227029
+ * add securetty files for the hurd, freebsd, and netbsd, closes: #200739
+
+ -- Karl Ramm <kcr@debian.org> Sun, 11 Jan 2004 17:37:54 -0500
+
+shadow (1:4.0.3-16) unstable; urgency=low
+
+ * run dh_installdeb *after* dh_installdebconf,
+ remove . from short description of passwd,
+ add versioned conflict with debconf older than 0.5
+ closes: #224133
+ * replace manpages-it due to man page conflict
+ closes: #224474
+ * fix the *other* su syslogs.
+ closes: #224508
+ * fix filename in control file, closes: #224579
+ * fix permissions on chage and expiry, closes: #224717
+ * run debconf-updatepo
+ * remove debian/compat as redundant
+
+ -- Karl Ramm <kcr@debian.org> Mon, 22 Dec 2003 19:53:30 -0500
+
+shadow (1:4.0.3-15) unstable; urgency=low
+
+ * remove bogus dependency on base-config 2.00,
+ closes: #222772, #223726
+ * New Czech translation thanks to Miroslav Kure.
+
+ -- Karl Ramm <kcr@debian.org> Fri, 12 Dec 2003 18:40:25 -0500
+
+shadow (1:4.0.3-14) unstable; urgency=low
+
+ * exit 30 when backing all the way out in passwd.conf, and
+ depend on base-config 2.00, closes: #222772
+ * adjust debconf templates for debian-installer work,
+ closes: #222832
+
+ -- Karl Ramm <kcr@debian.org> Thu, 11 Dec 2003 01:53:37 -0500
+
+shadow (1:4.0.3-13) unstable; urgency=low
+
+ * Fix typo passwd.config. Closes: #223079, #222714
+ * Let's try out this oldfangled anonymous ftp upload queue.
+
+ -- Karl Ramm <kcr@debian.org> Mon, 8 Dec 2003 17:59:31 -0500
+
+shadow (1:4.0.3-12) unstable; urgency=low
+
+ * Explicitly use automake-1.7 and aclocal-1.7. closes: #216594
+ * Update Danish debconf translation. closes: #216542
+ * Update French debconf translation. closes: #206352
+ * Update Dutch debconf translation. closes: #212995
+ * Remove redundant dependency on grep. closes: #216535
+ * Fix chfn documentation bug. closes: #213931
+ * Fix su syslogs to be less ambiguous. (old:new instead of old-new
+ because '-' can appear in usernames.) Not clearer, mind you, but less
+ ambiguous. closes: #213592
+ * Rename limits(5) to limits.conf(5) and edit to reflect reality.
+ closes: #212935
+ * Move the change_uid call in login back to where it was before -11, and
+ relocate the fork for pam_close_session above it. closes: #211884
+
+ -- Karl Ramm <kcr@debian.org> Sat, 25 Oct 2003 15:26:20 -0400
+
+shadow (1:4.0.3-11) unstable; urgency=low
+
+ * update Japanese debconf translation. closes: #210382
+ * update Brazilian Portuguese debconf translation. closes: #208122
+ * run pam cleanup code as root. closes: #195048
+
+ -- Karl Ramm <kcr@debian.org> Sat, 13 Sep 2003 17:49:29 -0400
+
+shadow (1:4.0.3-10) unstable; urgency=low
+
+ * postinst sources confmodule. closes: #88843
+ * Implement the pam configuration New World Order. Wow, that was quick. :-)
+ * Implement a scheme for allowing other packages to modify /etc/shells.
+
+ -- Karl Ramm <kcr@debian.org> Fri, 22 Aug 2003 20:58:42 -0400
+
+shadow (1:4.0.3-9) unstable; urgency=low
+
+ * fix mysterious creeping bug in po/Makefile.in.in, closes: #200052
+ * dutch debconf translation, closes: #204578
+ * switch to po-debconf, closes: #183998, #200130
+ * use automake1.7, closes: #205991
+ * update german debconf translation, closes: #94138
+ * I can't come up with a good justification as to why characters other
+ than ':'s and '\0's should be disallowed in group and usernames (other
+ than '-' as the leading character). Thus, the maintenance tools don't
+ anymore. closes: #79682, #166798, #171179
+ * Fix typo in /etc/pam.d/su. closes: #196804
+ * danish debconf translation, closes: #118245
+ * russian debconf translation, closes: #198729
+ * And last, but not least, what's undoubtedly going to be the most
+ popular change: md5 passwords are turned on by default, and there is
+ no prompt to change them. Yes, this is reduced functionality. No, it
+ can't go back in the way it was; the old code not only modified
+ conffiles, it modified *other*packages* conffiles and was a massive
+ policy violation. I expect this change will motivate the people who
+ have said that they will come up with a proper solution to do so.
+ closes: #186016, #110228, #171808
+
+ -- Karl Ramm <kcr@debian.org> Wed, 20 Aug 2003 02:06:50 -0400
+
+shadow (1:4.0.3-8) unstable; urgency=low
+
+ * Fix missing ':' in getopt call. closes: #184301
+ * Don't install mkpasswd, we don't use it. closes: #185919, #187906
+ * replaces: manpages-ko. closes: #184810
+ * Fix the message in #190567 (not closing until it's been accepted upstream)
+ * Fix brainos in login.1. closes: #184731
+ * Fixup permissions for chage. closes: #184138
+ * Force the umask to 022 in passwd.config. closes: #182506
+ * Add Sam Hartman <hartmans@debian.org> as an uploader.
+ * Update standards-version.
+ * Add versioned build-depend on debhelper.
+
+ -- Karl Ramm <kcr@debian.org> Sat, 26 Apr 2003 15:34:16 -0400
+
+shadow (1:4.0.3-7) unstable; urgency=low
+
+ * When relocating a user's home directory, don't fail and remove the new
+ home directory if we can't remove the old home directory for some
+ reason; the results can be spectacularly poor if, for instance, only
+ the rmdir() fails. closes: #166369
+ * run dh_installdebconf so base-config will work. *sigh*. closes: #166788
+
+ -- Karl Ramm <kcr@debian.org> Sun, 24 Nov 2002 21:40:30 -0500
+
+shadow (1:4.0.3-6) unstable; urgency=low
+
+ * remove automake dependency and leave only automake1.5, since it seems
+ to confuse the alpha and mipsel autobuilders for some reason.
+
+ -- Karl Ramm <kcr@debian.org> Sun, 13 Oct 2002 21:45:15 -0400
+
+shadow (1:4.0.3-5) unstable; urgency=low
+
+ * build-depend on libtool and automake. oops. closes: #164545
+
+ -- Karl Ramm <kcr@debian.org> Sun, 13 Oct 2002 01:44:47 -0400
+
+shadow (1:4.0.3-4) unstable; urgency=low
+
+ * I am unable to begin to express the bitterness that I'm now experiencing.
+ * replaces manpages-de <= 0.4-4, closes: #162097, #162173
+ * replaces manpages-fr, closes: #162150
+ * replaces manpages-hu, closes: #162126
+ * replaces manpages-ja, closes: #163511, #162095
+ * fix sg symlink, closes: #162339, #163652
+ * newgrp should be aware that getlogin() and ttyname() are not
+ guaranteed to return anything and NOT blindly assume that they
+ successfully returned a pointer to a string. I mean, really, people,
+ that sort of thing hasn't been reliable since 4.2BSD on a VAX. I'll
+ bet most of the working on the upstream weren't even born yet when
+ this sort of thing was commonplace (it was NEVER acceptable).
+ closes: #162303
+ * pull the manpage for the spiffy su forward. closes: #162275
+ * depend on automake1.5, and rerun the autogrunge. This should
+ *hopefully* make it build more consistently.
+ * this concludes the biweekly treading of water.
+
+ -- Karl Ramm <kcr@debian.org> Sat, 12 Oct 2002 14:56:16 -0400
+
+shadow (1:4.0.3-3) unstable; urgency=low
+
+ * the "fix the brain damage" release
+ * fix pam brain-damage in ch{age,passwd}, {group,user}{add,del,mod}, newusers
+ closes: #162181, #162199, #162228
+ * fix vipw symlink brain-damage: closes: #162218
+ * fix package description brain damage, closes: #139563
+ * install cp{pw,gr} brain damage
+
+ -- Karl Ramm <kcr@debian.org> Wed, 25 Sep 2002 01:21:35 -0400
+
+shadow (1:4.0.3-2) unstable; urgency=low
+
+ * fix "su -". closes: #162089
+ * document exit codes of groupdel and userdel (again, for userdel)
+ closes: #161861
+ * clean up logoutd cleanup
+
+ -- Karl Ramm <kcr@debian.org> Mon, 23 Sep 2002 19:44:40 -0400
+
+shadow (1:4.0.3-1) unstable; urgency=low
+
+ * new upstream version! closes: #149444, #150237, #145415
+ * completely new packaging!
+ * all new bugs!
+ * old bugs as well!
+ * remove /etc/init.d/logoutd, like the old postrm should've, closes: #160682
+ * fix passwd manpage, closes: #160477, #122797
+ * fix lastlog manpage, closes: #159886
+ * add as many virtual console devices as I seem to have to securetty,
+ closes: #156472
+ * add ttyS0 and tts/0 to securetty. closes: #130138
+ * su should not segfault if nobody has uid 0. closes: #139967
+ * install and use translations. closes: #118238
+ * upstream uses new automake. closes: #114935
+ * add russian template file for password. closes: #130358
+ * handle template installation correctly. closes: #156674
+ * don't place a maximum restriction on the length of passwords.
+ closes: #159487
+ * fix description. closes: #145459
+ * update config.{guess,sub}
+
+ -- Karl Ramm <kcr@debian.org> Wed, 18 Sep 2002 10:14:08 -0400
+
+shadow (20000902-12) unstable; urgency=high
+
+ * "oops"
+ * /etc/login.defs: /var/spool/mail -> /var/mail, closes: #125311
+
+ -- Karl Ramm <kcr@debian.org> Sun, 7 Apr 2002 11:54:48 -0400
+
+shadow (20000902-11) unstable; urgency=low
+
+ * Fix some nits:
+ * remove changelog~ file. oops. closes: #139711
+ * fix typo in control. closes: #139564
+ * Hmmm. People open more bugs when I upload new versions of things.
+ Maybe they just notice them more then, or maybe it's just Murphy.
+
+ -- K. Ramm <kcr@debian.org> Tue, 26 Mar 2002 12:14:33 -0500
+
+shadow (20000902-10) unstable; urgency=low
+
+ * We hates the automake. We hates it forever. closes: #139293
+ * stupid omission: logoutd still in postinst. closes: #139422
+ * make login.defs a bit clearer. closes: #138809
+
+ -- Karl Ramm <kcr@debian.org> Fri, 22 Mar 2002 12:09:07 -0500
+
+shadow (20000902-9) unstable; urgency=medium
+
+ * Get rid of logoutd, it doesn't work, didn't work in potato, and now
+ it's causing people to open RC bugs. closes: #138259, #66153, #121940
+ I'm told the timeoutd package does a better job anyway.
+ * add /bin/tcsh to /etc/shells, closes: #118103, #122112
+ * add /bin/ksh to /etc/shells, closes: #123556
+ * remove text about password aging from passwd(5), closes: #137493
+ * spanish debconf template for passwd, closes: #136463
+ * document the fact that you can not have a valid password in
+ /etc/shadow. closes: #131690
+ * /etc/login.defs: /var/spool/mail -> /var/mail, closes: #125311
+ * fix locations of utmp and wtmp in login(1), closes: #119656
+ * The package description for passwd refers to README.Debian.gz
+ but only README.debian.gz actually exists. Most packages use
+ README.Debian.gz, but the control file is the only place that gets it
+ wrong for this package. When in doubt, fix the documentation. :-)
+ closes: #116955
+
+ -- Karl Ramm <kcr@debian.org> Thu, 14 Mar 2002 17:05:56 -0500
+
+shadow (20000902-8) unstable; urgency=low
+
+ * check in passwd.expire.cron for already-expired passwords; closes: #102319
+ * note in chage.1 and shadowconfig.8 that password aging information
+ only works when shadow passwords are enabled. closes: #103702
+ * enable changing the name in chfn by default. closes: #107819
+ * fail to mangle files in lib/commonio.c, thanks to matt@linuxbox.nu
+ * add /dev/console to the secure ttys list. because. closes: #113949
+ * find the FHS mail spool first in configure. closes: #114951
+ (thanks to mjb@debian.org)
+ * above sadly causes automake to go bonkers, and I don't want to
+ reassemble the build system before woody is released. Keep automake
+ from going off on its own.
+ * terminate argument validation in login when it hits a '--'.
+ closes: #66368
+
+ -- Karl Ramm <kcr@debian.org> Mon, 22 Oct 2001 11:17:35 -0400
+
+shadow (20000902-7) unstable; urgency=low
+
+ * the "I'm sorry, I should've done this earlier" release
+ * Cancel login timeout after authentication so that patient people
+ timing out on network directory services can log in with local
+ accounts. Closes: #107148
+ * Add Brazilian Portuguese debconf template translation for passwd.
+ Closes: #105292, #93223
+ * Pull /usr/share/doc/$package/README.shadow-paper.gz. Closes: #98058
+ * Use getent instead of group to verify existence of shadow group
+ [works better for distributed group files]. Closes: #99902
+ [Note that this sort of problem is rampant in these postinst and
+ config scripts, but that's not getting fixed in woody.]
+ * Amend reference to /usr/doc in shadowconfig.8. Closes: #102804
+ * su should set $USER. Closes: #102995
+ * userdel now deletes user groups from /etc/gshadow as well as
+ /etc/group. Closes: #99442
+ * grpck now has an (otherwise undocumented) -p option, so that
+ shadowconfig can clean up the results of the above, so the config
+ script will fail randomly less often. Closes: #103385
+
+ -- Karl Ramm <kcr@debian.org> Wed, 22 Aug 2001 12:09:27 -0400
+
+shadow (20000902-6.1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Upgrade to latest config.sub and config.guess. Closes: #88547
+
+ -- Gerhard Tonn <gt@debian.org> Fri, 1 Jun 2001 20:38:43 +0200
+
+shadow (20000902-6) unstable; urgency=medium
+
+ * actually set root's password when appropriate
+ patch thanks to joeyh, closes #98402
+ * fix error in expiry man page. Such damage. closes: #99291
+ * fix group of setgid program chage and expiry, closes: #98122
+
+ -- Karl Ramm <kcr@debian.org> Thu, 31 May 2001 07:38:59 -0400
+
+shadow (20000902-5) unstable; urgency=low
+
+ * add build dependency on file, to keep libtool happy. closes: #97498
+
+ -- Karl Ramm <kcr@debian.org> Wed, 16 May 2001 06:57:23 -0400
+
+shadow (20000902-4) unstable; urgency=low
+
+ * Change maintainers, closes: #92355
+
+ -- Karl Ramm <kcr@debian.org> Sun, 13 May 2001 03:28:07 -0400
+
+shadow (20000902-3.1) unstable; urgency=low
+
+ * Non-maintainer upload
+ * Recompile to fix ARM lossage
+
+ -- Philip Blundell <philb@armlinux.org> Sun, 11 Mar 2001 07:47:27 -0500
+
+shadow (20000902-3) unstable; urgency=low
+
+ * Update config.sub and config.guess so ia64 compiled, closes: #81897
+ * libmisc/sub.c: skip '*' in shell name when doing subsystem, closes:
+ #82893
+ * src/su.c: don't assume uid 0 == "root", use getpwuid to fetch it,
+ closes: #81924
+ * This was fixed in a previous version, closes: #77057
+ * Update passwd long desc, closes: #88299
+ * Conflict with suidmanager << 0.5, and remove suid{,un}register calls,
+ closes: #87157
+ * Update policy to 3.5.0.0
+ * Added debconf support for passwd from base-config
+
+ -- Ben Collins <bcollins@debian.org> Sat, 3 Mar 2001 07:26:57 -0500
+
+shadow (20000902-2) unstable frozen; urgency=low
+
+ * control.hurd->control.gnu: closes: #77940
+ * Cannot reproduce, closes: #79447
+ * User never sent a patch, plus I think removing the passwd/account when
+ doing passwd -l is a bad idea. Makes it so you cannot unlock the
+ account. closes: #77824
+ * Don't allow shadowconfig to change perms of other binaries, close: #77057
+ * IMO, this is not a bug. It's part of a feature, and can be disabled by
+ turning off USER_GROUPS. closes: #76806
+ * /bin/login is suid root for several good reasons. For one, it allows
+ daemons that use it to run as non-root. This is a good thing since it
+ means only one program is running as root, and not several. closes: #17911
+ * sulog is fairly easy to grep or parse so I don't see how the
+ similarity of the log entries for failed and successful is a problem.
+ '-' for failed, '+' for success. closes: #63801
+ * logoutd.8: s,/etc/utmp,/var/run/utmp, closes: #80494
+ * Fix case where pam_auth returns a NULL username, closes: #76817, #75510
+ * Hmm, Linux is a sysv derivative, so the comment is perfectly
+ legitimate, closes: #76898
+ * MAX_PASSWORD is used by useradd, and CHFN_AUTH is actually used by
+ * chfn to decide if the current user needs to auth in order to change
+ their info, closes: #71114
+ * login.1: Fix \' closes: #75435
+ * login -f works for me assuming you call it as root. I tested this with
+ plain pam_unix.so, and also with pam_unix.so stacked with pam_ldap.so.
+ So if it doesn't work with telnet-heimdal, then that program is not
+ doing something right. closes: #78186
+ * login.pam.d: made pam_nologin.so requisite. closes: #80111
+ * su to root seems pretty quick to me, closes: #64756
+ * xmalloc.c: remove declaration of malloc, which was causing system
+ * header conflicts. closes: #80398
+
+ -- Ben Collins <bcollins@debian.org> Sun, 31 Dec 2000 14:33:47 -0500
+
+shadow (20000902-1) unstable frozen; urgency=low
+
+ * New upstream release, lots of Debian patches merged, closes: #72735
+ * man/passwd.1: removed reference to passwd(3), closes: #72704
+ * man/chsh.1,man/chfn.1: document login.defs affects on these programs,
+ closes: #68029
+ * not a bug, expected behavior, closes: #74137
+ * IMO, this is a bug in the user's setup, closes: #65600
+ * securetty: add devfs console devices, closes: #71946
+ * libmisc/sulog.c: removed arbitrary limit on number of chars printed of
+ the tty name (truncated to 6 chars, which is silly), closes: #65404
+ * tested this, and it works fine for me so long as pam_unix.so is called
+ with the nullok option (which it isn't by default because of security
+ concerns), closes: #75063
+ * appears to be fixed by PAM, closes: #70627
+ * src/useradd.c: user mkstemp instead of mktemp, per libc6 linktime
+ warning
+ * src/su.c: fixup arg handling passed to shell, closes: #75326
+
+ -- Ben Collins <bcollins@debian.org> Mon, 23 Oct 2000 13:22:29 -0400
+
+shadow (19990827-21) unstable frozen; urgency=low
+
+ * Added build deps
+ * Use pre-generated files for hurd/linux control file. The old method of
+ using cpp would have broken with the new gcc.
+
+ -- Ben Collins <bcollins@debian.org> Wed, 26 Jul 2000 21:04:03 -0400
+
+shadow (19990827-20) unstable frozen; urgency=low
+
+ * Release Manager
+ None of these are marked as RC in the BTS, however, they do make the
+ package unsuitable for release. Since this is an essential package (IOW,
+ installed on every Debian system), I hope you can see how important it
+ is to make sure this package is perfect. None of the changes are
+ functional (except the fix in logoutd's init script, which was a 20 char
+ change), so please consider this for the next test cycle.
+ * Fix logoutd init script from spurious output when /etc/porttime is not
+ there, closes: #63962, #64067
+ * su: Fix typo in usage output, closes: #60226
+ * passwd: Fixed typo and missing newline in output for successful password
+ change, closes: #64106, #63703
+ * passwd.1: Add documentation on the -f, -e, -s and -d command line
+ options, closes: #64339, #64410
+ * login: Verified that utmp/wtmp works when called by telnet with -h
+ option, closes: #56854
+
+ -- Ben Collins <bcollins@debian.org> Tue, 23 May 2000 14:40:01 -0400
+
+shadow (19990827-19) unstable frozen; urgency=low
+
+ * debian/local/shells: added esh, closes: #59934
+ * logoutd: modify to work with pam_time.so's time.conf file, modify
+ manpage to reflect this, closes: #61300
+ * userdel.8: added note about group removal, closes: #56723
+ * base-config handles md5 setup, closes: #60125
+ * cppw: make sure it gets installed, closes: #62960
+ * passwd: correct error message for "not you", closes: #61313
+ * sulog.c: fixed extern for char (char foo[] -> char *foo), closes: #61643
+ * userdel.8: documented userdel's exit values, closes: #54775
+ * passwd: error messages are two fold, the second is actually from
+ pam_strerror(), closes: #61937
+ * passwd: print "success" on successful password change, closes: #58676
+
+ -- Ben Collins <bcollins@debian.org> Sat, 29 Apr 2000 10:26:56 -0400
+
+shadow (19990827-18) unstable frozen; urgency=low
+
+ * Crap, all the bug fixes from -17 need to go to frozen too
+
+ -- Ben Collins <bcollins@debian.org> Tue, 29 Feb 2000 14:57:14 -0500
+
+shadow (19990827-17) unstable; urgency=low
+
+ * Fixed typo in login.defs, closes: #54877
+ * logoutd.init.d: Check for /etc/security/time.conf, closes: #54900
+ * login.defs: Added note about the MAIL env option, closes: #54768
+ * login.pam.d,passwd.pam.d: Use new options in pam_unix.so to enable
+ obscure password checks. This mimics the old behavior in pre-PAM
+ shadow, closes: #58203
+ * Use patch from Topi Miettinen <tom@pluto.nic.fi> to add pam session
+ ability to su, closes: #57526, #55873, #57532
+ * Made login's -f option also able to use the username after -- if none
+ was passed as it's optarg, closes: #53702
+
+ -- Ben Collins <bcollins@debian.org> Mon, 28 Feb 2000 12:37:22 -0500
+
+shadow (19990827-16) unstable; urgency=low
+
+ * got rid of g+s directories in the source tarball, closes: #54585
+ * make su mode 4755 in the package. This way there is no chance of a
+ failed dpkg install causing it to be left without suid root perms
+ before suidmanager or chmod is called in the postinst.
+ * src/login.c: added faillog support to the pam_authenticate loop. This
+ loop is now completely rewritten, and should produce better results on
+ failures, closes: #53164
+
+ -- Ben Collins <bcollins@debian.org> Sun, 9 Jan 2000 23:35:08 -0500
+
+shadow (19990827-15) unstable; urgency=low
+
+ * src/su.c: moved signal() call to re-establish SIGINT to right place,
+ closes: #54496
+ * src/login.c: if hostname is blank (not a remote login via rlogin or
+ telnet), then use the tty to log failures in syslog, closes: #53966
+ * passwd: Locking a password by appending '!' appears to be pretty
+ standard, so ssh needs to check for it.
+ * passwd and login come with a README.pam that discusses the differences
+ between the PAM and old non-PAM versions. It also talks about where to
+ look for details. Also now that I have added the extra examples to the
+ pam.d files, I hope this satisfies...closes: #52917
+ * A new package, base-config, which will be used by boot floppies is
+ going to have an option to configure MD5 usage for passwords. Since
+ this is the best place for it, and I don't really have any control
+ over it, I am .... closes: #47620
+ * libmisc/chowntty.c: applied patch for read-only root, closes: #52069
+
+ -- Ben Collins <bcollins@debian.org> Sat, 8 Jan 2000 22:11:29 -0500
+
+shadow (19990827-14) unstable; urgency=low
+
+ * debian/local/shells: added /bin/zsh, closes: #53883
+
+ -- Ben Collins <bcollins@debian.org> Sun, 2 Jan 2000 13:51:42 -0500
+
+shadow (19990827-13) unstable; urgency=low
+
+ * su.c: ignore SIGINT while authenticating, closes: #52372
+ * su.pam.d: added 2 new examples of how to allow su for wheel users
+ without prompting for a password, and also how to deny users of a
+ specific group.
+
+ -- Ben Collins <bcollins@debian.org> Sat, 1 Jan 2000 22:29:46 -0500
+
+shadow (19990827-12) unstable; urgency=low
+
+ * Recompiled against latest libpam and up'd the module deps,
+ closes: #52171
+ * login.pam.d: added "noenv" option so we don't clobber login's setting,
+ closes: #51441
+
+ -- Ben Collins <bcollins@debian.org> Tue, 14 Dec 1999 22:41:40 -0500
+
+shadow (19990827-11) unstable; urgency=low
+
+ * debian/passwd.in: add a preinst (matches login's) to fix the latest
+ build change (only affected hurd since it doesn't use login).
+ * debian/scripts/passwd.mk: use passwd.preinst instead of login.preinst
+ to complete the fix above.
+
+ -- Ben Collins <bcollins@debian.org> Mon, 6 Dec 1999 18:25:07 -0500
+
+shadow (19990827-10) unstable; urgency=low
+
+ * src/login.c: only set pam_fail_delay if > 0. Also make the default 0
+ so not defining it has the same affect as disabling it, closes: #51178
+ * src/userdel.c: make sure we remove the shadow group entries when
+ removing the users own group, closes: #50005, #50138
+
+ -- Ben Collins <bcollins@debian.org> Fri, 26 Nov 1999 22:37:44 -0500
+
+shadow (19990827-9) unstable; urgency=low
+
+ * src/su.c: Fixed getopt parsing, and added a usage output
+ * man/su.1: minor typos
+
+ -- Ben Collins <bcollins@debian.org> Mon, 8 Nov 1999 22:13:05 -0500
+
+shadow (19990827-8) unstable; urgency=low
+
+ * src/login.c: fixed login of username on successful login (was using
+ the normal username, when it should have used pam_user),
+ closes: #47819
+ * src/login.c: check for hushed login and pass PAM_SILENT if true,
+ closes: #48002
+ * src/useradd.c: set def_shell to /bin/bash, closes: #48304
+ * doc/README.debian: add note about how to avoid issues with nscd's
+ lag in aging the cache, closes: #48629
+ * src/cppw.c: new program to assist copying a passwd/group file without
+ corruption, closes: #42141
+
+ -- Ben Collins <bcollins@debian.org> Tue, 2 Nov 1999 21:46:28 -0500
+
+shadow (19990827-7) unstable; urgency=low
+
+ * {passwd,login}.pam.d: added blurb about how to use the pam_cracklib
+ module, and also changed it to use pam_unix and not pam_pwdb (gah!
+ how did that happen?), closes: #46983
+ * README.debian: changes to reflect new PAM usage as well as removing
+ references to obsolete config files, closes: #46595
+ * passwd.expire.cron: example script that informs users by email when
+ their accounts are about to expire, closes: #41393
+ * lastlogin.c: added -h option and usage as well as long option support,
+ closes: #45804
+ * shadow now only has 3 wishlist bugs and nothing else
+
+ -- Ben Collins <bcollins@debian.org> Sat, 9 Oct 1999 11:54:16 -0400
+
+shadow (19990827-6) unstable; urgency=low
+
+ * debian/shells: new file, needed to include /bin/sash, closes: #45826
+ * useradd.8,groupadd.8: added note about the preferred use of adduser
+ and addgroup when conforming to Debian policy (taken from notes in
+ adduser's man pages), closes: #22821
+ * dialups.5: new man page that documents /etc/{dialups,d_passwd},
+ closes: #42212
+ * src/su.c: added -m, -p and -s command line options to match GNU options,
+ also documented in su(1), closes: #45394, #46424
+ * login.defs.5: clarified usage of TTYTYPE_FILE, closes: #23194
+ * login.pam.d: added pam_issue.so which replaces the old ISSUE_FILE from
+ login.defs, this also allows it to grok escapes in the issue file,
+ also increases the MODDEPS to (>= 0.69-10). By default this module is
+ not enabled, closes: #21044
+ * login.defs.pam.linux: added ISSUE_FILE to list of deprecated options
+
+ -- Ben Collins <bcollins@debian.org> Mon, 4 Oct 1999 19:56:22 -0400
+
+shadow (19990827-5) unstable; urgency=low
+
+ * {login,su}.1: added description of a subsystem login, closes: #31987
+ * src/chowndir.c: fixed recursive chown's on usermod, also changed it
+ to use lchown and lstat since we actually want that, closes: #46405
+ * su.1: removed reference to suauth as well as added "-c" to the SYNOPSIS,
+ closes: #45685
+ * login.1: added options to the SYNOPSIS and documented OPTIONS,
+ closes: #28763
+ * login.defs.5: documented the ENVIRON_FILE options (even though it's
+ not really used in the PAM version), close: #28786
+ * 010_src_gpasswd.c: new patch, fixes changing group passwords when not
+ using shadow groups, closes: #25919
+ * {chfn,chsh,login}.pam.d: added nullok to pam_unix.so auth line to
+ allow for passwordless accounts, closes: #46510
+ * login.pam.d: add "standard" to the pam_mail option so we get old
+ style "You have..." login messages.
+
+ -- Ben Collins <bcollins@debian.org> Sun, 3 Oct 1999 13:41:53 -0400
+
+shadow (19990827-4) unstable; urgency=low
+
+ * Alright, we are really getting some usage from this now, and seeing
+ some odd ball setups, so it means more work for me, but more stable
+ and feature filled software for you :)
+ * debian/{login,su}.pam.d: Fixed spelling errors, closes: #45234, #45235
+ * debian/login.pam.d: Added commented pam_access.so reference and
+ description, closes: #45241
+ * src/login.c: moved usage of setup_uid_gid() when PAM is enabled or
+ pam_groups.so's groups get clobbered
+ * src/newgrp.c: don't call sanitize_env() and also make sure we don't
+ check passwords when the user is trying to get back to their default
+ group, closes: #22244
+ * Closed some other bugs that were either not really bugs, or they weren't
+ reproducible.
+ * debian/login.pam.d: moved around the pam_motd and pam_mail modules to
+ order them the same as old login would have done
+
+ -- Ben Collins <bcollins@debian.org> Sun, 19 Sep 1999 19:42:13 -0400
+
+shadow (19990827-3) unstable; urgency=low
+
+ * This is a "Sit down and really fix some bugs" update. I'm going through
+ the ones that really need some work.
+ * src/vipw.c: use the system() call to invoke the editor so that it accepts
+ command line args in the EDITOR and VISUAL environment vars, closes: #31029
+ * src/userdel.c: added code to remove user groups (of the same name) if there
+ were no members left and USERGROUPS_ENAB is set to yes, closes: #35046
+ * login.defs: documented above change
+ * {login,passwd}.postinst: fixed some bashisms, closes: #45159
+ * login.defs.pam.linux: documented the FAKE_SHELL option, closes: 31987
+ * su.1,login.1: documented the subsystem root ability in login and su, closes:
+ * doc directory for both packages now includes the README.shadow-paper file
+ closes: #15391
+
+ -- Ben Collins <bcollins@debian.org> Sun, 19 Sep 1999 15:49:11 -0400
+
+shadow (19990827-2) unstable; urgency=low
+
+ * debian/rules: use "$(CC) -E" instead of "cpp" to make it easier to
+ cross compile for Hurd (requested by Marcus Brinkman).
+ * debian/login.pam.d: forgot to remove that comment about login not
+ being PAMified, it is and works fine.
+ * src/login.c: Added login.defs option to turn on and off the persistent
+ login, also give note on when it isn't and is needed in login.defs.
+ * lib/getdef.c: Added CLOSE_SESSIONS for above code.
+ * man/login.defs.5: document the new CLOSE_SESSION option for login
+ * logoutd: disabled until I can fix it to grok /etc/security/time.conf
+
+ -- Ben Collins <bcollins@debian.org> Mon, 13 Sep 1999 18:57:47 -0400
+
+shadow (19990827-1) unstable; urgency=low
+
+ * New Maintainer, with Guy's consent.
+ closes: #22296, #22331 (closed some NMU bug reports)
+ * New upstream release, closes: #15879, #24712, #25739, #28785, #32991
+ closes: #38672, #39933, #41060, #42480, #22534, #12690, #36150, #26412
+ closes: #40398, #43750
+ * Ok, now for some dusting and house cleaning (aka The Bug Killfile
+ Begins Here):
+ %%- login package
+ - Not a bug in login anymore, closes: #28098
+ - No longer pertinent, and is not controlled by the login program,
+ closes: #23155
+ - This does not appear to be a bug anymore, closes: #32424
+ - This is not a login problem. Xterm itself prints the LOGIN message
+ and it does _not_ read login.access, closes: #16958
+ - Seems to be fixed, closes: #28098
+ - Huge list of "Fixed" bugs, that I want to close. I really need to
+ start with a clean slate in order to get some of this cleaned up,
+ closes: #3439, #11443, #13485, #13815, #15176, #15998, #16187, #17529
+ closes: #17532, #17532, #18133, #18225, #20052, #20876, #21280, #21357
+ closes: #21687, #21695, #21746, #21767, #22716, #24710
+ - lastlog(8): Clarified differences in the usage of "login-name" and
+ UID, closes: #26727
+ %%- passwd package
+ - newuser: appears to be working correctly and placing x, not !,
+ closes: #19620
+ - userdel(8): added note about user's mail spool also being deleted,
+ closes: #20790
+ - Can't reproduce this one, closes: #21639
+ - -e expire_date
+ The date on which the user account will be dis-
+ abled. The date is specified in the format
+ MM/DD/YY.
+ Bug filer was trying to use an integer instead of the documented
+ format, closes: #22533
+ - chfn's command line options seem to work for root and non-root,
+ closes: #25396
+ - seems to have been fixed by the latest upstream, #25670
+ - Removed references to shadow(3), closes: #32859
+ - passwd only saves first 8 chars...duh :) closes: #33368
+ - userdel can only do so much, the admin should know to check some
+ things on their own, closes: #35418
+ - Lot's of Y2K issues fixed in this release, closes: #37232
+ - useradd requires the -m option to make it create a home directory
+ if one does not exist, closes: #39581
+ - useradd's -p option requires the password to already be encrypted
+ as documented in useradd(8), closes: #39870, #39874
+ - More "Fixed" bugs in passwd, closes: #13753, #16893, #17894, #18132
+ closes: #18628, #12691
+ %%- su (no longer a package, but has bugs just the same, will be
+ forwarded to the login package soon)
+ - Sorry, but su (all su's) invoke the shell with -c "cmd". This is
+ documented, not a bug, it's a standard interface that su expects,
+ go fix sash's bug for not supporting it, closes: #14551
+ - Acknowledged NMU: closes: #20058
+ - More "Fixed" bugs getting closed...CLOSED AT LAST, closes: #17593
+ closes: #20057, #12689
+ * Switched to a new build setup (dbs)
+ * Split makes into separate files to make it a little cleaner
+ * FHS compliance changes (usr/{doc,man} to usr/share/{doc,man})
+ * debian/tar.c: removed
+ * su: su is now going to be provided by shadow's login package and
+ removed from shellutils (the shellutils maintainer agreed to this)
+ in preparation for future PAM support. Added conflicts with older
+ version of shellutils that does provide the su binary.
+ * debian/control.in: removed the secure-su package since login now
+ contains su and all of it's components
+ * debian/control.in: modified the package descriptions to be a little
+ more explicative of what they do.
+ * Upgraded standards version to 3.0.1.1
+ * Setup suidmanager support for all +s apps, closes: #15705, #15704, #15699
+ * Enabled PAM. Support now for su, passwd, chfn, chsh. I am working on the
+ support in login.
+ * expiry: Changed to be installed as sgid shadow instead of suid root
+ since it doesn't need root privileges. Also added man page expiry(1) based
+ on the comments found in expiry.c.
+ * Removed bashism's in control scripts. Now lintian clean (smells fresh too)
+ * chage.c: Keep chage from locking when not running as root, since it just
+ needs to read the shadow and password files. This let's it run sgid shadow
+ instead of suid root. When run as root, it can lock files for editing.
+ * login.c: Pam support Works For Me(tm)!
+ * login.c: Fixed PAM's auth when PAM_USER was not set from the command line,
+ also call pam_fail_delay() with FAIL_DELAY as the arg before authentication.
+ * etc/login.defs.pam.linux: new file, reflects options that PAM takesover
+ * etc/login.defs.pam.hurd: new file, same for Hurd
+ * debian/passwd.mk: make sure that login.defs.5 gets installed for Hurd
+ * pam.d/: Modified defaults for each service to reflect the old style and also
+ added commented options on how to enable obsoleted options from login.defs
+ in the PAM Way(tm).
+ * debian/rules: removed --disable-desrpc from configure options since it was
+ supposedly just a workaround for glibc 2.0
+ * src/login.c: reset pam_fail_delay after every failure
+ * debian/rules: remove debian/files on clean target
+ * src/login.c: removed setup_limits() and check_nologin() usage when PAM is
+ enabled
+ * debian/login.pam.d,debian/login.defs.pam.linux: made notes about the pam_limits.so
+ module, as well as pam_nologin.so
+ * debian/su.pam.d: made notes about pam_limits.so module
+ * debian/control.in: removed depends on libpam-motd since it is now in libpam-modules,
+ also make login conflict with secure-su
+ * debian/*: setup so that Hurd does not get PAM, since they don't have it ported
+ completely yet.
+ * debian/*: Final approach to a final upload, modified login.postinst to check old
+ obsolete conffiles to see if the user needs a notice that they are no longer used.
+
+ -- Ben Collins <bcollins@debian.org> Sat, 11 Sep 1999 19:58:14 -0400
+
+shadow (980403-0.3.3) unstable; urgency=low
+
+ * Non maintainer upload.
+ * Add dpkg-architecture and cross compilation support to the package.
+ * Changes for the Hurd:
+ + Only build passwd, add etc/login.defs.hurd to this package.
+ + libmisc/rlogin.c: Conditionalize CBAUD, which is not portable.
+
+ -- Marcus Brinkmann <brinkmd@debian.org> Thu, 5 Aug 1999 00:28:12 +0200
+
+shadow (980403-0.3.2) unstable; urgency=low
+
+ * configure.in patched for utmpx.h (for arm)
+
+ -- Jim Pick <jim@jimpick.com> Sun, 4 Oct 1998 19:06:15 -0700
+
+shadow (980403-0.3.1) frozen unstable; urgency=low
+
+ * Non maintainer upload.
+ changes.{guess,sub} changed to recognize a Arm architecture.
+
+ -- Turbo Fredriksson <turbo@debian.org> Fri, 14 Aug 1998 22:37:58 -0400
+
+shadow (980403-0.3) frozen unstable; urgency=high
+
+ * Non maintainer upload.
+ * src/login.c: Applied patch from <marekm@i17linuxb.ists.pwr.wroc.pl> to
+ fix security hole of login not checking the return code from setgid(),
+ initgroups() or setuid(). [#24710]
+
+ -- James Troup <james@nocrew.org> Fri, 17 Jul 1998 18:56:31 +0100
+
+shadow (980403-0.2) frozen unstable; urgency=low
+
+ * (login.defs): fixed UMASK
+ (thanks to James Troup for noticing my screwup :)
+ * Pruned non-Debian changelog entries.
+
+ -- Joel Klecker <jk@espy.org> Mon, 11 May 1998 11:25:22 -0700
+
+shadow (980403-0.1) frozen unstable; urgency=low
+
+ * Non-maintainer release.
+ * New upstream release (18225).
+ * (debian/login.postinst)
+ * Use 'touch' instead of 'cat >' when creating /var/log/faillog
+ (15998,16187,21687).
+ * No longer fails if no previous configured version exists (11433).
+ * (gpasswd): now checks which user invoked it before calling setuid() (18132).
+ * (debian/passwd.postinst): removed bashism (13753).
+ * (groupmod): NULL dereference fixed upstream, as a result, it no longer
+ dumps core when changing group name (16893,17894).
+ * (useradd): no longer segfaults if /etc/default/useradd is missing (18628).
+ * (login.defs.1): now documents more options (13485).
+ * (source): includes 'missing' (13815,18133,21280).
+ * (login.1):
+ * Removed mention of "d_passwd(5)", which doesn't exist,
+ and login.defs.5 now documents /etc/dialups (15176).
+ * Added /etc/nologin to FILES section and reference nologin(5) (21695).
+ * The URL mentioned in Bug#15391 is no longer valid.
+ * (login.defs): no longer sets ULIMIT (17529).
+ * (login):
+ * No longer uses static buffers for group lines (17532).
+ * Doesn't seem to make assumptions about gid_t any longer (21767).
+ * (faillog.8): s-/usr/adm-/var/log-g (19974).
+ * (lastlog.8): notes that "some systems" use /var/log instead of
+ /usr/adm (21746).
+ * Install upstream changelog as 'changelog.gz' as per policy (20052).
+ * (secure-su): Changed /etc/suauth to reference the group 'root'
+ instead of 'wheel' (17593).
+
+ -- Joel Klecker <jk@espy.org> Thu, 30 Apr 1998 18:32:12 -0700
+
+shadow (970616-1) unstable; urgency=low
+
+ * Upstream upgrade.
+ * chage works (10561).
+ * Fix NIS behavior (5634,8734,10032,10545,10984,11160,12064).
+ * Wrote pwconv,pwunconv,grpconv,grpunconv manpage (10940).
+ * vipw fixes (10521,10696,11618,11924,12184,13001)
+ * Fixes for new automake.
+ * Compile with glibc2. (8627,8777,9824,11713,11719,12082,12108,11442).
+ * debian/rules fixes (8876,12468).
+ * /etc/login.defs: UMASK=002 (9102).
+ * chown /dev/vcs* on login (9421,13255).
+ * Added tty9-tty12 to /etc/securetty (11644).
+ * Provide template and manpage for /etc/limits (12289).
+ * Fix security hole in postinst (11769).
+ * login fills out ut_addr field in utmp (10701).
+ * shadowconfig.sh fixes (9189,9328,9386,10968,12452,12469).
+ * Overcome postinst bug in old shadow-passwd package (9939,12120).
+ * useradd default GROUP=100 (9244).
+ * Allow 8 bit chars in chfn (12367).
+ * secure-su - set HOME, use SHELL if set (11003,11189).
+
+ -- Guy Maor <maor@ece.utexas.edu> Fri, 26 Sep 1997 19:23:42 -0500
+
+shadow (970616) unstable; urgency=low
+
+ * vipw preserves permissions on edited files (10521).
+ * various other bug fixes.
+
+ -- Marek Michalkiewicz <marekm@piast.t19.ds.pwr.wroc.pl> Mon, 16 Jun 1997 02:02:00 +0200
+
+shadow (970601) unstable; urgency=low
+
+ * Fix typo in libmisc/mail.c causing login to segfault.
+
+ -- Marek Michalkiewicz <marekm@piast.t19.ds.pwr.wroc.pl> Mon, 2 Jun 1997 07:33:00 +0200
+
+shadow (970502-2) unstable; urgency=low
+
+ * Fixes to shadow group support (grpconv didn't work).
+
+ -- Marek Michalkiewicz <marekm@piast.t19.ds.pwr.wroc.pl> Fri, 2 May 1997 15:48:00 +0200
+
+shadow (970502-1) unstable; urgency=low
+
+ * Upstream upgrade.
+
+ -- Marek Michalkiewicz <marekm@piast.t19.ds.pwr.wroc.pl> Fri, 2 May 1997 03:18:00 +0200
+
+shadow (961025-2) frozen unstable; urgency=medium
+
+ * Fix useradd -D segfault (8098, 8152, 8733).
+ * Fix shadowconfig - permfix only on xlock; /etc/init.d/xdm rewrite, chmod
+ (8102, 8320, 8333, 8708).
+ * Remove HOWTO from usr/doc/passwd as it's in linux-doc (8150).
+ * Fixes to su.1 (8153).
+ * login, passwd, su each conflict and replace with the old shadow-*
+ version. (8269, 8290, 8393, 8394).
+ * Put /etc/shells back in passwd (8328).
+ * Fixed login.postinst for upgrade from shadow-login (8392).
+ * Added -e to pwck for use in shadowconfig: reports only errors, no
+ warnings (8542).
+ * Wrote shadowconfig.8 (8588).
+
+ -- Guy Maor <maor@ece.utexas.edu> Sat, 19 Apr 1997 02:34:59 -0500
+
+shadow (961025-1) unstable; urgency=low
+
+ * Upstream upgrade, new source format.
+
+ -- Guy Maor <maor@ece.utexas.edu> Mon, 10 Feb 1997 02:56:56 -0600
+
diff --git a/scripts/t/Dpkg_Changelog/stop-modeline b/scripts/t/Dpkg_Changelog/stop-modeline
new file mode 100644
index 0000000..5b8a7b4
--- /dev/null
+++ b/scripts/t/Dpkg_Changelog/stop-modeline
@@ -0,0 +1,13 @@
+modeline (2.0-1) unstable; urgency=low
+
+ * Upload.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Tue, 4 Oct 2005 01:49:05 +0200
+
+modeline (1.0-1) unstable; urgency=low
+
+ * Upload.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Tue, 4 Oct 2005 01:48:05 +0200
+
+vim: et
diff --git a/scripts/t/Dpkg_Changelog/unreleased b/scripts/t/Dpkg_Changelog/unreleased
new file mode 100644
index 0000000..14cacae
--- /dev/null
+++ b/scripts/t/Dpkg_Changelog/unreleased
@@ -0,0 +1,11 @@
+source (2.0) UNRELEASED; urgency=medium
+
+ * This version has not been finished yet.
+
+ --
+
+source (1.0) unstable; urgency=medium
+
+ * New release.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Sat, 05 Nov 2016 18:42:23 +0100
diff --git a/scripts/t/Dpkg_Changelog_Ubuntu.t b/scripts/t/Dpkg_Changelog_Ubuntu.t
new file mode 100644
index 0000000..1cd622d
--- /dev/null
+++ b/scripts/t/Dpkg_Changelog_Ubuntu.t
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::Dpkg qw(:paths);
+
+$ENV{DEB_VENDOR} = 'Ubuntu';
+
+my $datafile = test_get_data_path('t/Dpkg_Changelog.t');
+
+do "$datafile";
diff --git a/scripts/t/Dpkg_Checksums.t b/scripts/t/Dpkg_Checksums.t
new file mode 100644
index 0000000..c1fc5da
--- /dev/null
+++ b/scripts/t/Dpkg_Checksums.t
@@ -0,0 +1,149 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 59;
+use Test::Dpkg qw(:paths);
+
+BEGIN {
+ use_ok('Dpkg::Checksums');
+}
+
+my $datadir = test_get_data_path();
+
+my @data = (
+ {
+ file => 'empty',
+ size => 0,
+ sums => {
+ md5 => 'd41d8cd98f00b204e9800998ecf8427e',
+ sha1 => 'da39a3ee5e6b4b0d3255bfef95601890afd80709',
+ sha256 => 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
+ }
+ }, {
+ file => 'data-1',
+ size => 7,
+ sums => {
+ md5 => '1b662eff496fde1a63cc5ff97beec10a',
+ sha1 => 'ff66a3dc152f273a19392d3099b2915c311c707e',
+ sha256 => 'f53cb4ee5128363210053c89627757c3dd864ab87e3ac9bff20dd6fe4175a140',
+ }
+ }, {
+ file => 'data-2',
+ size => 14,
+ sums => {
+ md5 => '785400cfc51d16a06e2c34aa511b99ef',
+ sha1 => '329ba56c0c9c63b6e138f3970ac3628e476a6854',
+ sha256 => '217147cd3126a076ba3fd816566a80aaaffff5facc572394dbd6af61a49760d1',
+ }
+ }
+);
+
+my %str_checksum;
+foreach my $f (@data) {
+ foreach my $alg (keys %{$f->{sums}}) {
+ $str_checksum{$alg} .= "\n$f->{sums}->{$alg} $f->{size} $f->{file}";
+ }
+}
+
+sub test_checksums {
+ my $ck = shift;
+
+ my @known_files = $ck->get_files();
+ my @data_files = map { $_->{file} } @data;
+
+ is_deeply(\@known_files, \@data_files, 'List of files');
+ foreach my $f (@data) {
+ ok($ck->has_file($f->{file}), "Known file $f->{file}");
+ is($ck->get_size($f->{file}), $f->{size}, "Known file $f->{file} size");
+ is_deeply($ck->get_checksum($f->{file}), $f->{sums},
+ "Known file $f->{file} checksums");
+ }
+}
+
+
+my @expected_checksums = qw(md5 sha1 sha256);
+my @known_checksums = checksums_get_list();
+
+is_deeply(\@known_checksums, \@expected_checksums, 'List of known checksums');
+
+foreach my $c (@expected_checksums) {
+ ok(checksums_is_supported($c), "Checksum $c is supported");
+
+ my $uc = uc $c;
+ ok(checksums_is_supported($uc), "Checksum $uc (uppercase) is supported");
+
+ ok(defined checksums_get_property($c, 'name'), "Checksum $c has name");
+ ok(defined checksums_get_property($c, 'regex'), "Checksum $c has regex");
+ ok(defined checksums_get_property($c, 'strong'), "Checksum $c has strong");
+}
+
+my $ck = Dpkg::Checksums->new();
+
+is(scalar $ck->get_files(), 0, 'No checksums recorded');
+
+# Check add_from_file()
+
+foreach my $f (@data) {
+ $ck->add_from_file("$datadir/$f->{file}", key => $f->{file});
+}
+
+foreach my $alg (keys %str_checksum) {
+ my $str = $ck->export_to_string($alg);
+ is($str, $str_checksum{$alg}, "Export checksum $alg to string from file");
+}
+
+test_checksums($ck);
+
+# Check add_from_string()
+
+foreach my $alg (keys %str_checksum) {
+ $ck->add_from_string($alg, $str_checksum{$alg});
+
+ my $str = $ck->export_to_string($alg);
+ is($str, $str_checksum{$alg}, "Export checksum $alg to string from string");
+}
+
+test_checksums($ck);
+
+# Check remove_file()
+
+ok($ck->has_file('data-2'), 'To be removed file is present');
+$ck->remove_file('data-2');
+ok(!$ck->has_file('data-2'), 'Remove file is not present');
+
+# Check add_from_control()
+my $ctrl;
+foreach my $f (@data) {
+ next if $f->{file} ne 'data-2';
+ foreach my $alg (keys %{$f->{sums}}) {
+ $ctrl->{"Checksums-$alg"} = "\n$f->{sums}->{$alg} $f->{size} $f->{file}";
+ }
+}
+$ck->add_from_control($ctrl);
+
+test_checksums($ck);
+
+# Check export_to_control()
+
+my $ctrl_export = {};
+$ck->export_to_control($ctrl_export);
+
+foreach my $alg (keys %str_checksum) {
+ is($ctrl_export->{"Checksums-$alg"}, $str_checksum{$alg},
+ "Export checksum $alg to a control object");
+}
diff --git a/scripts/t/Dpkg_Checksums/data-1 b/scripts/t/Dpkg_Checksums/data-1
new file mode 100644
index 0000000..2e51274
--- /dev/null
+++ b/scripts/t/Dpkg_Checksums/data-1
@@ -0,0 +1 @@
+data-1
diff --git a/scripts/t/Dpkg_Checksums/data-2 b/scripts/t/Dpkg_Checksums/data-2
new file mode 100644
index 0000000..e1a5ff3
--- /dev/null
+++ b/scripts/t/Dpkg_Checksums/data-2
@@ -0,0 +1 @@
+data-2 data-2
diff --git a/scripts/t/Dpkg_Checksums/empty b/scripts/t/Dpkg_Checksums/empty
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/scripts/t/Dpkg_Checksums/empty
diff --git a/scripts/t/Dpkg_Compression.t b/scripts/t/Dpkg_Compression.t
new file mode 100644
index 0000000..3fd5983
--- /dev/null
+++ b/scripts/t/Dpkg_Compression.t
@@ -0,0 +1,176 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 48;
+use Test::Dpkg qw(:paths);
+
+use IPC::Cmd qw(can_run);
+
+use_ok('Dpkg::Compression');
+use_ok('Dpkg::Compression::FileHandle');
+
+my $tmpdir = test_get_temp_path();
+my @lines = ("One\n", "Two\n", "Three\n");
+my $fh;
+my $have_gunzip = can_run('gunzip');
+
+sub test_write {
+ my ($filename, $check_result) = @_;
+
+ $fh = Dpkg::Compression::FileHandle->new();
+ open $fh, '>', $filename or die 'open failed';
+ print { $fh } $lines[0];
+ syswrite($fh, $lines[1]);
+ printf { $fh } '%s', $lines[2];
+ close $fh or die 'close failed';
+
+ $check_result->($filename, 'std functions');
+
+ unlink $filename or die "cannot unlink $filename";
+
+ $fh = Dpkg::Compression::FileHandle->new();
+ $fh->open($filename, 'w');
+ $fh->print($lines[0]);
+ $fh->write($lines[1], length($lines[1]));
+ $fh->printf('%s', $lines[2]);
+ $fh->close() or die 'close failed';
+
+ $check_result->($filename, 'IO::Handle methods');
+}
+
+sub check_uncompressed {
+ my ($filename, $method) = @_;
+ open(my $read_fh, '<', $filename) or die "cannot read $filename";
+ my @read = <$read_fh>;
+ close $read_fh or die 'cannot close';
+ is_deeply(\@lines, \@read, "$filename correctly written ($method)");
+}
+
+sub check_compressed {
+ my ($filename, $method) = @_;
+ open my $read_fh, '-|', 'gunzip', '-c', "$tmpdir/myfile.gz"
+ or die 'cannot fork zcat';
+ my @read = <$read_fh>;
+ close $read_fh or die 'cannot close';
+ is_deeply(\@lines, \@read, "$filename correctly written ($method)");
+}
+
+sub test_read {
+ my $filename = shift;
+
+ $fh = Dpkg::Compression::FileHandle->new();
+ open($fh, '<', $filename) or die 'open failed';
+ my @read = <$fh>;
+ close $fh or die 'close failed';
+
+ is_deeply(\@lines, \@read, "$filename correctly read (std functions)");
+
+ @read = ();
+ $fh = Dpkg::Compression::FileHandle->new();
+ $fh->open($filename, 'r') or die 'open failed';
+ @read = $fh->getlines();
+ $fh->close() or die 'close failed';
+
+ is_deeply(\@lines, \@read, "$filename correctly read (IO::Handle methods)");
+}
+
+# Check compression properties.
+
+my @compressors = compression_get_list();
+is_deeply([ sort @compressors ] , [ qw(bzip2 gzip lzma xz) ],
+ 'supported compressors');
+
+is(compression_get_default(), 'xz', 'default compressor is xz');
+eval {
+ compression_set_default('invented-compressor');
+};
+ok($@, 'cannot set compressor to an unsupported name');
+is(compression_get_default(), 'xz', 'default compressor is still xz');
+compression_set_default('gzip');
+is(compression_get_default(), 'gzip', 'default compressor changed to gzip');
+compression_set_default('xz');
+is(compression_get_default(), 'xz', 'default compressor reset to xz');
+
+ok(compression_is_supported('gzip'), 'gzip is supported');
+ok(compression_is_supported('xz'), 'xz is supported');
+ok(compression_is_supported('bzip2'), 'bzip2 is supported');
+ok(compression_is_supported('lzma'), 'lzma is supported');
+
+is(compression_guess_from_filename('filename'), undef,
+ 'compressor <none> guessed from "filename"');
+is(compression_guess_from_filename('filename.gz'), 'gzip',
+ 'compressor <none> guessed from "filename"');
+is(compression_guess_from_filename('filename.xz'), 'xz',
+ 'compressor <none> guessed from "filename"');
+is(compression_guess_from_filename('filename.bz2'), 'bzip2',
+ 'compressor <none> guessed from "filename"');
+is(compression_guess_from_filename('filename.lzma'), 'lzma',
+ 'compressor <none> guessed from "filename"');
+
+is(compression_get_file_extension('gzip'), 'gz', 'gzip file ext');
+is(compression_get_file_extension('xz'), 'xz', 'xz file ext');
+is(compression_get_file_extension('bzip2'), 'bz2', 'bzip2 file ext');
+is(compression_get_file_extension('lzma'), 'lzma', 'lzma file ext');
+
+is(compression_get_level('gzip'), 9, 'gzip level is 9');
+compression_set_level('gzip', 1);
+is(compression_get_level('gzip'), 1, 'gzip level is now 1');
+compression_set_level('gzip');
+is(compression_get_level('gzip'), 9, 'gzip level is back to 9');
+is(compression_get_level('xz'), 6, 'xz level is 6');
+is(compression_get_level('bzip2'), 9, 'bzip2 level is 9');
+is(compression_get_level('lzma'), 6, 'lzma level is 6');
+
+my $ext_regex = compression_get_file_extension_regex();
+
+ok('filename.gz' =~ m/\.$ext_regex$/, '.gz matches regex');
+ok('filename.xz' =~ m/\.$ext_regex$/, '.xz matches regex');
+ok('filename.bz2' =~ m/\.$ext_regex$/, '.bz2 matches regex');
+ok('filename.lzma' =~ m/\.$ext_regex$/, '.lzma matches regex');
+
+# Test changing the default compression levels
+my $old_level = compression_get_default_level();
+compression_set_default_level(1);
+is(compression_get_default_level(), 1, 'change default compression level');
+compression_set_default_level(5);
+is(compression_get_default_level(), 5, 'change default compression level');
+compression_set_default_level(undef);
+is(compression_get_default_level(), $old_level, 'reset default compression level');
+
+ok(! compression_is_valid_level(0), 'compression 0 is invalid');
+ok(compression_is_valid_level(1), 'compression 1 is valid');
+ok(compression_is_valid_level(5), 'compression 5 is valid');
+ok(compression_is_valid_level(9), 'compression 9 is valid');
+ok(compression_is_valid_level('fast'), 'compression fast is valid');
+ok(compression_is_valid_level('best'), 'compression best is valid');
+
+# Test write on uncompressed file
+test_write("$tmpdir/myfile", \&check_uncompressed);
+
+SKIP: {
+ skip 'gunzip not available', 1 if not $have_gunzip;
+
+ # Test write on compressed file
+ test_write("$tmpdir/myfile.gz", \&check_compressed);
+}
+
+# Test read on uncompressed file
+test_read("$tmpdir/myfile");
+
+# Test read on compressed file
+test_read("$tmpdir/myfile.gz");
diff --git a/scripts/t/Dpkg_Conf.t b/scripts/t/Dpkg_Conf.t
new file mode 100644
index 0000000..432c508
--- /dev/null
+++ b/scripts/t/Dpkg_Conf.t
@@ -0,0 +1,119 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 9;
+use Test::Dpkg qw(:paths);
+
+BEGIN {
+ use_ok('Dpkg::Conf');
+}
+
+my $datadir = test_get_data_path();
+
+my ($conf, $count, @opts);
+
+my @expected_long_opts = (
+'--option-double-quotes=value double quotes',
+'--option-single-quotes=value single quotes',
+'--option-space=value words space',
+qw(
+--option-dupe=value1
+--option-name=value-name
+--option-indent=value-indent
+--option-equal=value-equal=subvalue-equal
+--option-noequal=value-noequal
+--option-dupe=value2
+--option-simple
+--option-dash=value-dash
+--option-dupe=value3
+--l=v
+));
+my @expected_short_opts = qw(
+-o=vd
+-s
+);
+
+$conf = Dpkg::Conf->new();
+local $SIG{__WARN__} = sub { };
+$count = $conf->load("$datadir/config-mixed");
+delete $SIG{__WARN__};
+is($count, 13, 'Load a config file, only long options');
+
+@opts = $conf->get_options();
+is_deeply(\@opts, \@expected_long_opts, 'Parse long options');
+
+$conf = Dpkg::Conf->new(allow_short => 1);
+$count = $conf->load("$datadir/config-mixed");
+is($count, 15, 'Load a config file, mixed options');
+
+@opts = $conf->get_options();
+my @expected_mixed_opts = ( @expected_long_opts, @expected_short_opts );
+is_deeply(\@opts, \@expected_mixed_opts, 'Parse mixed options');
+
+my $expected_mixed_output = <<'MIXED';
+option-double-quotes = "value double quotes"
+option-single-quotes = "value single quotes"
+option-space = "value words space"
+option-dupe = "value1"
+option-name = "value-name"
+option-indent = "value-indent"
+option-equal = "value-equal=subvalue-equal"
+option-noequal = "value-noequal"
+option-dupe = "value2"
+option-simple
+option-dash = "value-dash"
+option-dupe = "value3"
+l = "v"
+-o = "vd"
+-s
+MIXED
+
+is($conf->output, $expected_mixed_output, 'Output mixed options');
+
+my $expected_filter;
+
+$expected_filter = <<'FILTER';
+l = "v"
+-o = "vd"
+-s
+FILTER
+
+$conf = Dpkg::Conf->new(allow_short => 1);
+$conf->load("$datadir/config-mixed");
+$conf->filter(remove => sub { $_[0] =~ m/^--option/ });
+is($conf->output, $expected_filter, 'Filter remove');
+
+$expected_filter = <<'FILTER';
+option-double-quotes = "value double quotes"
+option-single-quotes = "value single quotes"
+FILTER
+
+$conf = Dpkg::Conf->new(allow_short => 1);
+$conf->load("$datadir/config-mixed");
+$conf->filter(keep => sub { $_[0] =~ m/^--option-[a-z]+-quotes/ });
+is($conf->output, $expected_filter, 'Filter keep');
+
+$expected_filter = <<'FILTER';
+l = "v"
+FILTER
+
+$conf = Dpkg::Conf->new(allow_short => 1);
+$conf->load("$datadir/config-mixed");
+$conf->filter(remove => sub { $_[0] =~ m/^--option/ },
+ keep => sub { $_[0] =~ m/^--/ });
+is($conf->output, $expected_filter, 'Filter keep and remove');
diff --git a/scripts/t/Dpkg_Conf/config-mixed b/scripts/t/Dpkg_Conf/config-mixed
new file mode 100644
index 0000000..87c0405
--- /dev/null
+++ b/scripts/t/Dpkg_Conf/config-mixed
@@ -0,0 +1,26 @@
+# Comment followed by an empty line.
+
+option-double-quotes = "value double quotes"
+option-single-quotes = 'value single quotes'
+option-space = value words space
+
+option-dupe=value1
+option-name=value-name
+
+ # Indented comment.
+ option-indent = value-indent
+
+option-equal=value-equal=subvalue-equal
+option-noequal value-noequal
+option-dupe=value2
+option-simple
+
+# Fully spelled out options.
+--option-dash=value-dash
+--option-dupe=value3
+
+# Long option with one character name.
+l=v
+# Short option.
+-o=vd
+-s
diff --git a/scripts/t/Dpkg_Control.t b/scripts/t/Dpkg_Control.t
new file mode 100644
index 0000000..29311b8
--- /dev/null
+++ b/scripts/t/Dpkg_Control.t
@@ -0,0 +1,148 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Dpkg qw(:needs :paths);
+
+BEGIN {
+ plan tests => 24;
+
+ use_ok('Dpkg::Control');
+ use_ok('Dpkg::Control::Info');
+}
+
+my $datadir = test_get_data_path();
+
+sub parse_ctrl {
+ my ($type, $path) = @_;
+
+ my $ctrl = Dpkg::Control->new(type => $type);
+ eval {
+ $ctrl->load($path);
+ 1;
+ } or return;
+
+ return $ctrl;
+}
+
+sub parse_dsc {
+ my $path = shift;
+
+ return parse_ctrl(CTRL_DSC, $path);
+}
+
+my $c = Dpkg::Control::Info->new("$datadir/control-1");
+
+my $io_data;
+my $io;
+
+open $io, '>', \$io_data or die "canno open io string\n";;
+
+$c->output($io);
+my $expected = 'Source: mysource
+Empty-Field:
+Long-Field: line1
+ line 2 line 2 line 2
+ .
+ line 3 line 3 line 3
+ .
+ ..
+ line 4
+My-Field-One: myvalue1
+My-Field-Two: myvalue2
+Numeric-Field: 0
+
+Package: mypackage1
+Architecture: any
+Depends: libc6
+
+Package: mypackage2
+Architecture: all
+Depends: hello
+
+Package: mypackage3
+Architecture: all
+Depends: hello
+Description: short one
+ long one
+ very long one
+';
+is($io_data, $expected, "Dump of $datadir/control-1");
+
+my $src = $c->get_source();
+is($src, $c->[0], 'array representation of Dpkg::Control::Info 1/2');
+is($src->{'numeric-field'}, '0', 'Numeric 0 value parsed correctly');
+is($src->{'my-field-one'}, 'myvalue1', 'Access field through badly capitalized field name');
+is($src->{'long-field'},
+'line1
+line 2 line 2 line 2
+
+ line 3 line 3 line 3
+
+.
+line 4', 'Get multi-line field');
+is($src->{'Empty-field'}, '', 'Get empty field');
+
+my $pkg = $c->get_pkg_by_idx(1);
+is($pkg, $c->[1], 'array representation of Dpkg::Control::Info 2/2');
+is($pkg->{package}, 'mypackage1', 'Name of first package');
+
+$pkg = $c->get_pkg_by_name('mypackage3');
+is($pkg->{package}, 'mypackage3', 'Name of third package');
+is($pkg->{Depends}, 'hello', 'Name of third package');
+
+$pkg = $c->get_pkg_by_idx(2);
+open $io, '>', \$io_data or die "canno open io string\n";;
+$pkg->output($io);
+
+is($io_data,
+'Package: mypackage2
+Architecture: all
+Depends: hello
+', "Dump of second binary package of $datadir/control-1");
+
+# Check OpenPGP armored signatures in source control files
+
+my $dsc;
+
+$dsc = parse_dsc("$datadir/bogus-unsigned.dsc");
+is($dsc, undef, 'Unsigned .dsc w/ OpenPGP armor');
+
+$dsc = parse_dsc("$datadir/bogus-armor-no-sig.dsc");
+is($dsc, undef, 'Signed .dsc w/ OpenPGP armor missing signature');
+
+$dsc = parse_dsc("$datadir/bogus-armor-trail.dsc");
+is($dsc, undef, 'Signed .dsc w/ bogus OpenPGP armor trailer');
+
+$dsc = parse_dsc("$datadir/bogus-armor-inline.dsc");
+is($dsc, undef, 'Signed .dsc w/ bogus OpenPGP inline armor');
+
+$dsc = parse_dsc("$datadir/bogus-armor-formfeed.dsc");
+is($dsc, undef, 'Signed .dsc w/ bogus OpenPGP armor line');
+
+$dsc = parse_dsc("$datadir/bogus-armor-double.dsc");
+ok(defined $dsc, 'Signed .dsc w/ two OpenPGP armor signatures');
+is($dsc->{Source}, 'pass', 'Signed spaced .dsc package name');
+
+$dsc = parse_dsc("$datadir/bogus-armor-spaces.dsc");
+ok(defined $dsc, 'Signed .dsc w/ spaced OpenPGP armor');
+is($dsc->{Source}, 'pass', 'Signed spaced .dsc package name');
+
+$dsc = parse_dsc("$datadir/bogus-armor-nested.dsc");
+ok(defined $dsc, 'Signed .dsc w/ nested OpenPGP armor');
+is($dsc->{Source}, 'pass', 'Signed nested .dsc package name');
diff --git a/scripts/t/Dpkg_Control/bogus-armor-double.dsc b/scripts/t/Dpkg_Control/bogus-armor-double.dsc
new file mode 100644
index 0000000..1888a00
--- /dev/null
+++ b/scripts/t/Dpkg_Control/bogus-armor-double.dsc
@@ -0,0 +1,13 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Source: pass
+
+-----BEGIN PGP SIGNATURE-----
+
+Valid signature here.
+-----END PGP SIGNATURE-----
+-----BEGIN PGP SIGNATURE-----
+
+Fake signature here.
+-----END PGP SIGNATURE-----
diff --git a/scripts/t/Dpkg_Control/bogus-armor-formfeed.dsc b/scripts/t/Dpkg_Control/bogus-armor-formfeed.dsc
new file mode 100644
index 0000000..70aab18
--- /dev/null
+++ b/scripts/t/Dpkg_Control/bogus-armor-formfeed.dsc
@@ -0,0 +1,19 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+
+Source: fail
+
+-----BEGIN PGP SIGNATURE-----
+Version: vim v7.3.547 (GNU/Linux)
+
+Fake signature here.
+-----END PGP SIGNATURE-----
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Source: pass
+
+-----BEGIN PGP SIGNATURE
+Version: GnuPG v1.4.12 (GNU/Linux)
+
+Valid signature here.
+-----END PGP SIGNATURE-----
diff --git a/scripts/t/Dpkg_Control/bogus-armor-inline.dsc b/scripts/t/Dpkg_Control/bogus-armor-inline.dsc
new file mode 100644
index 0000000..44942c1
--- /dev/null
+++ b/scripts/t/Dpkg_Control/bogus-armor-inline.dsc
@@ -0,0 +1,9 @@
+Source: fail
+-----BEGIN PGP SIGNED MESSAGE-----
+
+Binary: pass
+
+-----BEGIN PGP SIGNATURE-----
+
+Valid signature here.
+-----END PGP SIGNATURE-----
diff --git a/scripts/t/Dpkg_Control/bogus-armor-nested.dsc b/scripts/t/Dpkg_Control/bogus-armor-nested.dsc
new file mode 100644
index 0000000..ca99c35
--- /dev/null
+++ b/scripts/t/Dpkg_Control/bogus-armor-nested.dsc
@@ -0,0 +1,15 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Source: pass
+
+-----BEGIN PGP SIGNATURE-----
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Source: fail
+
+-----BEGIN PGP SIGNATURE-----
+
+Valid signature here.
+-----END PGP SIGNATURE-----
diff --git a/scripts/t/Dpkg_Control/bogus-armor-no-sig.dsc b/scripts/t/Dpkg_Control/bogus-armor-no-sig.dsc
new file mode 100644
index 0000000..4502a18
--- /dev/null
+++ b/scripts/t/Dpkg_Control/bogus-armor-no-sig.dsc
@@ -0,0 +1,4 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Source: pass
diff --git a/scripts/t/Dpkg_Control/bogus-armor-spaces.dsc b/scripts/t/Dpkg_Control/bogus-armor-spaces.dsc
new file mode 100644
index 0000000..ab71ab5
--- /dev/null
+++ b/scripts/t/Dpkg_Control/bogus-armor-spaces.dsc
@@ -0,0 +1,18 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Source: pass
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.12 (GNU/Linux)
+
+Valid signature here.
+-----END PGP SIGNATURE-----
+
+Source: fail
+
+-----BEGIN PGP SIGNATURE
+Version: vim v7.3.547 (GNU/Linux)
+
+Fake signature here.
+-----END PGP SIGNATURE
diff --git a/scripts/t/Dpkg_Control/bogus-armor-trail.dsc b/scripts/t/Dpkg_Control/bogus-armor-trail.dsc
new file mode 100644
index 0000000..90b00f1
--- /dev/null
+++ b/scripts/t/Dpkg_Control/bogus-armor-trail.dsc
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNED MESSAGE
+
+Source: fail
+
+-----BEGIN PGP SIGNATURE
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA256
+
+Source: pass
+
+-----BEGIN PGP SIGNATURE-----
+
+Valid signature here.
+-----END PGP SIGNATURE-----
diff --git a/scripts/t/Dpkg_Control/bogus-unsigned.dsc b/scripts/t/Dpkg_Control/bogus-unsigned.dsc
new file mode 100644
index 0000000..7573eb3
--- /dev/null
+++ b/scripts/t/Dpkg_Control/bogus-unsigned.dsc
@@ -0,0 +1,5 @@
+-----BEGIN PGP MESSAGE-----
+
+Source: fail
+
+-----END PGP MESSAGE-----
diff --git a/scripts/t/Dpkg_Control/control-1 b/scripts/t/Dpkg_Control/control-1
new file mode 100644
index 0000000..0c70533
--- /dev/null
+++ b/scripts/t/Dpkg_Control/control-1
@@ -0,0 +1,30 @@
+Source: mysource
+# This is a comment
+numeric-field: 0
+my-field-one: myvalue1
+my-field-two: myvalue2
+long-field: line1
+ line 2 line 2 line 2
+ .
+ line 3 line 3 line 3
+ .
+ ..
+ line 4
+empty-field:
+
+# First package
+Package: mypackage1
+Architecture: any
+Depends: libc6
+
+# Second package
+Package: mypackage2
+Architecture: all
+Depends: hello
+
+Package: mypackage3
+Architecture: all
+Depends:hello
+Description: short one
+ long one
+ very long one
diff --git a/scripts/t/Dpkg_Control_Fields.t b/scripts/t/Dpkg_Control_Fields.t
new file mode 100644
index 0000000..800e649
--- /dev/null
+++ b/scripts/t/Dpkg_Control_Fields.t
@@ -0,0 +1,540 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Dpkg qw(:paths);
+
+BEGIN {
+ plan tests => 2603;
+
+ use_ok('Dpkg::Control::Types');
+ use_ok('Dpkg::Control::FieldsCore');
+ use_ok('Dpkg::Control');
+}
+
+#my $datadir = test_get_data_path();
+
+my @src_dep_fields = qw(
+ Build-Depends
+ Build-Depends-Arch
+ Build-Depends-Indep
+ Build-Conflicts
+ Build-Conflicts-Arch
+ Build-Conflicts-Indep
+);
+my @bin_dep_normal_fields = qw(
+ Pre-Depends
+ Depends
+ Recommends
+ Suggests
+ Enhances
+);
+my @bin_dep_union_fields = qw(
+ Conflicts
+ Breaks
+ Replaces
+ Provides
+ Built-Using
+ Static-Built-Using
+);
+my @bin_dep_fields = (
+ @bin_dep_normal_fields,
+ @bin_dep_union_fields,
+);
+my @src_checksums = qw(
+ Checksums-Md5
+ Checksums-Sha1
+ Checksums-Sha256
+);
+my @bin_checksums = qw(
+ MD5sum
+ SHA1
+ SHA256
+);
+my @src_files = (
+ @src_checksums,
+ qw(
+ Files
+ ),
+);
+my @bin_files = (
+ qw(
+ Filename
+ Size
+ ),
+ @bin_checksums,
+);
+my @vcs_fields = qw(
+ Vcs-Browser
+ Vcs-Arch
+ Vcs-Bzr
+ Vcs-Cvs
+ Vcs-Darcs
+ Vcs-Git
+ Vcs-Hg
+ Vcs-Mtn
+ Vcs-Svn
+);
+my @test_fields = qw(
+ Testsuite
+ Testsuite-Triggers
+);
+
+my %fields = (
+ CTRL_TMPL_SRC() => {
+ name => 'debian/control source stanza',
+ fields => [
+ qw(
+ Source
+ Section
+ Priority
+ Maintainer
+ Uploaders
+ Origin
+ Bugs
+ ),
+ @vcs_fields,
+ qw(
+ Homepage
+ Standards-Version
+ Rules-Requires-Root
+ ),
+ @src_dep_fields,
+ @test_fields,
+ qw(
+ Description
+ ),
+ ],
+ },
+ CTRL_TMPL_PKG() => {
+ name => 'debian/control binary stanza',
+ fields => [
+ qw(
+ Package
+ Package-Type
+ Section
+ Priority
+ Architecture
+ Subarchitecture
+ Multi-Arch
+ Essential
+ Protected
+ Build-Essential
+ Build-Profiles
+ Built-For-Profiles
+ Kernel-Version
+ ),
+ @bin_dep_fields,
+ qw(
+ Homepage
+ Installer-Menu-Item
+ Task
+ Tag
+ Description
+ ),
+ ],
+ },
+ CTRL_DSC() => {
+ name => '.dsc',
+ fields => [
+ qw(
+ Format
+ Source
+ Binary
+ Architecture
+ Version
+ Origin
+ Maintainer
+ Uploaders
+ Homepage
+ Description
+ Standards-Version
+ ),
+ @vcs_fields,
+ @test_fields,
+ @src_dep_fields,
+ qw(
+ Package-List
+ ),
+ @src_files,
+ ],
+ },
+ CTRL_DEB() => {
+ name => 'DEBIAN/control',
+ fields => [
+ qw(
+ Package
+ Package-Type
+ Source
+ Version
+ Kernel-Version
+ Built-For-Profiles
+ Auto-Built-Package
+ Architecture
+ Subarchitecture
+ Installer-Menu-Item
+ Build-Essential
+ Essential
+ Protected
+ Origin
+ Bugs
+ Maintainer
+ Installed-Size
+ ),
+ @bin_dep_fields,
+ qw(
+ Section
+ Priority
+ Multi-Arch
+ Homepage
+ Description
+ Tag
+ Task
+ ),
+ ],
+ },
+ CTRL_REPO_SRC() => {
+ name => 'Sources',
+ fields => [
+ qw(
+ Format
+ Package
+ Binary
+ Architecture
+ Version
+ Priority
+ Section
+ Origin
+ Maintainer
+ Uploaders
+ Homepage
+ Description
+ Standards-Version
+ ),
+ @vcs_fields,
+ @test_fields,
+ @src_dep_fields,
+ qw(
+ Package-List
+ Directory
+ ),
+ @src_files,
+ ],
+ },
+ CTRL_REPO_PKG() => {
+ name => 'Packages',
+ fields => [
+ qw(
+ Package
+ Package-Type
+ Source
+ Version
+ Kernel-Version
+ Built-For-Profiles
+ Auto-Built-Package
+ Architecture
+ Subarchitecture
+ Installer-Menu-Item
+ Build-Essential
+ Essential
+ Protected
+ Origin
+ Bugs
+ Maintainer
+ Installed-Size
+ ),
+ @bin_dep_fields,
+ @bin_files,
+ qw(
+ Section
+ Priority
+ Multi-Arch
+ Homepage
+ Description
+ Tag
+ Task
+ ),
+ ],
+ },
+ CTRL_REPO_RELEASE() => {
+ name => 'Release',
+ fields => [
+ qw(
+ Origin
+ Label
+ Suite
+ Version
+ Codename
+ Changelogs
+ Date
+ Valid-Until
+ NotAutomatic
+ ButAutomaticUpgrades
+ Acquire-By-Hash
+ No-Support-for-Architecture-all
+ Architectures
+ Components
+ Description
+ ),
+ @bin_checksums,
+ ],
+ },
+ CTRL_CHANGELOG() => {
+ name => 'debian/changelog',
+ fields => [
+ qw(
+ Source
+ Binary-Only
+ Version
+ Distribution
+ Urgency
+ Maintainer
+ Timestamp
+ Date
+ Closes
+ Changes
+ ),
+ ],
+ },
+ CTRL_COPYRIGHT_HEADER() => {
+ name => 'debian/copyright Format stanza',
+ fields => [
+ qw(
+ Format
+ Upstream-Name
+ Upstream-Contact
+ Source
+ Disclaimer
+ Comment
+ License
+ Copyright
+ ),
+ ],
+ },
+ CTRL_COPYRIGHT_FILES() => {
+ name => 'debian/copyright Files stanza',
+ fields => [
+ qw(
+ Files
+ Copyright
+ License
+ Comment
+ ),
+ ],
+ },
+ CTRL_COPYRIGHT_LICENSE() => {
+ name => 'debian/copyright License stanza',
+ fields => [
+ qw(
+ License
+ Comment
+ ),
+ ],
+ },
+ CTRL_TESTS() => {
+ name => 'debian/tests/control',
+ fields => [
+ qw(
+ Test-Command
+ Tests
+ Tests-Directory
+ Architecture
+ Restrictions
+ Features
+ Classes
+ Depends
+ ),
+ ],
+ },
+ CTRL_FILE_BUILDINFO() => {
+ name => '.buildinfo',
+ fields => [
+ qw(
+ Format
+ Source
+ Binary
+ Architecture
+ Version
+ Binary-Only-Changes
+ ),
+ @src_checksums,
+ qw(
+ Build-Origin
+ Build-Architecture
+ Build-Kernel-Version
+ Build-Date
+ Build-Path
+ Build-Tainted-By
+ Installed-Build-Depends
+ Environment
+ ),
+ ],
+ },
+ CTRL_FILE_CHANGES() => {
+ name => '.changes',
+ fields => [
+ qw(
+ Format
+ Date
+ Source
+ Binary
+ Binary-Only
+ Built-For-Profiles
+ Architecture
+ Version
+ Distribution
+ Urgency
+ Maintainer
+ Changed-By
+ Description
+ Closes
+ Changes
+ ),
+ @src_files,
+ ],
+ },
+ CTRL_FILE_VENDOR() => {
+ name => 'dpkg origin',
+ fields => [
+ qw(
+ Vendor
+ Vendor-Url
+ Bugs
+ Parent
+ ),
+ ],
+ },
+ CTRL_FILE_STATUS() => {
+ name => 'dpkg status',
+ fields => [
+ qw(
+ Package
+ Essential
+ Protected
+ Status
+ Priority
+ Section
+ Installed-Size
+ Origin
+ Maintainer
+ Bugs
+ Architecture
+ Multi-Arch
+ Source
+ Version
+ Config-Version
+ Replaces
+ Provides
+ Depends
+ Pre-Depends
+ Recommends
+ Suggests
+ Breaks
+ Conflicts
+ Enhances
+ Conffiles
+ Description
+ Triggers-Pending
+ Triggers-Awaited
+ Auto-Built-Package
+ Build-Essential
+ Built-For-Profiles
+ Built-Using
+ Static-Built-Using
+ Homepage
+ Installer-Menu-Item
+ Kernel-Version
+ Package-Type
+ Subarchitecture
+ Tag
+ Task
+ ),
+ ],
+ },
+);
+
+is_deeply([ field_list_src_dep() ],
+ [ @src_dep_fields ],
+ 'List of build dependencies');
+is_deeply([ field_list_pkg_dep() ],
+ [ @bin_dep_fields ],
+ 'List of build dependencies');
+
+is(field_capitalize('invented-field'), 'Invented-Field',
+ 'Field Invented-Field capitalization');
+ok(!field_is_official('invented-field'),
+ 'Field Invented-Field is not official');
+
+my %known_fields;
+foreach my $type (sort keys %fields) {
+ if (not $fields{$type}->{unordered}) {
+ is_deeply([ field_ordered_list($type) ], $fields{$type}->{fields},
+ "List of $fields{$type}->{name} fields");
+ }
+
+ foreach my $field (@{$fields{$type}->{fields}}) {
+ $known_fields{$field} = 1;
+ }
+}
+
+foreach my $field (sort keys %known_fields) {
+ is(field_capitalize($field), $field, "Field $field capitalization");
+ is(field_capitalize(lc $field), $field, "Field lc($field) capitalization");
+ is(field_capitalize(uc $field), $field, "Field uc($field) capitalization");
+
+ ok(field_is_official($field), "Field $field is official");
+ ok(field_is_official(lc $field), "Field lc($field) is official");
+ ok(field_is_official(uc $field), "Field uc($field) is official");
+}
+
+foreach my $type (sort keys %fields) {
+ my %allowed_fields = map { $_ => 1 } @{$fields{$type}->{fields}};
+
+ foreach my $field (sort keys %known_fields) {
+ if ($allowed_fields{$field}) {
+ ok(field_is_allowed_in($field, $type),
+ "Field $field allowed for type $fields{$type}->{name}");
+ } else {
+ ok(!field_is_allowed_in($field, $type),
+ "Field $field not allowed for type $fields{$type}->{name}");
+ }
+ }
+}
+
+# Check deb822 field parsers
+
+my $ctrl = Dpkg::Control->new(type => CTRL_DEB);
+
+my ($source, $version);
+
+$ctrl->{Package} = 'test-binary';
+$ctrl->{Version} = '2.0-1';
+$ctrl->{Source} = 'test-source (1.0)';
+($source, $version) = field_parse_binary_source($ctrl);
+is($source, 'test-source', 'Source package from binary w/ Source field');
+is($version, '1.0', 'Source version from binary w/ Source field');
+
+$ctrl->{Source} = 'test-source';
+($source, $version) = field_parse_binary_source($ctrl);
+is($source, 'test-source', 'Source package from binary w/ Source field w/o version');
+is($version, '2.0-1', 'Source version from binary w/ Source field w/o version');
+
+delete $ctrl->{Source};
+($source, $version) = field_parse_binary_source($ctrl);
+is($source, 'test-binary', 'Source package from binary w/o Source field');
+is($version, '2.0-1', 'Source version from binary w/o Source field');
diff --git a/scripts/t/Dpkg_Control_Tests.t b/scripts/t/Dpkg_Control_Tests.t
new file mode 100644
index 0000000..27042dc
--- /dev/null
+++ b/scripts/t/Dpkg_Control_Tests.t
@@ -0,0 +1,71 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 5;
+use Test::Dpkg qw(:paths);
+
+BEGIN {
+ use_ok('Dpkg::Control::Tests');
+}
+
+my $datadir = test_get_data_path();
+
+sub parse_tests {
+ my $path = shift;
+
+ my $tests = Dpkg::Control::Tests->new();
+ eval {
+ $tests->load($path);
+ 1;
+ } or return;
+
+ return $tests;
+}
+
+my $tests;
+
+$tests = parse_tests("$datadir/tests-missing-fields");
+is($tests, undef, 'autopkgtest missing required fields');
+
+$tests = parse_tests("$datadir/tests-plain-text");
+is($tests, undef, 'autopkgtest is not in deb822 format');
+
+my $expected = <<'TESTS';
+Tests: aaa, bbb, ccc
+
+Tests: danger, warning
+Restrictions: rw-build-tree, needs-root, breaks-testbed
+
+Tests: depends
+Depends: @, @builddeps@, extra-package
+
+Tests: dir
+Tests-Directory: .
+
+Tests: feature
+
+Tests: class
+Classes: self-test
+
+Test-Command: command arg1 arg2
+
+TESTS
+
+$tests = parse_tests("$datadir/tests-valid");
+ok(defined $tests, 'Valid autopkgtest control file');
+is($tests->output(), $expected, 'autopkgtest control file dumped');
diff --git a/scripts/t/Dpkg_Control_Tests/tests-missing-fields b/scripts/t/Dpkg_Control_Tests/tests-missing-fields
new file mode 100644
index 0000000..7f7794d
--- /dev/null
+++ b/scripts/t/Dpkg_Control_Tests/tests-missing-fields
@@ -0,0 +1,7 @@
+Tests: aaa
+
+Test-Command: command
+
+Other:
+
+Tests: bbb
diff --git a/scripts/t/Dpkg_Control_Tests/tests-plain-text b/scripts/t/Dpkg_Control_Tests/tests-plain-text
new file mode 100644
index 0000000..a29d388
--- /dev/null
+++ b/scripts/t/Dpkg_Control_Tests/tests-plain-text
@@ -0,0 +1,6 @@
+This is a plain text file
+that does not contain
+
+ any of the expected fields nor values
+
+and should fail to load.
diff --git a/scripts/t/Dpkg_Control_Tests/tests-valid b/scripts/t/Dpkg_Control_Tests/tests-valid
new file mode 100644
index 0000000..c0ad60b
--- /dev/null
+++ b/scripts/t/Dpkg_Control_Tests/tests-valid
@@ -0,0 +1,18 @@
+Tests: aaa, bbb, ccc
+
+Tests: danger, warning
+Restrictions: rw-build-tree, needs-root, breaks-testbed
+
+Tests: depends
+Depends: @, @builddeps@, extra-package
+
+Tests: dir
+Tests-Directory: .
+
+Tests: feature
+Features:
+
+Tests: class
+Classes: self-test
+
+Test-Command: command arg1 arg2
diff --git a/scripts/t/Dpkg_Deps.t b/scripts/t/Dpkg_Deps.t
new file mode 100644
index 0000000..b6a10d6
--- /dev/null
+++ b/scripts/t/Dpkg_Deps.t
@@ -0,0 +1,368 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 84;
+
+use Dpkg::Arch qw(get_host_arch);
+use Dpkg::Version;
+
+$ENV{DEB_BUILD_ARCH} = 'amd64';
+$ENV{DEB_HOST_ARCH} = 'amd64';
+
+use_ok('Dpkg::Deps');
+
+is(deps_concat(), '', 'Concatenate an empty list');
+is(deps_concat(undef), '', 'Concatenate list with undef');
+is(deps_concat(''), '', 'Concatenate an empty string');
+is(deps_concat('', undef), '', 'Concatenate empty string with undef');
+is(deps_concat('dep-a', undef, 'dep-b'), 'dep-a, dep-b',
+ 'Concatenate two strings with intermixed undef');
+
+sub test_dep_parse_option {
+ my %options = @_;
+
+ eval {
+ my $dep_croak = deps_parse('pkg', %options);
+ };
+ my $options = join ' ', map { "$_=$options{$_}" } keys %options;
+ ok(defined $@, "Parse with bogus arch options $options");
+}
+
+test_dep_parse_option(host_arch => 'all');
+test_dep_parse_option(host_arch => 'any');
+test_dep_parse_option(host_arch => 'linux-any');
+test_dep_parse_option(host_arch => 'unknown-arch');
+test_dep_parse_option(build_arch => 'all');
+test_dep_parse_option(build_arch => 'any');
+test_dep_parse_option(build_arch => 'linux-any');
+test_dep_parse_option(build_arch => 'unknown-arch');
+
+my $field_multiline = ' , , libgtk2.0-common (= 2.10.13-1) , libatk1.0-0 (>=
+1.13.2), libc6 (>= 2.5-5), libcairo2 (>= 1.4.0), libcupsys2 (>= 1.2.7) <profile.a>
+<profile.b
+profile.c>
+<profile.d>,
+libfontconfig1 (>= 2.4.0), libglib2.0-0 ( >= 2.12.9), libgnutls13 (>=
+1.6.3-0), libjpeg62, python (<< 2.5) , , ';
+my $field_multiline_sorted = 'libatk1.0-0 (>= 1.13.2), libc6 (>= 2.5-5), libcairo2 (>= 1.4.0), libcupsys2 (>= 1.2.7) <profile.a> <profile.b profile.c> <profile.d>, libfontconfig1 (>= 2.4.0), libglib2.0-0 (>= 2.12.9), libgnutls13 (>= 1.6.3-0), libgtk2.0-common (= 2.10.13-1), libjpeg62, python (<< 2.5)';
+
+my $dep_multiline = deps_parse($field_multiline);
+$dep_multiline->sort();
+is($dep_multiline->output(), $field_multiline_sorted, 'Parse, sort and output');
+
+my $dep_sorted = deps_parse('pkgz, pkgz | pkgb, pkgz | pkga, pkga (>= 1.0), pkgz (<= 2.0)');
+$dep_sorted->sort();
+is($dep_sorted->output(), 'pkga (>= 1.0), pkgz, pkgz | pkga, pkgz | pkgb, pkgz (<= 2.0)', 'Check sort() algorithm');
+
+my $dep_subset = deps_parse('libatk1.0-0 (>> 1.10), libc6, libcairo2');
+is($dep_multiline->implies($dep_subset), 1, 'Dep implies subset of itself');
+is($dep_subset->implies($dep_multiline), undef, "Subset doesn't imply superset");
+my $dep_opposite = deps_parse('python (>= 2.5)');
+is($dep_opposite->implies($dep_multiline), 0, 'Opposite condition implies NOT the depends');
+
+my $dep_or1 = deps_parse('a|b (>=1.0)|c (>= 2.0)');
+my $dep_or2 = deps_parse('x|y|a|b|c (<= 0.5)|c (>=1.5)|d|e');
+is($dep_or1->implies($dep_or2), 1, 'Implication between OR 1/2');
+is($dep_or2->implies($dep_or1), undef, 'Implication between OR 2/2');
+
+my $dep_ma_host = deps_parse('libcairo2');
+my $dep_ma_any = deps_parse('libcairo2:any');
+my $dep_ma_build = deps_parse('libcairo2:native', build_dep => 1);
+my $dep_ma_explicit = deps_parse('libcairo2:amd64');
+is($dep_ma_host->implies($dep_ma_any), undef, 'foo !-> foo:any');
+is($dep_ma_build->implies($dep_ma_any), undef, 'foo:native !-> foo:any');
+is($dep_ma_explicit->implies($dep_ma_any), undef, 'foo:<arch> !-> foo:any');
+is($dep_ma_any->implies($dep_ma_host), undef, 'foo:any !-> foo');
+is($dep_ma_any->implies($dep_ma_build), undef, 'foo:any !-> foo:native');
+is($dep_ma_any->implies($dep_ma_explicit), undef, 'foo:any !-> foo:<arch>');
+is($dep_ma_host->implies($dep_ma_host), 1, 'foo -> foo');
+is($dep_ma_any->implies($dep_ma_any), 1, 'foo:any -> foo:any');
+is($dep_ma_build->implies($dep_ma_build), 1, 'foo:native -> foo:native');
+is($dep_ma_explicit->implies($dep_ma_explicit), 1, 'foo:<arch>-> foo:<arch>');
+
+my $field_tests = 'self, @, @builddeps@';
+$SIG{__WARN__} = sub {};
+my $dep_tests_fail = deps_parse($field_tests);
+is($dep_tests_fail, undef, 'normal deps with @ in pkgname');
+$dep_tests_fail = deps_parse($field_tests, build_dep => 1);
+is($dep_tests_fail, undef, 'build deps with @ in pkgname');
+delete $SIG{__WARN__};
+my $dep_tests_pass = deps_parse($field_tests, tests_dep => 1);
+is($dep_tests_pass->output(), $field_tests, 'tests deps with @ in pkgname');
+$field_tests = 'self, pkgname:native, @, @builddeps@';
+$dep_tests_pass = deps_parse($field_tests, tests_dep => 1);
+is($dep_tests_pass->output(), $field_tests, 'tests deps with :native and @ in pkgname');
+
+my $field_arch = 'libc6 (>= 2.5) [!alpha !hurd-i386], libc6.1 [alpha], libc0.1 [hurd-i386]';
+my $dep_i386 = deps_parse($field_arch, reduce_arch => 1, host_arch => 'i386');
+my $dep_alpha = deps_parse($field_arch, reduce_arch => 1, host_arch => 'alpha');
+my $dep_hurd = deps_parse($field_arch, reduce_arch => 1, host_arch => 'hurd-i386');
+is($dep_i386->output(), 'libc6 (>= 2.5)', 'Arch reduce 1/3');
+is($dep_alpha->output(), 'libc6.1', 'Arch reduce 2/3');
+is($dep_hurd->output(), 'libc0.1', 'Arch reduce 3/3');
+
+my $field_profile = 'dep1 <!stage1 !nocheck>, ' .
+'dep2 <stage1 !nocheck>, ' .
+'dep3 <nocheck !stage1>, ' .
+'dep4 <stage1 nocheck>, ' .
+'dep5 <stage1>, dep6 <!stage1>, ' .
+'dep7 <stage1> | dep8 <nocheck>, ' .
+'dep9 <!stage1> <!nocheck>, ' .
+'dep10 <stage1> <!nocheck>, ' .
+'dep11 <stage1> <nocheck>, '.
+'dep12 <!nocheck> <!stage1>, ' .
+'dep13 <nocheck> <!stage1>, ' .
+'dep14 <nocheck> <stage1>';
+my $dep_noprof = deps_parse($field_profile, reduce_profiles => 1, build_profiles => []);
+my $dep_stage1 = deps_parse($field_profile, reduce_profiles => 1, build_profiles => ['stage1']);
+my $dep_nocheck = deps_parse($field_profile, reduce_profiles => 1, build_profiles => ['nocheck']);
+my $dep_stage1nocheck = deps_parse($field_profile, reduce_profiles => 1, build_profiles => ['stage1', 'nocheck']);
+is($dep_noprof->output(), 'dep1, dep6, dep9, dep10, dep12, dep13', 'Profile reduce 1/4');
+is($dep_stage1->output(), 'dep2, dep5, dep7, dep9, dep10, dep11, dep12, dep14', 'Profile reduce 2/4');
+is($dep_nocheck->output(), 'dep3, dep6, dep8, dep9, dep11, dep12, dep13, dep14', 'Profile reduce 3/4');
+is($dep_stage1nocheck->output(), 'dep4, dep5, dep7 | dep8, dep10, dep11, dep13, dep14', 'Profile reduce 4/4');
+
+$dep_noprof = deps_parse($field_profile);
+$dep_noprof->reduce_profiles([]);
+$dep_stage1 = deps_parse($field_profile);
+$dep_stage1->reduce_profiles(['stage1']);
+$dep_nocheck = deps_parse($field_profile);
+$dep_nocheck->reduce_profiles(['nocheck']);
+$dep_stage1nocheck = deps_parse($field_profile);
+$dep_stage1nocheck->reduce_profiles(['stage1', 'nocheck']);
+is($dep_noprof->output(), 'dep1, dep6, dep9, dep10, dep12, dep13', 'Profile post-reduce 1/4');
+is($dep_stage1->output(), 'dep2, dep5, dep7, dep9, dep10, dep11, dep12, dep14', 'Profile post-reduce 2/4');
+is($dep_nocheck->output(), 'dep3, dep6, dep8, dep9, dep11, dep12, dep13, dep14', 'Profile post-reduce 3/4');
+is($dep_stage1nocheck->output(), 'dep4, dep5, dep7 | dep8, dep10, dep11, dep13, dep14', 'Profile post-reduce 4/4');
+
+my $field_restrict = 'dep1 <!bootstrap !restrict>, ' .
+'dep2 <bootstrap restrict>, ' .
+'dep3 <!restrict>, ' .
+'dep4 <restrict>, ' .
+'dep5 <!bootstrap> <!restrict>, ' .
+'dep6 <bootstrap> <restrict>';
+my $dep_restrict = deps_parse($field_restrict, reduce_restrictions => 1, build_profiles => []);
+is($dep_restrict->output(), 'dep1, dep3, dep5', 'Unknown restrictions reduce');
+
+$dep_restrict = deps_parse($field_restrict);
+$dep_restrict->reduce_profiles([]);
+is($dep_restrict->output(), 'dep1, dep3, dep5', 'Unknown restrictions post-reduce');
+
+my $facts = Dpkg::Deps::KnownFacts->new();
+$facts->add_installed_package('mypackage', '1.3.4-1', get_host_arch(), 'no');
+$facts->add_installed_package('mypackage2', '1.3.4-1', 'somearch', 'no');
+$facts->add_installed_package('pkg-ma-foreign', '1.3.4-1', 'somearch', 'foreign');
+$facts->add_installed_package('pkg-ma-foreign2', '1.3.4-1', get_host_arch(), 'foreign');
+$facts->add_installed_package('pkg-ma-allowed', '1.3.4-1', 'somearch', 'allowed');
+$facts->add_installed_package('pkg-ma-allowed2', '1.3.4-1', 'somearch', 'allowed');
+$facts->add_installed_package('pkg-ma-allowed3', '1.3.4-1', get_host_arch(), 'allowed');
+$facts->add_installed_package('pkg-indep-normal', '1.3.4-1', 'all', 'no');
+$facts->add_installed_package('pkg-indep-foreign', '1.3.4-1', 'all', 'foreign');
+$facts->add_provided_package('myvirtual', undef, undef, 'mypackage');
+$facts->add_provided_package('myvirtual2', REL_EQ, '1.0-1', 'mypackage');
+$facts->add_provided_package('myvirtual3', REL_GE, '2.0-1', 'mypackage');
+
+my $field_duplicate = 'libc6 (>= 2.3), libc6 (>= 2.6-1), mypackage (>=
+1.3), myvirtual | something, python (>= 2.5), mypackage2, pkg-ma-foreign,
+pkg-ma-foreign2, pkg-ma-allowed:any, pkg-ma-allowed2, pkg-ma-allowed3';
+my $dep_dup = deps_parse($field_duplicate);
+$dep_dup->simplify_deps($facts, $dep_opposite);
+is($dep_dup->output(), 'libc6 (>= 2.6-1), mypackage2, pkg-ma-allowed2',
+ 'Simplify deps');
+
+my $dep_ma_all_normal_implicit_native = deps_parse('pkg-indep-normal', build_dep => 1);
+my $dep_ma_all_normal_explicit_native = deps_parse('pkg-indep-normal:native', build_dep => 1);
+my $dep_ma_all_foreign_implicit_native = deps_parse('pkg-indep-foreign', build_dep => 1);
+my $dep_ma_all_foreign_explicit_native = deps_parse('pkg-indep-foreign:native', build_dep => 1);
+$dep_ma_all_normal_implicit_native->simplify_deps($facts);
+is($dep_ma_all_normal_implicit_native->output(), '',
+ 'Simplify arch:all m-a:no w/ implicit :native (satisfied)');
+$dep_ma_all_normal_explicit_native->simplify_deps($facts);
+is($dep_ma_all_normal_explicit_native->output(), '',
+ 'Simplify arch:all m-a:no w/ explicit :native (satisfied)');
+$dep_ma_all_foreign_implicit_native->simplify_deps($facts);
+is($dep_ma_all_foreign_implicit_native->output(), '',
+ 'Simplify arch:all m-a:foreign w/ implicit :native (satisfied)');
+$dep_ma_all_foreign_explicit_native->simplify_deps($facts);
+is($dep_ma_all_foreign_explicit_native->output(), 'pkg-indep-foreign:native',
+ 'Simplify arch:all m-a:foreign w/ explicit :native (unsatisfied)');
+
+TODO: {
+
+local $TODO = 'not yet implemented';
+
+my $dep_or_eq = deps_parse('pkg-a | pkg-b | pkg-a');
+$dep_or_eq->simplify_deps($facts);
+is($dep_or_eq->output(), 'pkg-a | pkg-b',
+ 'Simplify duped ORed, equal names');
+
+$dep_or_eq = deps_parse('pkg-a (= 10) | pkg-b | pkg-a (= 10)');
+$dep_or_eq->simplify_deps($facts);
+is($dep_or_eq->output(), 'pkg-a (= 10) | pkg-b',
+ 'Simplify duped ORed, matching version');
+
+my $dep_or_subset = deps_parse('pkg-a (>= 10) | pkg-b | pkg-a (= 10)');
+$dep_or_eq->simplify_deps($facts);
+is($dep_or_eq->output(), 'pkg-a (= 10) | pkg-b',
+ 'Simplify duped ORed, subset version');
+
+$dep_or_subset = deps_parse('pkg-a (>= 10) <profile> | pkg-b | pkg-a (= 10) <profile>');
+$dep_or_eq->simplify_deps($facts);
+is($dep_or_eq->output(), 'pkg-a (= 10) <profile> | pkg-b',
+ 'Simplify duped ORed, subset version');
+
+} # TODO
+
+my $field_virtual = 'myvirtual | other';
+my $dep_virtual = deps_parse($field_virtual);
+$dep_virtual->simplify_deps($facts);
+is($dep_virtual->output(), '',
+ 'Simplify unversioned depends with unversioned virtual (satisfied)');
+
+$field_virtual = 'myvirtual (>= 1.0) | other';
+$dep_virtual = deps_parse($field_virtual);
+$dep_virtual->simplify_deps($facts);
+is($dep_virtual->output(), 'myvirtual (>= 1.0) | other',
+ 'Simplify versioned depends on unversioned virtual (unsatisfied)');
+
+$field_virtual = 'myvirtual2 (>= 0.0) | other';
+$dep_virtual = deps_parse($field_virtual);
+$dep_virtual->simplify_deps($facts);
+is($dep_virtual->output(), '',
+ 'Simplify versioned depends on versioned virtual (satisfied)');
+
+$field_virtual = 'myvirtual2 (>= 2.0) | other';
+$dep_virtual = deps_parse($field_virtual);
+$dep_virtual->simplify_deps($facts);
+is($dep_virtual->output(), 'myvirtual2 (>= 2.0) | other',
+ 'Simplify versioned depends on versioned virtual (unsatisfied)');
+
+$field_virtual = 'myvirtual3 (= 2.0-1)';
+$dep_virtual = deps_parse($field_virtual);
+$dep_virtual->simplify_deps($facts);
+is($dep_virtual->output(), 'myvirtual3 (= 2.0-1)',
+ 'Simplify versioned depends on GT versioned virtual (unsatisfied/ignored)');
+
+my $field_dup_union = 'libc6 (>> 2.3), libc6 (>= 2.6-1), fake (<< 2.0),
+fake(>> 3.0), fake (= 2.5), python (<< 2.5), python (= 2.4)';
+my $dep_dup_union = deps_parse($field_dup_union, union => 1);
+$dep_dup_union->simplify_deps($facts);
+is($dep_dup_union->output(), 'libc6 (>> 2.3), fake (<< 2.0), fake (>> 3.0), fake (= 2.5), python (<< 2.5)', 'Simplify union deps');
+
+$dep_dup_union = deps_parse('sipsak (<= 0.9.6-2.1), sipsak (<= 0.9.6-2.2)', union => 1);
+$dep_dup_union->simplify_deps($facts);
+is($dep_dup_union->output(), 'sipsak (<= 0.9.6-2.2)', 'Simplify union deps 2');
+
+my $dep_red = deps_parse('abc | xyz, two, abc');
+$dep_red->simplify_deps($facts, $dep_opposite);
+is($dep_red->output(), 'abc, two', 'Simplification respect order');
+is("$dep_red", $dep_red->output(), 'Stringification == output()');
+
+my $dep_profiles = deps_parse('dupe <stage1 cross>, dupe <stage1 cross>');
+$dep_profiles->simplify_deps($facts);
+is($dep_profiles->output(), 'dupe <stage1 cross>',
+ 'Simplification respects duplicated profiles');
+
+TODO: {
+
+local $TODO = 'not yet implemented';
+
+$dep_profiles = deps_parse('tool <!cross>, tool <stage1 cross>');
+$dep_profiles->simplify_deps($facts);
+is($dep_profiles->output(), 'tool <!cross> <stage1 cross>',
+ 'Simplify restriction formulas');
+
+} # TODO
+
+$dep_profiles = deps_parse('libfoo-dev:native <!stage1>, libfoo-dev <!stage1 cross>', build_dep => 1);
+$dep_profiles->simplify_deps($facts);
+is($dep_profiles->output(),
+ 'libfoo-dev:native <!stage1>, libfoo-dev <!stage1 cross>',
+ 'Simplification respects archqualifiers and profiles');
+
+my $dep_archqual = deps_parse('pkg, pkg:any');
+$dep_archqual->simplify_deps($facts);
+is($dep_archqual->output(), 'pkg, pkg:any',
+ 'Simplify respect arch-qualified ANDed dependencies 1/2');
+
+$dep_archqual = deps_parse('pkg:amd64, pkg:any, pkg:i386');
+$dep_archqual->simplify_deps($facts);
+is($dep_archqual->output(), 'pkg:amd64, pkg:any, pkg:i386',
+ 'Simplify respects arch-qualified ANDed dependencies 2/2');
+
+$dep_archqual = deps_parse('pkg | pkg:any');
+$dep_archqual->simplify_deps($facts);
+is($dep_archqual->output(), 'pkg | pkg:any',
+ 'Simplify respect arch-qualified ORed dependencies 1/2');
+
+$dep_archqual = deps_parse('pkg:amd64 | pkg:i386 | pkg:any');
+$dep_archqual->simplify_deps($facts);
+is($dep_archqual->output(), 'pkg:amd64 | pkg:i386 | pkg:any',
+ 'Simplify respect arch-qualified ORed dependencies 2/2');
+
+my $dep_version = deps_parse('pkg, pkg (= 1.0)');
+$dep_version->simplify_deps($facts);
+is($dep_version->output(), 'pkg (= 1.0)', 'Simplification merges versions');
+
+my $dep_empty1 = deps_parse('');
+is($dep_empty1->output(), '', 'Empty dependency');
+
+my $dep_empty2 = deps_parse(' , , ', union => 1);
+is($dep_empty2->output(), '', "' , , ' is also an empty dependency");
+
+# Check sloppy but acceptable dependencies
+
+my $dep_sloppy_version = deps_parse('package (= 1.0 )');
+is($dep_sloppy_version->output(), 'package (= 1.0)', 'sloppy version restriction');
+
+my $dep_sloppy_arch = deps_parse('package [ alpha ]');
+is($dep_sloppy_arch->output(), 'package [alpha]', 'sloppy arch restriction');
+
+my $dep_sloppy_profile = deps_parse('package < !profile > < other >');
+is($dep_sloppy_profile->output(), 'package <!profile> <other>',
+ 'sloppy profile restriction');
+
+$SIG{__WARN__} = sub {};
+
+my $dep_bad_version = deps_parse('package (= 1.0) (>= 2.0)');
+is($dep_bad_version, undef, 'Bogus repeated version restriction');
+
+my $dep_bad_arch = deps_parse('package [alpha] [amd64]');
+is($dep_bad_arch, undef, 'Bogus repeated arch restriction');
+
+my $dep_bad_multiline = deps_parse("a, foo\nbar, c");
+is($dep_bad_multiline, undef, 'invalid dependency split over multiple line');
+
+delete $SIG{__WARN__};
+
+my $dep_iter = deps_parse('a, b:armel, c | d:armhf, d:mips (>> 1.2)');
+my %dep_arches;
+my %dep_pkgs;
+deps_iterate($dep_iter, sub {
+ my $dep = shift;
+
+ $dep_pkgs{$dep->{package}} = 1;
+ if ($dep->{archqual}) {
+ $dep_arches{$dep->{archqual}} = 1;
+ }
+ return 1;
+});
+my @dep_arches = sort keys %dep_arches;
+my @dep_pkgs = sort keys %dep_pkgs;
+is("@dep_arches", 'armel armhf mips', 'Dependency iterator, get arches');
+is("@dep_pkgs", 'a b c d', 'Dependency iterator, get packages');
diff --git a/scripts/t/Dpkg_Dist_Files.t b/scripts/t/Dpkg_Dist_Files.t
new file mode 100644
index 0000000..7e820b5
--- /dev/null
+++ b/scripts/t/Dpkg_Dist_Files.t
@@ -0,0 +1,214 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 26;
+use Test::Dpkg qw(:paths);
+
+use_ok('Dpkg::Dist::Files');
+
+my $datadir = test_get_data_path();
+
+my $expected;
+my %expected = (
+ 'pkg-src_4:2.0+1A~rc1-1.dsc' => {
+ filename => 'pkg-src_4:2.0+1A~rc1-1.dsc',
+ section => 'source',
+ priority => 'extra',
+ attrs => {},
+ },
+ 'pkg-src_4:2.0+1A~rc1-1.tar.xz' => {
+ filename => 'pkg-src_4:2.0+1A~rc1-1.tar.xz',
+ section => 'source',
+ priority => 'extra',
+ attrs => {},
+ },
+ 'pkg-templ_1.2.3_arch.type' => {
+ filename => 'pkg-templ_1.2.3_arch.type',
+ package => 'pkg-templ',
+ package_type => 'type',
+ version => '1.2.3',
+ arch => 'arch',
+ section => 'section',
+ priority => 'priority',
+ attrs => {},
+ },
+ 'pkg-arch_2.0.0_amd64.deb' => {
+ filename => 'pkg-arch_2.0.0_amd64.deb',
+ package => 'pkg-arch',
+ package_type => 'deb',
+ version => '2.0.0',
+ arch => 'amd64',
+ section => 'admin',
+ priority => 'required',
+ attrs => {},
+ },
+ 'pkg-indep_0.0.1-2_all.deb' => {
+ filename => 'pkg-indep_0.0.1-2_all.deb',
+ package => 'pkg-indep',
+ package_type => 'deb',
+ version => '0.0.1-2',
+ arch => 'all',
+ section => 'net',
+ priority => 'standard',
+ attrs => {},
+ },
+ 'other_0.txt' => {
+ filename => 'other_0.txt',
+ section => 'text',
+ priority => 'optional',
+ attrs => {
+ 'mime-type' => 'text/plain',
+ },
+ },
+ 'BY-HAND-file' => {
+ filename => 'BY-HAND-file',
+ section => 'webdocs',
+ priority => 'optional',
+ attrs => {
+ 'by-hand' => 'true'
+ },
+ },
+ 'another:filename' => {
+ filename => 'another:filename',
+ section => 'by-hand',
+ priority => 'extra',
+ attrs => {},
+ },
+ 'added-on-the-fly' => {
+ filename => 'added-on-the-fly',
+ section => 'void',
+ priority => 'wish',
+ attrs => {},
+ },
+);
+
+my $dist = Dpkg::Dist::Files->new();
+$dist->load("$datadir/files-byhand") or error('cannot parse file');
+
+$expected = <<'FILES';
+BY-HAND-file webdocs optional by-hand=true
+other_0.txt text optional mime-type=text/plain
+pkg-arch_2.0.0_amd64.deb admin required
+pkg-indep_0.0.1-2_all.deb net standard
+pkg-templ_1.2.3_arch.type section priority
+FILES
+
+is($dist->output(), $expected, 'Parsed dist file');
+foreach my $f ($dist->get_files()) {
+ my $filename = $f->{filename};
+
+ is_deeply($f, $expected{$filename},
+ "Detail for individual dist file $filename, via get_files()");
+
+ my $fs = $dist->get_file($filename);
+ is_deeply($fs, $expected{$filename},
+ "Detail for individual dist file $filename, via get_file()");
+}
+
+is($dist->parse_filename('file%invalid'), undef, 'invalid filename');
+
+$expected = <<'FILES';
+BY-HAND-file webdocs optional by-hand=true
+added-on-the-fly void wish
+other_0.txt text optional mime-type=text/plain
+pkg-arch_2.0.0_amd64.deb void imperative
+pkg-templ_1.2.3_arch.type section priority
+FILES
+
+$dist->add_file('added-on-the-fly', 'void', 'wish');
+is_deeply($dist->get_file('added-on-the-fly'), $expected{'added-on-the-fly'},
+ 'Get added file added-on-the-fly');
+
+$dist->add_file('pkg-arch_2.0.0_amd64.deb', 'void', 'imperative');
+my %expected_pkg_arch = %{$expected{'pkg-arch_2.0.0_amd64.deb'}};
+$expected_pkg_arch{section} = 'void';
+$expected_pkg_arch{priority} = 'imperative';
+is_deeply($dist->get_file('pkg-arch_2.0.0_amd64.deb'), \%expected_pkg_arch,
+ 'Get modified file pkg-arch_2.0.0_amd64.deb');
+
+$dist->del_file('pkg-indep_0.0.1-2_all.deb');
+is($dist->get_file('unknown'), undef, 'Get unknown file');
+is($dist->get_file('pkg-indep_0.0.1-2_all.deb'), undef, 'Get deleted file');
+is($dist->output(), $expected, 'Modified dist object');
+
+$expected = <<'FILES';
+another:filename by-hand extra
+pkg-src_4:2.0+1A~rc1-1.dsc source extra
+pkg-src_4:2.0+1A~rc1-1.tar.xz source extra
+FILES
+
+$dist->reset();
+$dist->add_file('pkg-src_4:2.0+1A~rc1-1.dsc', 'source', 'extra');
+$dist->add_file('pkg-src_4:2.0+1A~rc1-1.tar.xz', 'source', 'extra');
+$dist->add_file('another:filename', 'by-hand', 'extra');
+
+is_deeply($dist->get_file('pkg-src_4:2.0+1A~rc1-1.dsc'),
+ $expected{'pkg-src_4:2.0+1A~rc1-1.dsc'},
+ 'Get added file pkg-src_4:2.0+1A~rc1-1.dsc');
+is_deeply($dist->get_file('pkg-src_4:2.0+1A~rc1-1.tar.xz'),
+ $expected{'pkg-src_4:2.0+1A~rc1-1.tar.xz'},
+ 'Get added file pkg-src_4:2.0+1A~rc1-1.tar.xz');
+is_deeply($dist->get_file('another:filename'),
+ $expected{'another:filename'},
+ 'Get added file another:filename');
+is($dist->output, $expected, 'Added source files');
+
+$expected = <<'FILES';
+BY-HAND-file webdocs optional by-hand=true
+other_0.txt text optional mime-type=text/plain
+pkg-arch_2.0.0_amd64.deb admin required
+pkg-frag-a_0.0_arch.type section priority
+pkg-frag-b_0.0_arch.type section priority
+pkg-indep_0.0.1-2_all.deb net standard
+pkg-templ_1.2.3_arch.type section priority
+FILES
+
+$dist->reset();
+$dist->load_dir($datadir) or error('cannot parse fragment files');
+is($dist->output(), $expected, 'Parse fragment directory');
+
+$expected = <<'FILES';
+pkg-arch_2.0.0_amd64.deb admin required
+pkg-indep_0.0.1-2_all.deb net standard
+pkg-templ_1.2.3_arch.type section priority
+FILES
+
+$dist->reset();
+$dist->load("$datadir/files-byhand") or error('cannot parse file');
+$dist->filter(remove => sub { $_[0]->{priority} eq 'optional' });
+is($dist->output(), $expected, 'Filter remove priority optional');
+
+$expected = <<'FILES';
+BY-HAND-file webdocs optional by-hand=true
+other_0.txt text optional mime-type=text/plain
+FILES
+
+$dist->reset();
+$dist->load("$datadir/files-byhand") or error('cannot parse file');
+$dist->filter(keep => sub { $_[0]->{priority} eq 'optional' });
+is($dist->output(), $expected, 'Filter keep priority optional');
+
+$expected = <<'FILES';
+BY-HAND-file webdocs optional by-hand=true
+FILES
+
+$dist->reset();
+$dist->load("$datadir/files-byhand") or error('cannot parse file');
+$dist->filter(remove => sub { $_[0]->{section} eq 'text' },
+ keep => sub { $_[0]->{priority} eq 'optional' });
+is($dist->output(), $expected, 'Filter remove section text, keep priority optional');
diff --git a/scripts/t/Dpkg_Dist_Files/files-byhand b/scripts/t/Dpkg_Dist_Files/files-byhand
new file mode 100644
index 0000000..416b14f
--- /dev/null
+++ b/scripts/t/Dpkg_Dist_Files/files-byhand
@@ -0,0 +1,5 @@
+pkg-templ_1.2.3_arch.type section priority
+pkg-arch_2.0.0_amd64.deb admin required
+pkg-indep_0.0.1-2_all.deb net standard
+other_0.txt text optional mime-type=text/plain
+BY-HAND-file webdocs optional by-hand=true
diff --git a/scripts/t/Dpkg_Dist_Files/files-fragment-a b/scripts/t/Dpkg_Dist_Files/files-fragment-a
new file mode 100644
index 0000000..fd6461d
--- /dev/null
+++ b/scripts/t/Dpkg_Dist_Files/files-fragment-a
@@ -0,0 +1 @@
+pkg-frag-a_0.0_arch.type section priority
diff --git a/scripts/t/Dpkg_Dist_Files/files-fragment-b b/scripts/t/Dpkg_Dist_Files/files-fragment-b
new file mode 100644
index 0000000..2acf22f
--- /dev/null
+++ b/scripts/t/Dpkg_Dist_Files/files-fragment-b
@@ -0,0 +1 @@
+pkg-frag-b_0.0_arch.type section priority
diff --git a/scripts/t/Dpkg_ErrorHandling.t b/scripts/t/Dpkg_ErrorHandling.t
new file mode 100644
index 0000000..3ef93a4
--- /dev/null
+++ b/scripts/t/Dpkg_ErrorHandling.t
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+BEGIN {
+ use_ok('Dpkg::ErrorHandling');
+}
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_Exit.t b/scripts/t/Dpkg_Exit.t
new file mode 100644
index 0000000..5e83689
--- /dev/null
+++ b/scripts/t/Dpkg_Exit.t
@@ -0,0 +1,66 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 7;
+
+BEGIN {
+ use_ok('Dpkg::Exit');
+}
+
+my $track = 0;
+
+sub test_handler {
+ $track++;
+}
+
+Dpkg::Exit::run_exit_handlers();
+
+is($track, 0, 'no handlers run');
+
+Dpkg::Exit::push_exit_handler(\&test_handler);
+Dpkg::Exit::pop_exit_handler();
+
+Dpkg::Exit::run_exit_handlers();
+
+is($track, 0, 'push/pop; no handlers run');
+
+Dpkg::Exit::push_exit_handler(\&test_handler);
+
+Dpkg::Exit::run_exit_handlers();
+
+is($track, 1, 'push; handler run');
+
+# Check the exit handlers, must be the last thing done.
+sub exit_handler {
+ pass('exit handler invoked');
+ exit 0;
+}
+
+sub ini_handler {
+ pass('ini handler invoked');
+}
+
+sub end_handler {
+ pass('end handler invoked');
+}
+
+Dpkg::Exit::push_exit_handler(\&end_handler);
+Dpkg::Exit::push_exit_handler(\&exit_handler);
+Dpkg::Exit::push_exit_handler(\&ini_handler);
+
+kill 'INT', $$;
diff --git a/scripts/t/Dpkg_File.t b/scripts/t/Dpkg_File.t
new file mode 100644
index 0000000..a1292af
--- /dev/null
+++ b/scripts/t/Dpkg_File.t
@@ -0,0 +1,78 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 10;
+use Test::Dpkg qw(:paths);
+
+use File::Compare;
+use File::Path qw(rmtree);
+
+BEGIN {
+ use_ok('Dpkg::File');
+}
+
+my $datadir = test_get_data_path();
+my $tempdir = test_get_temp_path();
+
+my ($data, $data_ref, $data_fh);
+
+$data = file_slurp("$datadir/slurp-me");
+$data_ref = <<'DATA';
+first line
+next line
+final line
+DATA
+is($data, $data_ref, 'slurped data');
+
+file_dump("$tempdir/slurp-me", $data);
+ok(compare("$tempdir/slurp-me", "$datadir/slurp-me") == 0,
+ 'dumped slurped data');
+
+open $data_fh, '<', "$datadir/slurp-me"
+ or die "cannot open $datadir/slurp-me for reading: $!";
+my $discard = <$data_fh>;
+$data = file_slurp($data_fh);
+close $data_fh;
+$data_ref = <<'DATA';
+next line
+final line
+DATA
+is($data, $data_ref, 'slurped partial data');
+
+file_dump("$tempdir/dump-partial", $data);
+ok(compare("$tempdir/dump-partial", "$datadir/dump-partial") == 0,
+ 'dumped slurped partial data');
+
+open $data_fh, '>', "$tempdir/append-me"
+ or die "cannot create $tempdir/append-me: $!";
+print { $data_fh } "append line\n";
+file_dump($data_fh, "new line\nend line\n");
+close $data_fh;
+ok(compare("$tempdir/append-me", "$datadir/append-me") == 0,
+ 'dumped appended data');
+
+$data = undef;
+eval {
+ $data = file_slurp("$datadir/non-existent");
+};
+ok($@, 'cannot slurp missing file');
+
+ok(! -e "$tempdir/touched", 'file to be touched does not exist');
+file_touch("$tempdir/touched");
+ok(-e "$tempdir/touched", 'touched file exists');
+ok(-z "$tempdir/touched", 'touched file is empty');
diff --git a/scripts/t/Dpkg_File/append-me b/scripts/t/Dpkg_File/append-me
new file mode 100644
index 0000000..d332d64
--- /dev/null
+++ b/scripts/t/Dpkg_File/append-me
@@ -0,0 +1,3 @@
+append line
+new line
+end line
diff --git a/scripts/t/Dpkg_File/dump-partial b/scripts/t/Dpkg_File/dump-partial
new file mode 100644
index 0000000..4a00dc0
--- /dev/null
+++ b/scripts/t/Dpkg_File/dump-partial
@@ -0,0 +1,2 @@
+next line
+final line
diff --git a/scripts/t/Dpkg_File/slurp-me b/scripts/t/Dpkg_File/slurp-me
new file mode 100644
index 0000000..8840ed4
--- /dev/null
+++ b/scripts/t/Dpkg_File/slurp-me
@@ -0,0 +1,3 @@
+first line
+next line
+final line
diff --git a/scripts/t/Dpkg_Getopt.t b/scripts/t/Dpkg_Getopt.t
new file mode 100644
index 0000000..50e0921
--- /dev/null
+++ b/scripts/t/Dpkg_Getopt.t
@@ -0,0 +1,38 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 4;
+
+BEGIN {
+ use_ok('Dpkg::Getopt');
+}
+
+my @expect_argv;
+
+@ARGV = normalize_options(args => [ qw(-a -bfoo -c var) ]);
+@expect_argv = qw(-a -b foo -c var);
+is_deeply(\@ARGV, \@expect_argv, 'unbundle short options');
+
+@ARGV = normalize_options(args => [ qw(--option-a --option-b value --option-c=value) ]);
+@expect_argv = qw(--option-a --option-b value --option-c value);
+is_deeply(\@ARGV, \@expect_argv, 'unbundle long options');
+
+@ARGV = normalize_options(args => [ qw(-aaa -bbb --option-a=oa -- --opt=arg -dval) ],
+ delim => '--');
+@expect_argv = qw(-a aa -b bb --option-a oa -- --opt=arg -dval);
+is_deeply(\@ARGV, \@expect_argv, 'unbundle options with delimiter');
diff --git a/scripts/t/Dpkg_Gettext.t b/scripts/t/Dpkg_Gettext.t
new file mode 100644
index 0000000..332d09f
--- /dev/null
+++ b/scripts/t/Dpkg_Gettext.t
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+BEGIN {
+ use_ok('Dpkg::Gettext');
+}
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_IPC.t b/scripts/t/Dpkg_IPC.t
new file mode 100644
index 0000000..450d98d
--- /dev/null
+++ b/scripts/t/Dpkg_IPC.t
@@ -0,0 +1,71 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 8;
+
+use File::Temp qw(tempfile);
+
+use Dpkg::File;
+
+use_ok('Dpkg::IPC');
+
+my ($tmp1_fh, $tmp1_name) = tempfile(UNLINK => 1);
+my ($tmp2_fh, $tmp2_name) = tempfile(UNLINK => 1);
+
+my $string1 = "foo\nbar\n";
+my $string2;
+
+file_dump($tmp1_name, $string1);
+
+my $pid = spawn(exec => 'cat',
+ from_string => \$string1,
+ to_string => \$string2);
+
+ok($pid, 'execute cat program, I/O to variables');
+
+is($string2, $string1, '{from,to}_string');
+
+$pid = spawn(exec => 'cat',
+ from_handle => $tmp1_fh,
+ to_handle => $tmp2_fh);
+
+ok($pid, 'execute cat program, I/O to filehandles');
+
+wait_child($pid);
+
+$string2 = file_slurp($tmp2_name);
+
+is($string2, $string1, '{from,to}_handle');
+
+$pid = spawn(exec => 'cat',
+ from_file => $tmp1_name,
+ to_file => $tmp2_name,
+ wait_child => 1);
+
+ok($pid, 'execute cat program, I/O to filenames and wait');
+
+$string2 = file_slurp($tmp2_name);
+
+is($string2, $string1, '{from,to}_file');
+
+eval {
+ $pid = spawn(exec => ['sleep', '10'],
+ wait_child => 1,
+ timeout => 1);
+};
+ok($@, 'fails on timeout');
diff --git a/scripts/t/Dpkg_Index.t b/scripts/t/Dpkg_Index.t
new file mode 100644
index 0000000..b17c74b
--- /dev/null
+++ b/scripts/t/Dpkg_Index.t
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+BEGIN {
+ use_ok('Dpkg::Index');
+}
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_Interface_Storable.t b/scripts/t/Dpkg_Interface_Storable.t
new file mode 100644
index 0000000..963e140
--- /dev/null
+++ b/scripts/t/Dpkg_Interface_Storable.t
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+BEGIN {
+ use_ok('Dpkg::Interface::Storable');
+}
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_Lock.t b/scripts/t/Dpkg_Lock.t
new file mode 100644
index 0000000..b30e2c1
--- /dev/null
+++ b/scripts/t/Dpkg_Lock.t
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+BEGIN {
+ use_ok('Dpkg::Lock');
+}
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_OpenPGP.t b/scripts/t/Dpkg_OpenPGP.t
new file mode 100644
index 0000000..c3cd724
--- /dev/null
+++ b/scripts/t/Dpkg_OpenPGP.t
@@ -0,0 +1,114 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Dpkg qw(:paths :needs);
+
+use File::Compare;
+
+use Dpkg::ErrorHandling;
+use Dpkg::Path qw(find_command);
+use Dpkg::OpenPGP::KeyHandle;
+
+my %backend_cmd = (
+ auto => 'auto',
+ gpg => 'gpg',
+ sq => 'sq',
+ sqop => 'sop',
+ 'pgpainless-cli' => 'sop',
+);
+my @cmds = test_needs_openpgp_backend();
+unshift @cmds, 'auto';
+
+plan tests => 2 + 15 * scalar @cmds;
+
+use_ok('Dpkg::OpenPGP');
+use_ok('Dpkg::OpenPGP::ErrorCodes');
+
+report_options(quiet_warnings => 1);
+
+sub test_diff
+{
+ my ($exp_file, $gen_file, $desc) = @_;
+
+ my $res = compare($exp_file, $gen_file);
+ if ($res) {
+ system "diff -u '$exp_file' '$gen_file' >&2";
+ }
+ ok($res == 0, "$desc ($exp_file vs $gen_file)");
+}
+
+foreach my $cmd (@cmds) {
+ my $datadir = test_get_data_path();
+ my $tempdir = test_get_temp_path();
+
+ my $backend = $backend_cmd{$cmd};
+ my $openpgp = Dpkg::OpenPGP->new(
+ backend => $backend,
+ cmd => $cmd,
+ );
+
+ ok($openpgp->dearmor('PUBLIC KEY BLOCK', "$datadir/dpkg-test-pub.asc", "$tempdir/dpkg-test-pub.pgp") == OPENPGP_OK(),
+ "($backend:$cmd) dearmoring OpenPGP ASCII Armored certificate");
+ ok($openpgp->armor('PUBLIC KEY BLOCK', "$tempdir/dpkg-test-pub.pgp", "$tempdir/dpkg-test-pub.asc") == OPENPGP_OK(),
+ "($backend:$cmd) armoring OpenPGP binary certificate");
+ test_diff("$datadir/dpkg-test-pub.asc", "$tempdir/dpkg-test-pub.asc",
+ "($backend:$cmd) OpenPGP certificate dearmor/armor round-trip correctly");
+
+ ok($openpgp->armor('SIGNATURE', "$datadir/sign-file.sig", "$tempdir/sign-file.asc") == OPENPGP_OK(),
+ "($backend:$cmd) armoring OpenPGP binary signature succeeded");
+ ok(compare("$datadir/sign-file.sig", "$tempdir/sign-file.asc") != 0,
+ "($backend:$cmd) armoring OpenPGP ASCII Armor changed the file");
+ ok($openpgp->armor('SIGNATURE', "$datadir/sign-file.asc", "$tempdir/sign-file-rearmor.asc") == OPENPGP_OK(),
+ "($backend:$cmd) armoring OpenPGP armored signature succeeded");
+ test_diff("$datadir/sign-file.asc", "$tempdir/sign-file-rearmor.asc",
+ "($backend:$cmd) rearmoring OpenPGP ASCII Armor changed the file");
+
+ ok($openpgp->dearmor('SIGNATURE', "$tempdir/sign-file.asc", "$tempdir/sign-file.sig") == OPENPGP_OK(),
+ "($backend:$cmd) dearmoring OpenPGP armored signature succeeded");
+ test_diff("$datadir/sign-file.sig", "$tempdir/sign-file.sig",
+ "($backend:$cmd) dearmored OpenPGP ASCII Armor signature matches");
+
+ my $cert = "$datadir/dpkg-test-pub.asc";
+
+ ok($openpgp->inline_verify("$datadir/sign-file-inline.asc", undef, $cert) == OPENPGP_OK(),
+ "($backend:$cmd) verify OpenPGP ASCII Armor inline signature");
+ ok($openpgp->inline_verify("$datadir/sign-file-inline.sig", undef, $cert) == OPENPGP_OK(),
+ "($backend:$cmd) verify OpenPGP binary inline signature");
+
+ ok($openpgp->verify("$datadir/sign-file", "$datadir/sign-file.asc", $cert) == OPENPGP_OK(),
+ "($backend:$cmd) verify OpenPGP ASCII Armor detached signature");
+ ok($openpgp->verify("$datadir/sign-file", "$datadir/sign-file.sig", $cert) == OPENPGP_OK(),
+ "($backend:$cmd) verify OpenPGP binary detached signature");
+
+ my $key = Dpkg::OpenPGP::KeyHandle->new(
+ type => 'keyfile',
+ handle => "$datadir/dpkg-test-sec.asc",
+ );
+
+ SKIP: {
+ skip 'cannot use secrets', 2 unless $openpgp->can_use_secrets($key);
+
+ ok($openpgp->inline_sign("$datadir/sign-file", "$tempdir/sign-file-inline.asc", $key) == OPENPGP_OK(),
+ "($backend:$cmd) inline OpenPGP sign");
+ ok($openpgp->inline_verify("$tempdir/sign-file-inline.asc", undef, $cert) == OPENPGP_OK(),
+ "($backend:$cmd) verify generated inline OpenPGP signature");
+ };
+
+ # TODO: Add more test cases.
+}
diff --git a/scripts/t/Dpkg_OpenPGP/dpkg-test-pub.asc b/scripts/t/Dpkg_OpenPGP/dpkg-test-pub.asc
new file mode 100644
index 0000000..f9b9f2b
--- /dev/null
+++ b/scripts/t/Dpkg_OpenPGP/dpkg-test-pub.asc
@@ -0,0 +1,24 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+xjMEYtiJpRYJKwYBBAHaRw8BAQdAPc9bt2qxxLSlbrcdtR70gPFeqCusNUh/LjQV
+9es9JPbCwAsEHxYKAH0FgmLYiaUDCwkHCRDQUbmhp4t5cEcUAAAAAAAeACBzYWx0
+QG5vdGF0aW9ucy5zZXF1b2lhLXBncC5vcmfarUJqlr3ies5QhbUfk4/CGJ8yjA5A
+xU2FniSvr1MEWAMVCggCmwECHgEWIQQ0iPyXWWjO+6ezdVTQUbmhp4t5cAAAeKwB
+ALhQhFu11tuBqJkeqbsB+zDw3TqINXDdOnZsz4zQTP8cAQCXB24twCDSwgL5ApXD
+LDKxacm+yTJG1xAr5fey/WM6Dc0lRHBrZyBUZXN0IEtleSA8ZHBrZy10ZXN0QGV4
+YW1wbGUub3JnPsLADgQTFgoAgAWCYtiJpQMLCQcJENBRuaGni3lwRxQAAAAAAB4A
+IHNhbHRAbm90YXRpb25zLnNlcXVvaWEtcGdwLm9yZ5lEbcjt2RQSjys6N6+y4VDN
+OVw0W5VOTjJKEWDQHZDmAxUKCAKZAQKbAQIeARYhBDSI/JdZaM77p7N1VNBRuaGn
+i3lwAAA/3wD6A46mcuHcy26BOyz8co2cl53+tQeZ1F2qhg2kcofLA3UBAL7BWWPc
+Zojs6SbiB8Dc7BrYkJ4jk13jYpYXwa7CnEwPzjMEYtiJpRYJKwYBBAHaRw8BAQdA
+EC8I7eVdWPckXSEJdxYtGSUTOfSUFtP31dZZSiHawivCwL8EGBYKATEFgmLYiaUJ
+ENBRuaGni3lwRxQAAAAAAB4AIHNhbHRAbm90YXRpb25zLnNlcXVvaWEtcGdwLm9y
+Z3wtg1MDVcKCPrpDO5sjWVCjoFjYX3/+1+KopBiO8UPtApsCvqAEGRYKAG8FgmLY
+iaUJEF8IeVKOdEodRxQAAAAAAB4AIHNhbHRAbm90YXRpb25zLnNlcXVvaWEtcGdw
+Lm9yZ5tsuhbNSkLk/OacoV9yfg+ediDvQ51kf9N6Ue1y0k+nFiEEld5RAbTaqSHO
+dkqUXwh5Uo50Sh0AAGMlAP4jFUATpYnAjF8rnh/3Oh7ZNXzRXmju8voJnkPh9C+P
+GAD/aGKxGy1wpAQT+qJnNMIXIVq//E6Nw+Bg+iC9+Sy+KwoWIQQ0iPyXWWjO+6ez
+dVTQUbmhp4t5cAAAyQwA/RFPJCO1yGV0ifxxfruj9qxr9ND3zo1YbIDJUdJS+QyX
+AQC/SgSs3xBCVcXjIq2ot1YUhSaZ9VdonekgYr5VdmDMBw==
+=dG1m
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/scripts/t/Dpkg_OpenPGP/dpkg-test-sec.asc b/scripts/t/Dpkg_OpenPGP/dpkg-test-sec.asc
new file mode 100644
index 0000000..75fc7b3
--- /dev/null
+++ b/scripts/t/Dpkg_OpenPGP/dpkg-test-sec.asc
@@ -0,0 +1,28 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+Comment: 3488 FC97 5968 CEFB A7B3 7554 D051 B9A1 A78B 7970
+Comment: Dpkg Test Key <dpkg-test@example.org>
+
+xVgEYtiJpRYJKwYBBAHaRw8BAQdAPc9bt2qxxLSlbrcdtR70gPFeqCusNUh/LjQV
+9es9JPYAAQCuHs3w2a7cIhaFk82fIsXfpIGMJUHh2tJj/6TzUTIYehIhwsALBB8W
+CgB9BYJi2ImlAwsJBwkQ0FG5oaeLeXBHFAAAAAAAHgAgc2FsdEBub3RhdGlvbnMu
+c2VxdW9pYS1wZ3Aub3Jn2q1Capa94nrOUIW1H5OPwhifMowOQMVNhZ4kr69TBFgD
+FQoIApsBAh4BFiEENIj8l1lozvuns3VU0FG5oaeLeXAAAHisAQC4UIRbtdbbgaiZ
+Hqm7Afsw8N06iDVw3Tp2bM+M0Ez/HAEAlwduLcAg0sIC+QKVwywysWnJvskyRtcQ
+K+X3sv1jOg3NJURwa2cgVGVzdCBLZXkgPGRwa2ctdGVzdEBleGFtcGxlLm9yZz7C
+wA4EExYKAIAFgmLYiaUDCwkHCRDQUbmhp4t5cEcUAAAAAAAeACBzYWx0QG5vdGF0
+aW9ucy5zZXF1b2lhLXBncC5vcmeZRG3I7dkUEo8rOjevsuFQzTlcNFuVTk4yShFg
+0B2Q5gMVCggCmQECmwECHgEWIQQ0iPyXWWjO+6ezdVTQUbmhp4t5cAAAP98A+gOO
+pnLh3MtugTss/HKNnJed/rUHmdRdqoYNpHKHywN1AQC+wVlj3GaI7Okm4gfA3Owa
+2JCeI5Nd42KWF8GuwpxMD8dYBGLYiaUWCSsGAQQB2kcPAQEHQBAvCO3lXVj3JF0h
+CXcWLRklEzn0lBbT99XWWUoh2sIrAAD+KhjwmbT+2rv06tPgJnBEP4x7CEMJdTlk
+t7Z/M0dlVhQQXMLAvwQYFgoBMQWCYtiJpQkQ0FG5oaeLeXBHFAAAAAAAHgAgc2Fs
+dEBub3RhdGlvbnMuc2VxdW9pYS1wZ3Aub3JnfC2DUwNVwoI+ukM7myNZUKOgWNhf
+f/7X4qikGI7xQ+0CmwK+oAQZFgoAbwWCYtiJpQkQXwh5Uo50Sh1HFAAAAAAAHgAg
+c2FsdEBub3RhdGlvbnMuc2VxdW9pYS1wZ3Aub3Jnm2y6Fs1KQuT85pyhX3J+D552
+IO9DnWR/03pR7XLST6cWIQSV3lEBtNqpIc52SpRfCHlSjnRKHQAAYyUA/iMVQBOl
+icCMXyueH/c6Htk1fNFeaO7y+gmeQ+H0L48YAP9oYrEbLXCkBBP6omc0whchWr/8
+To3D4GD6IL35LL4rChYhBDSI/JdZaM77p7N1VNBRuaGni3lwAADJDAD9EU8kI7XI
+ZXSJ/HF+u6P2rGv00PfOjVhsgMlR0lL5DJcBAL9KBKzfEEJVxeMirai3VhSFJpn1
+V2id6SBivlV2YMwH
+=D6tH
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/scripts/t/Dpkg_OpenPGP/sign-file b/scripts/t/Dpkg_OpenPGP/sign-file
new file mode 100644
index 0000000..7fb0a1c
--- /dev/null
+++ b/scripts/t/Dpkg_OpenPGP/sign-file
@@ -0,0 +1,5 @@
+This is a data file that will be signed
+as part of the dpkg OpenPGP test suite.
+
+It contains «UTF-8» characters so that
+we can check binary and ASCII signatures ☺.
diff --git a/scripts/t/Dpkg_OpenPGP/sign-file-inline.asc b/scripts/t/Dpkg_OpenPGP/sign-file-inline.asc
new file mode 100644
index 0000000..38059f8
--- /dev/null
+++ b/scripts/t/Dpkg_OpenPGP/sign-file-inline.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+This is a data file that will be signed
+as part of the dpkg OpenPGP test suite.
+
+It contains «UTF-8» characters so that
+we can check binary and ASCII signatures ☺.
+-----BEGIN PGP SIGNATURE-----
+
+wr0EARYKAG8FgmNn/JoJEF8IeVKOdEodRxQAAAAAAB4AIHNhbHRAbm90YXRpb25z
+LnNlcXVvaWEtcGdwLm9yZ6ner4BBATzhFswk2JmdwxDwRwEY7Ez64dxHFNuT0rIn
+FiEEld5RAbTaqSHOdkqUXwh5Uo50Sh0AAH26AQCojIenPOWX7+GUk+lKeo+7hnpx
+nozY9z/+4Pe1KamB4AEAsL9fpRgmecLcVhHBteK8t8/laLkzdY4nji+1BmeRrgQ=
+=4UM2
+-----END PGP SIGNATURE-----
diff --git a/scripts/t/Dpkg_OpenPGP/sign-file-inline.sig b/scripts/t/Dpkg_OpenPGP/sign-file-inline.sig
new file mode 100644
index 0000000..cb07a8e
--- /dev/null
+++ b/scripts/t/Dpkg_OpenPGP/sign-file-inline.sig
Binary files differ
diff --git a/scripts/t/Dpkg_OpenPGP/sign-file.asc b/scripts/t/Dpkg_OpenPGP/sign-file.asc
new file mode 100644
index 0000000..5b96d6f
--- /dev/null
+++ b/scripts/t/Dpkg_OpenPGP/sign-file.asc
@@ -0,0 +1,8 @@
+-----BEGIN PGP SIGNATURE-----
+
+wr0EABYKAG8FgmNn+7oJEF8IeVKOdEodRxQAAAAAAB4AIHNhbHRAbm90YXRpb25z
+LnNlcXVvaWEtcGdwLm9yZ6I+NlLnxa3+q9VIr0tkR75ehn2pOJ0a5T7TbEKamHeH
+FiEEld5RAbTaqSHOdkqUXwh5Uo50Sh0AADADAP0edQHN/mcxubIU8Z8RTbdBe0uu
+AyzTI/4rIjImBPRoxgEAoWB+JczVmgeVRdkm8BW77PqFailPUf0mnokZZszz+Qc=
+=qfwq
+-----END PGP SIGNATURE-----
diff --git a/scripts/t/Dpkg_OpenPGP/sign-file.sig b/scripts/t/Dpkg_OpenPGP/sign-file.sig
new file mode 100644
index 0000000..125424c
--- /dev/null
+++ b/scripts/t/Dpkg_OpenPGP/sign-file.sig
Binary files differ
diff --git a/scripts/t/Dpkg_OpenPGP_KeyHandle.t b/scripts/t/Dpkg_OpenPGP_KeyHandle.t
new file mode 100644
index 0000000..23a8c9b
--- /dev/null
+++ b/scripts/t/Dpkg_OpenPGP_KeyHandle.t
@@ -0,0 +1,90 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 21;
+
+BEGIN {
+ use_ok('Dpkg::OpenPGP::KeyHandle');
+}
+
+my @ref_keys = (
+ {
+ type => 'auto',
+ handle => '0x12345678',
+ exp_type => 'keyid',
+ exp_handle => '12345678',
+ }, {
+ type => 'auto',
+ handle => '0x1234567890abcdef',
+ exp_type => 'keyid',
+ exp_handle => '1234567890abcdef',
+ }, {
+ type => 'auto',
+ handle => '0x1234567890abcdef1234567890abcdef',
+ exp_type => 'keyid',
+ exp_handle => '1234567890abcdef1234567890abcdef',
+ }, {
+ type => 'auto',
+ handle => 'Alice Auster',
+ exp_type => 'userid',
+ exp_handle => 'Alice Auster',
+ }, {
+ type => 'auto',
+ handle => 'Alice Auster <alice@example.org>',
+ exp_type => 'userid',
+ exp_handle => 'Alice Auster <alice@example.org>',
+ }, {
+ type => 'keyid',
+ handle => '0x12345678',
+ exp_type => 'keyid',
+ exp_handle => '12345678',
+ }, {
+ type => 'keyid',
+ handle => '0x1234567890abcdef',
+ exp_type => 'keyid',
+ exp_handle => '1234567890abcdef',
+ }, {
+ type => 'keyid',
+ handle => '0x1234567890abcdef1234567890abcdef',
+ exp_type => 'keyid',
+ exp_handle => '1234567890abcdef1234567890abcdef',
+ }, {
+ type => 'userid',
+ handle => 'Alice Auster',
+ exp_type => 'userid',
+ exp_handle => 'Alice Auster',
+ }, {
+ type => 'userid',
+ handle => 'Alice Auster <alice@example.org>',
+ exp_type => 'userid',
+ exp_handle => 'Alice Auster <alice@example.org>',
+ }
+);
+
+foreach my $ref_key (@ref_keys) {
+ my $key = Dpkg::OpenPGP::KeyHandle->new(
+ type => $ref_key->{type},
+ handle => $ref_key->{handle},
+ );
+ is($key->type, $ref_key->{exp_type},
+ 'key type ' . $key->type . " sanitized as $ref_key->{exp_type}");
+ is($key->handle, $ref_key->{exp_handle},
+ 'key handle ' . $key->handle . " sanitized as $ref_key->{exp_handle}");
+}
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_Package.t b/scripts/t/Dpkg_Package.t
new file mode 100644
index 0000000..cc2979f
--- /dev/null
+++ b/scripts/t/Dpkg_Package.t
@@ -0,0 +1,42 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 12;
+
+use_ok('Dpkg::Package');
+
+ok(pkg_name_is_illegal(undef), 'package name is undef');
+ok(pkg_name_is_illegal(''), 'package name is empty');
+ok(pkg_name_is_illegal('%_&'), 'package name has invalid chars');
+ok(pkg_name_is_illegal('ABC'), 'package name has uppercase chars');
+ok(pkg_name_is_illegal('-abc'), 'package name has a dash');
+
+is(pkg_name_is_illegal('pkg+name-1.0'), undef, 'package name is valid');
+
+eval { set_source_name('foo%bar') };
+ok($@, 'cannot set invalid source package name');
+is(get_source_name(), undef, 'invalid source package name unset');
+
+set_source_name('source');
+is(get_source_name(), 'source', 'set/get source package name');
+
+set_source_name('source');
+is(get_source_name(), 'source', 'reset/get same source package name');
+
+eval { set_source_name('other') };
+ok($@, 'cannot set different source package name');
diff --git a/scripts/t/Dpkg_Path.t b/scripts/t/Dpkg_Path.t
new file mode 100644
index 0000000..0b0d6bd
--- /dev/null
+++ b/scripts/t/Dpkg_Path.t
@@ -0,0 +1,237 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 34;
+use Test::Dpkg qw(:paths);
+
+use Cwd qw(realpath);
+use File::Path qw(make_path rmtree);
+use File::Spec::Functions qw(abs2rel);
+
+use Dpkg::File;
+
+use_ok('Dpkg::Path', 'canonpath', 'resolve_symlink',
+ 'check_files_are_the_same',
+ 'check_directory_traversal',
+ 'get_pkg_root_dir',
+ 'guess_pkg_root_dir', 'relative_to_pkg_root');
+
+my $tmpdir = test_get_temp_path();
+
+make_path("$tmpdir/a/b/c");
+make_path("$tmpdir/a/DEBIAN");
+make_path("$tmpdir/debian/a/b/c");
+symlink 'a/b/c', "$tmpdir/cbis";
+symlink '/this/does/not/exist', "$tmpdir/tmp";
+symlink '.', "$tmpdir/here";
+
+is(canonpath("$tmpdir/./a///b/c"), "$tmpdir/a/b/c", 'canonpath basic test');
+is(canonpath("$tmpdir/a/b/../../a/b/c"), "$tmpdir/a/b/c", 'canonpath and ..');
+is(canonpath("$tmpdir/a/b/c/../../"), "$tmpdir/a", 'canonpath .. at end');
+is(canonpath("$tmpdir/cbis/../"), "$tmpdir/cbis/..", 'canonpath .. after symlink');
+
+is(resolve_symlink("$tmpdir/here/cbis"), "$tmpdir/here/a/b/c", 'resolve_symlink');
+is(resolve_symlink("$tmpdir/tmp"), '/this/does/not/exist', 'resolve_symlink absolute');
+is(resolve_symlink("$tmpdir/here"), $tmpdir, 'resolve_symlink .');
+
+ok(!check_files_are_the_same("$tmpdir/here", $tmpdir), 'Symlink is not the same!');
+ok(check_files_are_the_same("$tmpdir/here/a", "$tmpdir/a"), 'Same directory');
+
+sub gen_hier_travbase {
+ my $basedir = shift;
+
+ make_path("$basedir/subdir");
+ file_touch("$basedir/file");
+ file_touch("$basedir/subdir/subfile");
+ symlink 'file', "$basedir/symlink-file";
+ symlink 'subdir/subfile', "$basedir/symlink-subfile";
+}
+
+my $travbase = "$tmpdir/travbase";
+my $travbase_out = "$tmpdir/travbase-out";
+my %travtype = (
+ none => {
+ fail => 0,
+ gen => sub { },
+ },
+ same => {
+ fail => 0,
+ chroot => "$tmpdir/travbase-same",
+ gen => sub {
+ my $basedir = shift;
+ symlink '../..', "$basedir/subdir/root";
+ },
+ },
+ dev_null => {
+ fail => 0,
+ gen => sub {
+ my $basedir = shift;
+ symlink '/dev/null', "$basedir/dev-null";
+ },
+ },
+ dots => {
+ fail => 0,
+ gen => sub {
+ my $basedir = shift;
+ symlink 'aa..bb..cc', "$basedir/dots";
+ },
+ },
+ rel => {
+ fail => 1,
+ gen => sub {
+ my $basedir = shift;
+ symlink '../../..', "$basedir/rel";
+ },
+ },
+ abs => {
+ fail => 1,
+ gen => sub {
+ my $basedir = shift;
+ symlink '/etc', "$basedir/abs";
+ },
+ },
+ loop => {
+ fail => 1,
+ gen => sub {
+ my $basedir = shift;
+ symlink 'self', "$basedir/self";
+ },
+ },
+ enoent_rel => {
+ fail => 0,
+ gen => sub {
+ my $basedir = shift;
+ symlink 'not-existent', "$basedir/enoent-rel";
+ },
+ },
+ enoent_abs => {
+ fail => 1,
+ gen => sub {
+ my $basedir = shift;
+ symlink '/not-existent', "$basedir/enoent-abs";
+ },
+ },
+ enoent_indirect_rel => {
+ fail => 0,
+ gen => sub {
+ my $basedir = shift;
+ symlink 'not-existent', "$basedir/enoent-rel";
+ symlink 'enoent-rel', "$basedir/enoent-indirect-rel";
+ },
+ },
+ enoent_indirect_abs => {
+ fail => 1,
+ gen => sub {
+ my $basedir = shift;
+ symlink '/not-existent', "$basedir/enoent-abs";
+ symlink realpath("$basedir/enoent-abs"), "$basedir/enoent-indirect-abs";
+ },
+ },
+ base_in_none => {
+ fail => 0,
+ gen => sub {
+ my $basedir = shift;
+ rename $basedir, "$basedir-real";
+ symlink 'base_in_none-real', $basedir;
+ },
+ },
+ base_in_rel => {
+ fail => 1,
+ gen => sub {
+ my $basedir = shift;
+ rename $basedir, "$basedir-real";
+ symlink 'base_in_rel-real', $basedir;
+ symlink '../../..', "$basedir/rel";
+ },
+ },
+ base_in_abs => {
+ fail => 1,
+ gen => sub {
+ my $basedir = shift;
+ rename $basedir, "$basedir-real";
+ symlink 'base_in_abs-real', $basedir;
+ symlink '/etc', "$basedir/abs";
+ },
+ },
+ base_out_empty => {
+ fail => 1,
+ root => $travbase_out,
+ gen => sub {
+ my $basedir = shift;
+ rmtree($basedir);
+ make_path($basedir);
+ },
+ },
+ base_out_none => {
+ fail => 1,
+ root => $travbase_out,
+ gen => sub { },
+ },
+ base_out_rel => {
+ fail => 1,
+ root => $travbase_out,
+ gen => sub {
+ my $basedir = shift;
+ symlink '../../..', "$basedir/rel";
+ },
+ },
+ base_out_abs => {
+ fail => 1,
+ root => $travbase_out,
+ gen => sub {
+ my $basedir = shift;
+ symlink '/etc', "$basedir/abs";
+ },
+ },
+);
+
+foreach my $travtype (sort keys %travtype) {
+ my $trav = $travtype{$travtype};
+ my $rootdir = $trav->{chroot} // $trav->{root} // $travbase;
+ my $hierdir = "$rootdir/$travtype";
+ my $travdir = "$travbase/$travtype";
+
+ gen_hier_travbase($hierdir);
+ symlink abs2rel($hierdir, $travbase), $travdir if exists $trav->{root};
+ $trav->{gen}->($hierdir);
+
+ my $catch;
+ eval {
+ check_directory_traversal($travbase, $travdir);
+ 1;
+ } or do {
+ $catch = $@;
+ };
+ if ($trav->{fail}) {
+ ok($catch, "directory traversal type $travtype detected");
+ note("traversal reason: $catch") if $catch;
+ } else {
+ ok(! $catch, "no directory traversal type $travtype");
+ diag("error from check_directory_traversal => $catch") if $catch;
+ }
+}
+
+is(get_pkg_root_dir("$tmpdir/a/b/c"), "$tmpdir/a", 'get_pkg_root_dir');
+is(guess_pkg_root_dir("$tmpdir/a/b/c"), "$tmpdir/a", 'guess_pkg_root_dir');
+is(relative_to_pkg_root("$tmpdir/a/b/c"), 'b/c', 'relative_to_pkg_root');
+
+chdir($tmpdir);
+
+is(get_pkg_root_dir('debian/a/b/c'), undef, 'get_pkg_root_dir undef');
+is(relative_to_pkg_root('debian/a/b/c'), undef, 'relative_to_pkg_root undef');
+is(guess_pkg_root_dir('debian/a/b/c'), 'debian/a', 'guess_pkg_root_dir fallback');
diff --git a/scripts/t/Dpkg_Shlibs.t b/scripts/t/Dpkg_Shlibs.t
new file mode 100644
index 0000000..7cc325c
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs.t
@@ -0,0 +1,786 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Dpkg qw(:needs :paths);
+
+use Cwd;
+use IPC::Cmd qw(can_run);
+
+plan tests => 150;
+
+$ENV{DEB_BUILD_ARCH} = 'amd64';
+$ENV{DEB_HOST_ARCH} = 'amd64';
+
+use_ok('Dpkg::Shlibs');
+
+my $tmp;
+my @tmp;
+my %tmp;
+
+my $datadir = test_get_data_path();
+
+my @librarypaths;
+
+{
+ # XXX: Keep as long as we support the deprecated LD_LIBRARY_PATH.
+ local $ENV{LD_LIBRARY_PATH} = '/test-env';
+
+ Dpkg::Shlibs::add_library_dir('/test-a');
+ @librarypaths = Dpkg::Shlibs::get_library_paths();
+ is($librarypaths[0], '/test-a', 'add_library_dir() does not get lost');
+
+ Dpkg::Shlibs::add_library_dir('/test-b');
+ @librarypaths = Dpkg::Shlibs::get_library_paths();
+ is_deeply([ @librarypaths[0, 1] ] , [ '/test-a', '/test-b' ],
+ 'add_library_dir() prepends');
+}
+
+Dpkg::Shlibs::blank_library_paths();
+
+# We want relative paths inside the ld.so.conf fragments to work, and $srcdir
+# is usually a relative path, so let's temporarily switch directory.
+# XXX: An alternative would be to make parse_ldso_conf relative path aware.
+my $cwd = getcwd();
+test_needs_srcdir_switch();
+Dpkg::Shlibs::parse_ldso_conf('t/Dpkg_Shlibs/ld.so.conf');
+chdir($cwd);
+
+@librarypaths = Dpkg::Shlibs::get_library_paths();
+is_deeply(\@librarypaths,
+ [ qw(/nonexistent32 /nonexistent/lib64
+ /usr/local/lib /nonexistent/lib128) ], 'parsed library paths');
+
+use_ok('Dpkg::Shlibs::Objdump');
+
+my $obj = Dpkg::Shlibs::Objdump::Object->new;
+
+open my $objdump, '<', "$datadir/objdump.dbd-pg"
+ or die "$datadir/objdump.dbd-pg: $!";
+$obj->parse_objdump_output($objdump);
+close $objdump;
+ok(!$obj->is_public_library(), 'Pg.so is not a public library');
+ok(!$obj->is_executable(), 'Pg.so is not an executable');
+
+open $objdump, '<', "$datadir/objdump.ls"
+ or die "$datadir/objdump.ls: $!";
+$obj->reset();
+$obj->parse_objdump_output($objdump);
+close $objdump;
+ok(!$obj->is_public_library(), 'ls is not a public library');
+ok($obj->is_executable(), 'ls is an executable');
+
+my $sym = $obj->get_symbol('optarg@GLIBC_2.0');
+ok($sym, 'optarg@GLIBC_2.0 exists');
+ok(!$sym->{defined}, 'R_*_COPY relocations are taken into account');
+
+open $objdump, '<', "$datadir/objdump.space"
+ or die "$datadir/objdump.space: $!";
+$obj->reset();
+$obj->parse_objdump_output($objdump);
+close $objdump;
+
+# Non-regression test for #506139
+$sym = $obj->get_symbol('singlespace');
+ok($sym, 'version less symbol separated by a single space are correctly parsed');
+
+open $objdump, '<', "$datadir/objdump.libc6-2.6"
+ or die "$datadir/objdump.libc6-2.6: $!";
+$obj->reset();
+$obj->parse_objdump_output($objdump);
+close $objdump;
+
+ok($obj->is_public_library(), 'libc6 is a public library');
+ok($obj->is_executable(), 'libc6 is an executable');
+
+is($obj->{SONAME}, 'libc.so.6', 'SONAME');
+is($obj->{HASH}, '0x13d99c', 'HASH');
+is($obj->{GNU_HASH}, '0x194', 'GNU_HASH');
+is($obj->{format}, 'elf32-i386', 'format');
+is_deeply($obj->{flags}, { DYNAMIC => 1, HAS_SYMS => 1, D_PAGED => 1 }, 'flags');
+is_deeply($obj->{NEEDED}, [ 'ld-linux.so.2' ], 'NEEDED');
+is_deeply([ $obj->get_needed_libraries ], [ 'ld-linux.so.2' ], 'NEEDED');
+
+$sym = $obj->get_symbol('_sys_nerr@GLIBC_2.3');
+is_deeply( $sym, { name => '_sys_nerr', version => 'GLIBC_2.3',
+ soname => 'libc.so.6', objid => 'libc.so.6',
+ section => '.rodata', dynamic => 1,
+ debug => '', type => 'O', weak => '',
+ local => '', global => 1, visibility => '',
+ hidden => 1, defined => 1 }, 'Symbol' );
+$sym = $obj->get_symbol('_IO_stdin_used');
+is_deeply( $sym, { name => '_IO_stdin_used', version => '',
+ soname => 'libc.so.6', objid => 'libc.so.6',
+ section => '*UND*', dynamic => 1,
+ debug => '', type => ' ', weak => 1,
+ local => '', global => '', visibility => '',
+ hidden => '', defined => '' }, 'Symbol 2' );
+
+my @syms = $obj->get_exported_dynamic_symbols;
+is( scalar @syms, 2231, 'defined && dynamic' );
+@syms = $obj->get_undefined_dynamic_symbols;
+is( scalar @syms, 9, 'undefined && dynamic' );
+
+
+my $obj_old = Dpkg::Shlibs::Objdump::Object->new;
+
+open $objdump, '<', "$datadir/objdump.libc6-2.3"
+ or die "$datadir/objdump.libc6-2.3: $!";
+$obj_old->parse_objdump_output($objdump);
+close $objdump;
+
+
+use_ok('Dpkg::Shlibs::SymbolFile');
+use_ok('Dpkg::Shlibs::Symbol');
+
+my $sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/symbol_file.tmp");
+my $sym_file_dup = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/symbol_file.tmp");
+my $sym_file_old = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/symbol_file.tmp");
+
+$sym_file->merge_symbols($obj_old, '2.3.6.ds1-13');
+$sym_file_old->merge_symbols($obj_old, '2.3.6.ds1-13');
+
+ok( $sym_file->has_object('libc.so.6'), 'SONAME in sym file' );
+
+$sym_file->merge_symbols($obj, '2.6-1');
+
+ok( $sym_file->get_new_symbols($sym_file_old), 'has new symbols' );
+ok( $sym_file_old->get_lost_symbols($sym_file), 'has lost symbols' );
+
+is( $sym_file_old->lookup_symbol('__bss_start@Base', ['libc.so.6']),
+ undef, 'internal symbols are ignored' );
+
+%tmp = $sym_file->lookup_symbol('_errno@GLIBC_2.0', ['libc.so.6'], 1);
+isa_ok($tmp{symbol}, 'Dpkg::Shlibs::Symbol');
+is_deeply(\%tmp, { symbol => Dpkg::Shlibs::Symbol->new(symbol => '_errno@GLIBC_2.0',
+ minver => '2.3.6.ds1-13', dep_id => 0,
+ deprecated => '2.6-1'), soname => 'libc.so.6' },
+ 'deprecated symbol');
+
+# Wildcard test
+my $pat = $sym_file_old->create_symbol('*@GLIBC_PRIVATE 2.3.6.wildcard');
+$sym_file_old->add_symbol($pat, 'libc.so.6');
+$sym_file_old->merge_symbols($obj, '2.6-1');
+$sym = $sym_file_old->lookup_symbol('__nss_services_lookup@GLIBC_PRIVATE', 'libc.so.6');
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => '__nss_services_lookup@GLIBC_PRIVATE',
+ minver => '2.3.6.wildcard', dep_id => 0, deprecated => 0,
+ tags => { symver => undef, optional => undef },
+ tagorder => [ 'symver', 'optional' ],
+ matching_pattern => $pat ), 'wildcarded symbol');
+
+# Save -> Load test
+use File::Temp;
+use File::Basename qw(basename);
+
+sub save_load_test {
+ my ($symfile, $comment, @opts) = @_;
+
+ my $save_file = File::Temp->new();
+ $symfile->save($save_file->filename, @opts);
+ my $dup = Dpkg::Shlibs::SymbolFile->new(file => $save_file->filename);
+ # Force sync of non-stored attributes
+ $dup->{file} = $symfile->{file};
+ $dup->{arch} = $symfile->{arch};
+
+ is_deeply($dup, $symfile, $comment);
+ if (-f $symfile->{file}) {
+ is(system('diff', '-u', $symfile->{file}, $save_file->filename), 0,
+ basename($symfile->{file}) . ' dumped identical');
+ }
+}
+
+save_load_test( $sym_file, 'save -> load' );
+
+
+# Test ignoring internal symbols
+open $objdump, '<', "$datadir/objdump.internal"
+ or die "objdump.internal: $!";
+$obj->reset();
+$obj->parse_objdump_output($objdump);
+close $objdump;
+
+# Do not ignore any internal symbols
+$sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/symbols.internal-filter");
+$sym_file->merge_symbols($obj, '100.MISSING');
+
+$sym = $sym_file->lookup_symbol('symbol@Base', ['libinternal.so.0']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol@Base',
+ minver => '1.0', dep_id => 0, deprecated => 0),
+ 'symbol unaffected w/o including internal symbols');
+
+$sym = $sym_file->lookup_symbol('.gomp_critical_user_foo@Base', ['libinternal.so.0']);
+is($sym, undef, 'gomp symbol omitted while filtering internal symbols');
+
+$sym = $sym_file->lookup_symbol('__aeabi_lcmp@GCC_3.0', ['libinternal.so.0']);
+is($sym, undef, 'known aeabi symbol omitted while filtering internal symbols');
+
+$sym = $sym_file->lookup_symbol('__aeabi_unknown@GCC_4.0', ['libinternal.so.0']);
+is($sym, undef, 'unknown aeabi symbol omitted while filtering internal symbols');
+
+# Include internal symbols using the allow-internal tag.
+$sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/symbols.internal-allow");
+$sym_file->merge_symbols($obj, '100.MISSING');
+
+$sym = $sym_file->lookup_symbol('symbol@Base', ['libinternal.so.0']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol@Base',
+ minver => '1.0', dep_id => 0, deprecated => 0),
+ 'symbol unaffected while including internal symbols via symbol tag');
+
+$sym = $sym_file->lookup_symbol('.gomp_critical_user_foo@Base', ['libinternal.so.0']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => '.gomp_critical_user_foo@Base',
+ minver => '2.0', dep_id => 0, deprecated => 0,
+ tags => { 'allow-internal' => undef },
+ tagorder => [ 'allow-internal' ]),
+ 'internal gomp symbol included via symbol tag');
+
+$sym = $sym_file->lookup_symbol('__aeabi_lcmp@GCC_3.0', ['libinternal.so.0']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => '__aeabi_lcmp@GCC_3.0',
+ minver => '3.0', dep_id => 0, deprecated => 0,
+ tags => { 'allow-internal' => undef },
+ tagorder => [ 'allow-internal' ]),
+ 'internal known aeabi symbol included via symbol tag');
+
+$sym = $sym_file->lookup_symbol('__aeabi_unknown@GCC_4.0', ['libinternal.so.0']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => '__aeabi_unknown@GCC_4.0',
+ minver => '4.0', dep_id => 0, deprecated => 0,
+ tags => { 'allow-internal' => undef },
+ tagorder => [ 'allow-internal' ]),
+ 'internal unknown aeabi symbol omitted via symbol tag');
+
+# Include internal symbols using the Allow-Internal-Symbol-Groups field
+$sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/symbols.internal-allow-groups");
+$sym_file->merge_symbols($obj, '100.MISSING');
+
+$sym = $sym_file->lookup_symbol('symbol@Base', ['libinternal.so.0']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol@Base',
+ minver => '1.0', dep_id => 0, deprecated => 0),
+ 'symbol unaffected w/o including internal symbols');
+
+$sym = $sym_file->lookup_symbol('.gomp_critical_user_foo@Base', ['libinternal.so.0']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => '.gomp_critical_user_foo@Base',
+ minver => '2.0', dep_id => 0, deprecated => 0),
+ 'internal gomp symbol included via library field');
+
+$sym = $sym_file->lookup_symbol('__aeabi_lcmp@GCC_3.0', ['libinternal.so.0']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => '__aeabi_lcmp@GCC_3.0',
+ minver => '3.0', dep_id => 0, deprecated => 0),
+ 'internal known aeabi symbol included via library field');
+
+$sym = $sym_file->lookup_symbol('__aeabi_unknown@GCC_4.0', ['libinternal.so.0']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => '__aeabi_unknown@GCC_4.0',
+ minver => '4.0', dep_id => 0, deprecated => 0),
+ 'internal unknown aeabi symbol included via library field');
+
+
+# Test include mechanism of SymbolFile
+$sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/symbols.include-1");
+
+$sym = $sym_file->lookup_symbol('symbol_before@Base', ['libfake.so.1']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol_before@Base',
+ minver => '0.9', dep_id => 0, deprecated => 0),
+ 'symbol before include not lost');
+
+$sym = $sym_file->lookup_symbol('symbol_after@Base', ['libfake.so.1']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol_after@Base',
+ minver => '1.1', dep_id => 0, deprecated => 0),
+ 'symbol after include not lost');
+
+$sym = $sym_file->lookup_symbol('symbol1_fake1@Base', ['libfake.so.1']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol1_fake1@Base',
+ minver => '1.0', dep_id => 0, deprecated => 0),
+ 'overrides order with #include');
+
+$sym = $sym_file->lookup_symbol('symbol3_fake1@Base', ['libfake.so.1']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol3_fake1@Base',
+ minver => '0', dep_id => 0, deprecated => 0),
+ 'overrides order with #include');
+
+is($sym_file->get_smallest_version('libfake.so.1'), '0',
+ 'get_smallest_version with null version');
+
+$sym = $sym_file->lookup_symbol('symbol_in_libdivert@Base', ['libdivert.so.1']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol_in_libdivert@Base',
+ minver => '1.0~beta1', dep_id => 0, deprecated => 0),
+ '#include can change current object');
+
+$sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/symbols.include-2");
+
+$sym = $sym_file->lookup_symbol('symbol1_fake2@Base', ['libfake.so.1']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol1_fake2@Base',
+ minver => '1.0', dep_id => 1, deprecated => 0),
+ 'overrides order with circular #include');
+
+is($sym_file->get_smallest_version('libfake.so.1'), '1.0',
+ 'get_smallest_version');
+
+my $io_data;
+my $io;
+
+# Check dump output
+open $io, '>', \$io_data or die "cannot open io string\n";
+$sym_file->output($io, package => 'libfake1');
+is($io_data,
+'libfake.so.1 libfake1 #MINVER#
+| libvirtualfake
+* Build-Depends-Package: libfake-dev
+ symbol1_fake2@Base 1.0 1
+ symbol2_fake2@Base 1.0
+ symbol3_fake2@Base 1.1
+', "Dump of $datadir/symbols.include-2");
+
+
+# Check parsing of objdump output on ia64 (local symbols
+# without versions and with visibility attribute)
+$obj = Dpkg::Shlibs::Objdump::Object->new;
+
+open $objdump, '<', "$datadir/objdump.glib-ia64"
+ or die "$datadir/objdump.glib-ia64: $!";
+$obj->parse_objdump_output($objdump);
+close $objdump;
+ok($obj->is_public_library(), 'glib-ia64 is a public library');
+ok(!$obj->is_executable(), 'glib-ia64 is not an executable');
+
+$sym = $obj->get_symbol('IA__g_free');
+is_deeply( $sym, { name => 'IA__g_free', version => '',
+ soname => 'libglib-2.0.so.0', objid => 'libglib-2.0.so.0',
+ section => '.text', dynamic => 1,
+ debug => '', type => 'F', weak => '',
+ local => 1, global => '', visibility => 'hidden',
+ hidden => '', defined => 1 },
+ 'symbol with visibility without version' );
+
+# Check parsing of objdump output when symbol names contain spaces
+$obj = Dpkg::Shlibs::Objdump::Object->new;
+
+open $objdump, '<', "$datadir/objdump.spacesyms"
+ or die "$datadir/objdump.spacesyms: $!";
+$obj->parse_objdump_output($objdump);
+close $objdump;
+
+sub check_spacesym {
+ my ($name, $version, $visibility) = @_;
+
+ $visibility //= '';
+ $sym = $obj->get_symbol($name . "@" . $version);
+ is_deeply($sym, { name => $name, version => $version,
+ soname => 'libspacesyms.so.1',
+ objid => 'libspacesyms.so.1',
+ section => '.text', dynamic => 1,
+ debug => '', type => 'F', weak => '',
+ local => '', global => 1, visibility => $visibility,
+ hidden => '', defined => 1 }, $name);
+ ok(defined $obj->{dynrelocs}{$name . "@@" . $version},
+ "dynreloc found for $name");
+}
+
+check_spacesym('symdefaultvernospacedefault', 'Base');
+check_spacesym('symdefaultvernospaceprotected', 'Base', 'protected');
+check_spacesym('symlongvernospacedefault', 'VERY_LONG_VERSION_1');
+check_spacesym('symlongvernospaceprotected', 'VERY_LONG_VERSION_1', 'protected');
+check_spacesym('symshortvernospacedefault', 'V1');
+check_spacesym('symshortvernospaceprotected', 'V1', 'protected');
+check_spacesym('symdefaultverSPA CEdefault', 'Base');
+check_spacesym('symdefaultverSPA CEprotected', 'Base', 'protected');
+check_spacesym('symlongverSPA CEdefault', 'VERY_LONG_VERSION_1');
+check_spacesym('symlongverSPA CEprotected', 'VERY_LONG_VERSION_1', 'protected');
+check_spacesym('symshortverSPA CEdefault', 'V1');
+check_spacesym('symshortverSPA CEprotected', 'V1', 'protected');
+
+####### Test symbol tagging support ######
+
+# Parsing/dumping
+# Template mode
+$sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/basictags.symbols", arch => 'amd64');
+save_load_test($sym_file, 'template save -> load', template_mode => 1);
+
+# Dumping in non-template mode (amd64) (test for arch tags)
+open $io, '>', \$io_data or die "cannot open io string\n";
+$sym_file->output($io);
+is($io_data,
+'libbasictags.so.1 libbasictags1 #MINVER#
+| libbasictags1 (>= 1.1)
+ symbol11_optional@Base 1.1 1
+ symbol21_amd64@Base 2.1
+ symbol25_64@Base 2.5
+ symbol26_little@Base 2.6
+ symbol31_randomtag@Base 3.1
+ symbol51_untagged@Base 5.1
+', 'template vs. non-template on amd64');
+
+# Dumping in non-template mode (mips) (test for arch tags)
+open $io, '>', \$io_data or die "cannot open io string\n";
+$sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/basictags.symbols", arch => 'mips');
+$sym_file->output($io);
+is($io_data,
+'libbasictags.so.1 libbasictags1 #MINVER#
+| libbasictags1 (>= 1.1)
+ symbol11_optional@Base 1.1 1
+ symbol23_mips@Base 2.3
+ symbol24_32@Base 2.4
+ symbol27_big@Base 2.7
+ symbol31_randomtag@Base 3.1
+ symbol42_mips_and_optional@Base 4.2
+ symbol51_untagged@Base 5.1
+', 'template vs. non-template on mips');
+
+# Dumping in non-template mode (i386) (test for arch tags)
+open $io, '>', \$io_data or die "cannot open io string\n";
+$sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/basictags.symbols", arch => 'i386');
+$sym_file_dup = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/basictags.symbols", arch => 'i386');
+$sym_file->output($io);
+is($io_data,
+'libbasictags.so.1 libbasictags1 #MINVER#
+| libbasictags1 (>= 1.1)
+ symbol11_optional@Base 1.1 1
+ symbol22_i386@Base 2.2
+ symbol24_32@Base 2.4
+ symbol26_little@Base 2.6
+ symbol28_little_32@Base 2.8
+ symbol31_randomtag@Base 3.1
+ symbol41_i386_and_optional@Base 4.1
+ symbol51_untagged@Base 5.1
+', 'template vs. non-template on i386');
+
+ok (defined $sym_file->{objects}{'libbasictags.so.1'}{syms}{'symbol21_amd64@Base'},
+ 'syms keys are symbol names without quotes');
+
+# Preload objdumps
+my $tags_obj_i386 = Dpkg::Shlibs::Objdump::Object->new();
+open $objdump, '<', "$datadir/objdump.basictags-i386"
+ or die "$datadir/objdump.basictags-i386: $!";
+$tags_obj_i386->parse_objdump_output($objdump);
+close $objdump;
+$sym_file->merge_symbols($tags_obj_i386, '100.MISSING');
+is_deeply($sym_file, $sym_file_dup, 'is objdump.basictags-i386 and basictags.symbols in sync');
+
+my $tags_obj_amd64 = Dpkg::Shlibs::Objdump::Object->new();
+open $objdump, '<', "$datadir/objdump.basictags-amd64"
+ or die "$datadir/objdump.basictags-amd64: $!";
+$tags_obj_amd64->parse_objdump_output($objdump);
+close $objdump;
+
+# Merge/get_{new,lost} tests for optional tag:
+# - disappeared
+my $symbol11 = $tags_obj_i386->get_symbol('symbol11_optional@Base');
+delete $tags_obj_i386->{dynsyms}{'symbol11_optional@Base'};
+$sym_file->merge_symbols($tags_obj_i386, '100.MISSING');
+
+$sym = $sym_file->lookup_symbol('symbol11_optional@Base', ['libbasictags.so.1'], 1);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol11_optional@Base',
+ symbol_templ => 'symbol11_optional@Base',
+ minver => '1.1', dep_id => 1, deprecated => '100.MISSING',
+ tags => { optional => undef }, tagorder => [ 'optional' ]),
+ 'disappeared optional symbol gets deprecated');
+
+$sym_file->merge_symbols($tags_obj_i386, '101.MISSING');
+$sym = $sym_file->lookup_symbol('symbol11_optional@Base', ['libbasictags.so.1'], 1);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol11_optional@Base',
+ symbol_templ => 'symbol11_optional@Base',
+ minver => '1.1', dep_id => 1, deprecated => '101.MISSING',
+ tags => { optional => undef }, tagorder => [ 'optional' ]),
+ 'deprecated text of MISSING optional symbol gets rebumped each merge');
+
+is( scalar($sym_file->get_lost_symbols($sym_file_dup)), 0, 'missing optional symbol is not LOST');
+
+# - reappeared (undeprecate, minver should be 1.1, not 100.MISSED)
+$tags_obj_i386->add_dynamic_symbol($symbol11);
+$sym_file->merge_symbols($tags_obj_i386, '100.MISSING');
+$sym = $sym_file->lookup_symbol('symbol11_optional@Base', ['libbasictags.so.1']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol11_optional@Base',
+ symbol_templ => 'symbol11_optional@Base',
+ minver => '1.1', dep_id => 1, deprecated => 0,
+ tags => { optional => undef }, tagorder => [ 'optional' ]),
+ 'reappeared optional symbol gets undeprecated + minver');
+is( scalar($sym_file->get_lost_symbols($sym_file_dup) +
+ $sym_file->get_new_symbols($sym_file_dup)), 0, 'reappeared optional symbol: neither NEW nor LOST');
+
+# Merge/get_{new,lost} tests for arch tag:
+# - arch specific appears on wrong arch: 'arch' tag should be removed
+my $symbol21 = $tags_obj_amd64->get_symbol('symbol21_amd64@Base');
+$tags_obj_i386->add_dynamic_symbol($symbol21);
+$sym_file->merge_symbols($tags_obj_i386, '100.MISSING');
+$sym = $sym_file->lookup_symbol('symbol21_amd64@Base', ['libbasictags.so.1']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol21_amd64@Base',
+ symbol_templ => 'symbol21_amd64@Base', symbol_quoted => "'",
+ minver => '2.1', dep_id => 0, deprecated => 0),
+ 'symbol appears on foreign arch, arch tag should be removed');
+@tmp = map { $_->{symbol}->get_symbolname() } $sym_file->get_new_symbols($sym_file_dup);
+is_deeply( \@tmp, [ 'symbol21_amd64@Base' ], 'symbol from foreign arch is NEW');
+is( $sym->get_symbolspec(1), ' symbol21_amd64@Base 2.1', 'no tags => no quotes in the symbol name' );
+
+# - arch specific symbol disappears
+delete $tags_obj_i386->{dynsyms}{'symbol22_i386@Base'};
+delete $tags_obj_i386->{dynsyms}{'symbol24_32@Base'};
+delete $tags_obj_i386->{dynsyms}{'symbol26_little@Base'};
+delete $tags_obj_i386->{dynsyms}{'symbol28_little_32@Base'};
+delete $tags_obj_i386->{dynsyms}{'symbol41_i386_and_optional@Base'};
+$sym_file->merge_symbols($tags_obj_i386, '100.MISSING');
+
+$sym = $sym_file->lookup_symbol('symbol22_i386@Base', ['libbasictags.so.1'], 1);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol22_i386@Base',
+ symbol_templ => 'symbol22_i386@Base',
+ minver => '2.2', dep_id => 0, deprecated => '100.MISSING',
+ tags => { arch => '!amd64 !ia64 !mips' },
+ tagorder => [ 'arch' ]),
+ 'disappeared arch specific symbol gets deprecated');
+$sym = $sym_file->lookup_symbol('symbol24_32@Base', ['libbasictags.so.1'], 1);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol24_32@Base',
+ symbol_templ => 'symbol24_32@Base',
+ minver => '2.4', dep_id => 0, deprecated => '100.MISSING',
+ tags => { 'arch-bits' => '32' },
+ tagorder => [ 'arch-bits' ]),
+ 'disappeared arch bits specific symbol gets deprecated');
+$sym = $sym_file->lookup_symbol('symbol26_little@Base', ['libbasictags.so.1'], 1);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol26_little@Base',
+ symbol_templ => 'symbol26_little@Base',
+ minver => '2.6', dep_id => 0, deprecated => '100.MISSING',
+ tags => { 'arch-endian' => 'little' },
+ tagorder => [ 'arch-endian' ]),
+ 'disappeared arch endian specific symbol gets deprecated');
+$sym = $sym_file->lookup_symbol('symbol28_little_32@Base', ['libbasictags.so.1'], 1);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol28_little_32@Base',
+ symbol_templ => 'symbol28_little_32@Base',
+ minver => '2.8', dep_id => 0, deprecated => '100.MISSING',
+ tags => { 'arch-bits' => '32', 'arch-endian' => 'little' },
+ tagorder => [ 'arch-bits', 'arch-endian' ]),
+ 'disappeared arch bits and endian specific symbol gets deprecated');
+$sym = $sym_file->lookup_symbol('symbol41_i386_and_optional@Base', ['libbasictags.so.1'], 1);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol41_i386_and_optional@Base',
+ symbol_templ => 'symbol41_i386_and_optional@Base',
+ symbol_quoted => '"',
+ minver => '4.1', dep_id => 0, deprecated => '100.MISSING',
+ tags => { arch => 'i386', optional => 'reason' },
+ tagorder => [ 'arch', 'optional' ]),
+ 'disappeared optional arch specific symbol gets deprecated');
+@tmp = sort map { $_->{symbol}->get_symbolname() } $sym_file->get_lost_symbols($sym_file_dup);
+is_deeply(\@tmp, [ 'symbol22_i386@Base', 'symbol24_32@Base',
+ 'symbol26_little@Base', 'symbol28_little_32@Base' ],
+ "missing arch specific is LOST, but optional arch specific isn't");
+
+# Tests for tagged #includes
+$sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/symbols.include-3", arch => 'i386');
+$sym = $sym_file->lookup_symbol('symbol2_fake1@Base', ['libbasictags.so.2']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol2_fake1@Base',
+ minver => '1.0',
+ tags => { optional => undef, 'random tag' => 'random value' },
+ tagorder => [ 'optional', 'random tag' ] ),
+ 'symbols from #included file inherits tags');
+$sym = $sym_file->lookup_symbol('symbol41_i386_and_optional@Base', ['libbasictags.so.1']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol41_i386_and_optional@Base',
+ symbol_templ => 'symbol41_i386_and_optional@Base',
+ symbol_quoted => '"',
+ minver => '4.1',
+ tags => { optional => 'reason', t => 'v', arch => 'i386' },
+ tagorder => [ 'optional', 't', 'arch' ]),
+ 'symbols in #included file can override tag values');
+$sym = $sym_file->lookup_symbol('symbol51_untagged@Base', ['libbasictags.so.1']);
+is_deeply($sym, Dpkg::Shlibs::Symbol->new(symbol => 'symbol51_untagged@Base',
+ minver => '5.1',
+ tags => { optional => 'from parent', t => 'v' },
+ tagorder => [ 'optional', 't' ]),
+ 'symbols are properly cloned when #including');
+
+# Test Symbol::clone()
+$sym = Dpkg::Shlibs::Symbol->new(symbol => 'foobar', testfield => 1, teststruct => { foo => 1 });
+$tmp = $sym->clone();
+$tmp->{teststruct}{foo} = 3;
+$tmp->{testfield} = 3;
+is ( $sym->{teststruct}{foo}, 1, 'original field "foo" not changed' );
+is ( $sym->{testfield}, 1, 'original field "testfield" not changed' );
+
+############ Test symbol patterns ###########
+
+SKIP: {
+
+skip 'c++filt not available', 41 if not can_run('c++filt');
+
+sub load_patterns_obj {
+ $obj = Dpkg::Shlibs::Objdump::Object->new();
+ open $objdump, '<', "$datadir/objdump.patterns"
+ or die "$datadir/objdump.patterns: $!";
+ $obj->parse_objdump_output($objdump);
+ close $objdump;
+ return $obj;
+}
+
+sub load_patterns_symbols {
+ $sym_file = Dpkg::Shlibs::SymbolFile->new(file => "$datadir/patterns.symbols");
+ return $sym_file;
+}
+
+load_patterns_obj();
+$sym_file_dup = load_patterns_symbols();
+load_patterns_symbols();
+
+save_load_test($sym_file, 'save -> load test of patterns template', template_mode => 1);
+
+isnt( $sym_file->get_patterns('libpatterns.so.1') , 0,
+ 'patterns.symbols has patterns');
+
+$sym_file->merge_symbols($obj, '100.MISSING');
+
+@tmp = map { $_->get_symbolname() } $sym_file->get_lost_symbols($sym_file_dup);
+is_deeply(\@tmp, [], 'no LOST symbols if all patterns matched.');
+@tmp = map { $_->get_symbolname() } $sym_file->get_new_symbols($sym_file_dup);
+is_deeply(\@tmp, [], 'no NEW symbols if all patterns matched.');
+
+# Pattern resolution order: aliases (c++, symver), generic
+$sym = $sym_file->lookup_symbol('SYMVER_1@SYMVER_1', 'libpatterns.so.1');
+is($sym->{minver}, '1', 'specific SYMVER_1 symbol');
+
+$sym = $sym_file->lookup_symbol('_ZN3NSB6Symver14symver_method1Ev@SYMVER_1', 'libpatterns.so.1');
+is($sym->{minver}, '1.method1', 'specific symbol preferred over pattern');
+
+$sym = $sym_file->lookup_symbol('_ZN3NSB6Symver14symver_method2Ev@SYMVER_1', 'libpatterns.so.1');
+is($sym->{minver}, '1.method2', 'c++ alias pattern preferred over generic pattern');
+is($sym->get_pattern()->get_symbolname(), 'NSB::Symver::symver_method2()@SYMVER_1',
+ 'c++ alias pattern preferred over generic pattern, on demangled name');
+
+$sym = $sym_file->lookup_symbol('_ZN3NSB6SymverD1Ev@SYMVER_1', 'libpatterns.so.1');
+is ( $sym->{minver}, '1.generic', 'generic (c++ & symver) pattern covers the rest (destructor)' );
+ok($sym->get_pattern()->equals($sym_file->create_symbol('(c++|symver)SYMVER_1 1.generic')),
+ 'generic (c++ & symver) pattern covers the rest (destructor), compared');
+
+# Test old style wildcard support
+load_patterns_symbols();
+$sym = $sym_file->create_symbol('*@SYMVEROPT_2 2');
+ok($sym->is_optional(), 'Old style wildcard is optional');
+is($sym->get_alias_type(), 'symver', 'old style wildcard is a symver pattern');
+is($sym->get_symbolname(), 'SYMVEROPT_2', 'wildcard pattern got renamed');
+
+$pat = $sym_file->lookup_pattern('(symver|optional)SYMVEROPT_2', 'libpatterns.so.1');
+$sym->{symbol_templ} = $pat->{symbol_templ};
+is_deeply($pat, $sym, 'old style wildcard is the same as (symver|optional)');
+
+# Get rid of all SymverOptional symbols
+foreach my $tmp (keys %{$obj->{dynsyms}}) {
+ delete $obj->{dynsyms}{$tmp} if ($tmp =~ /SymverOptional/);
+}
+$sym_file->merge_symbols($obj, '100.MISSING');
+is_deeply ( [ map { $_->get_symbolname() } $pat->get_pattern_matches() ],
+ [], 'old style wildcard matches nothing.');
+is($pat->{deprecated}, '100.MISSING', 'old style wildcard gets deprecated.');
+@tmp = map { $_->{symbol}->get_symbolname() } $sym_file->get_lost_symbols($sym_file_dup);
+is_deeply(\@tmp, [], 'but old style wildcard is not LOST.');
+
+# 'Internal' pattern covers all internal symbols
+load_patterns_obj();
+@tmp = grep { $_->get_symbolname() =~ /Internal/ } $sym_file->get_symbols('libpatterns.so.1');
+$sym = $sym_file->create_symbol('(regex|c++)^_Z(T[ISV])?N3NSA6ClassA8Internal.*@Base$ 1.internal');
+$pat = $sym_file->lookup_pattern($sym, 'libpatterns.so.1');
+is_deeply ([ sort $pat->get_pattern_matches() ], [ sort @tmp ],
+ 'Pattern covers all internal symbols');
+is($tmp[0]->{minver}, '1.internal', 'internal pattern covers first symbol');
+
+# Lookup private pattern
+my @private_symnames = sort qw(
+ _ZN3NSA6ClassA7Private11privmethod1Ei@Base
+ _ZN3NSA6ClassA7Private11privmethod2Ei@Base
+ _ZN3NSA6ClassA7PrivateC1Ev@Base
+ _ZN3NSA6ClassA7PrivateC2Ev@Base
+ _ZN3NSA6ClassA7PrivateD0Ev@Base
+ _ZN3NSA6ClassA7PrivateD1Ev@Base
+ _ZN3NSA6ClassA7PrivateD2Ev@Base
+ _ZTIN3NSA6ClassA7PrivateE@Base
+ _ZTSN3NSA6ClassA7PrivateE@Base
+ _ZTVN3NSA6ClassA7PrivateE@Base
+);
+$sym = $sym_file->create_symbol('(c++|regex|optional)NSA::ClassA::Private(::.*)?@Base 1');
+$pat = $sym_file->lookup_pattern($sym, 'libpatterns.so.1');
+isnt( $pat, undef, 'pattern for private class has been found' );
+is_deeply( [ sort map { $_->get_symbolname() } $pat->get_pattern_matches() ],
+ \@private_symnames, 'private pattern matched expected symbols');
+ok( ($pat->get_pattern_matches())[0]->is_optional(),
+ 'private symbol is optional like its pattern');
+ok( $sym_file->lookup_symbol(($pat->get_pattern_matches())[0], 'libpatterns.so.1'),
+ 'lookup_symbol() finds symbols matched by pattern (after merge)');
+
+# Get rid of a private symbol, it should not be lost
+delete $obj->{dynsyms}{$private_symnames[0]};
+load_patterns_symbols();
+$sym_file->merge_symbols($obj, '100.MISSING');
+
+$pat = $sym_file->lookup_pattern($sym, 'libpatterns.so.1');
+@tmp = map { $_->{symbol}->get_symbolname() } $sym_file->get_lost_symbols($sym_file_dup);
+is_deeply(\@tmp, [], 'no LOST symbols when got rid of patterned optional symbol.');
+ok(!$pat->{deprecated}, 'there are still matches, pattern is not deprecated.');
+
+# Get rid of all private symbols, the pattern should be deprecated.
+foreach my $tmp (@private_symnames) {
+ delete $obj->{dynsyms}{$tmp};
+}
+load_patterns_symbols();
+$sym_file->merge_symbols($obj, '100.MISSING');
+
+$pat = $sym_file->lookup_pattern($sym, 'libpatterns.so.1', 1);
+@tmp = $sym_file->get_lost_symbols($sym_file_dup);
+is_deeply( \@tmp, [ ],
+ 'All private symbols gone, but pattern is not LOST because it is optional.');
+is( $pat->{deprecated}, '100.MISSING',
+ 'All private symbols gone - pattern deprecated.');
+
+# Internal symbols. All covered by the pattern?
+@tmp = grep { $_->get_symbolname() =~ /Internal/ } values %{$sym_file->{objects}{'libpatterns.so.1'}{syms}};
+$sym = $sym_file->create_symbol('(regex|c++)^_Z(T[ISV])?N3NSA6ClassA8Internal.*@Base$ 1.internal');
+$pat = $sym_file->lookup_pattern($sym, 'libpatterns.so.1');
+is_deeply ([ sort $pat->get_pattern_matches() ], [ sort @tmp ],
+ 'Pattern covers all internal symbols');
+is($tmp[0]->{minver}, '1.internal', 'internal pattern covers first symbol');
+
+# Delete matches of the non-optional pattern
+$sym = $sym_file->create_symbol('(c++)"non-virtual thunk to NSB::ClassD::generate_vt(char const*) const@Base" 1');
+$pat = $sym_file->lookup_pattern($sym, 'libpatterns.so.1');
+isnt( $pat, undef, 'lookup_pattern() finds alias-based pattern' );
+
+is(scalar($pat->get_pattern_matches()), 2, 'two matches for the generate_vt pattern');
+foreach my $tmp ($pat->get_pattern_matches()) {
+ delete $obj->{dynsyms}{$tmp->get_symbolname()};
+}
+load_patterns_symbols();
+$sym_file->merge_symbols($obj, '100.MISSING');
+
+$pat = $sym_file->lookup_pattern($sym, 'libpatterns.so.1', 1);
+@tmp = map { scalar $sym_file->lookup_pattern($_->{symbol}, 'libpatterns.so.1', 1) }
+ $sym_file->get_lost_symbols($sym_file_dup);
+is_deeply(\@tmp, [ $pat ], 'No matches - generate_vt() pattern is LOST.');
+is( $pat->{deprecated}, '100.MISSING',
+ 'No matches - generate_vt() pattern is deprecated.');
+
+# Pattern undeprecation when matches are discovered
+load_patterns_obj();
+load_patterns_symbols();
+
+$pat = $sym_file_dup->lookup_pattern($sym, 'libpatterns.so.1');
+$pat->{deprecated} = '0.1-1';
+$pat = $sym_file->lookup_pattern($sym, 'libpatterns.so.1');
+$pat->{deprecated} = '0.1-1';
+
+$sym_file->merge_symbols($obj, '100.FOUND');
+ok( ! $pat->{deprecated},
+ 'Previously deprecated pattern with matches got undeprecated');
+is( $pat->{minver}, '100.FOUND',
+ 'Previously deprecated pattern with matches got minver bumped');
+@tmp = map { $_->{symbol}->get_symbolspec(1) } $sym_file->get_new_symbols($sym_file_dup);
+is_deeply( \@tmp, [ $pat->get_symbolspec(1) ],
+ 'Previously deprecated pattern with matches is NEW. Matches themselves are not NEW.');
+foreach my $sym ($pat->get_pattern_matches()) {
+ ok(!$sym->{deprecated}, $sym->get_symbolname() . ': not deprecated');
+ is($sym->{minver}, '100.FOUND', $sym->get_symbolname() . ': version bumped');
+}
+
+}
diff --git a/scripts/t/Dpkg_Shlibs/basictags.c b/scripts/t/Dpkg_Shlibs/basictags.c
new file mode 100644
index 0000000..4f1d337
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/basictags.c
@@ -0,0 +1,63 @@
+/*
+ * $ gcc -shared -fPIC -Wl,-soname -Wl,libbasictags.so.1 \
+ * -o libbasictags.so.1 -DAMD64 basictags.c
+ * $ objdump -wfpTR libbasictags.so.1 > objdump.basictags-amd64
+ * $ gcc -shared -fPIC -Wl,-soname -Wl,libbasictags.so.1 \
+ * -o libbasictags.so.1 -DI386 basictags.c
+ * $ objdump -wfpTR libbasictags.so.1 > objdump.basictags-i386
+ * $ gcc -shared -fPIC -Wl,-soname -Wl,libbasictags.so.1 \
+ * -o libbasictags.so.1 -DMIPS basictags.c
+ * $ objdump -wfpTR libbasictags.so.1 > objdump.basictags-mips
+ */
+
+void symbol11_optional(void);
+void symbol11_optional(void) {}
+
+#if defined(AMD64)
+void symbol21_amd64(void);
+void symbol21_amd64(void) {}
+#elif defined(I386)
+void symbol22_i386(void);
+void symbol22_i386(void) {}
+#elif defined(MIPS)
+void symbol23_mips(void);
+void symbol23_mips(void) {}
+#endif
+
+#if defined(AMD64)
+void symbol25_64(void);
+void symbol25_64(void) {}
+#else
+void symbol24_32(void);
+void symbol24_32(void) {}
+#endif
+
+#if defined(MIPS)
+void symbol27_big(void);
+void symbol27_big(void) {}
+#else
+void symbol26_little(void);
+void symbol26_little(void) {}
+#endif
+
+#if defined(I386)
+void symbol28_little_32(void);
+void symbol28_little_32(void) {}
+#endif
+
+void symbol31_randomtag(void);
+void symbol31_randomtag(void) {}
+
+/* (arch=i386|optional)symbol41_i386_and_optional@Base */
+#if defined(I386)
+void symbol41_i386_and_optional(void);
+void symbol41_i386_and_optional(void) {}
+#endif
+/* (arch=mips|optional)symbol42_i386_and_optional@Base */
+#if defined(MIPS)
+void symbol42_mips_and_optional(void);
+void symbol42_mips_and_optional(void) {}
+#endif
+
+void symbol51_untagged(void);
+void symbol51_untagged(void) {}
diff --git a/scripts/t/Dpkg_Shlibs/basictags.symbols b/scripts/t/Dpkg_Shlibs/basictags.symbols
new file mode 100644
index 0000000..af1dfc6
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/basictags.symbols
@@ -0,0 +1,15 @@
+libbasictags.so.1 libbasictags1 #MINVER#
+| libbasictags1 (>= 1.1)
+ (optional)symbol11_optional@Base 1.1 1
+ (arch=amd64 ia64 alpha)'symbol21_amd64@Base' 2.1
+ (arch=!amd64 !ia64 !mips)symbol22_i386@Base 2.2
+ (arch=!amd64 !ia64 !i386)symbol23_mips@Base 2.3
+ (arch-bits=32)symbol24_32@Base 2.4
+ (arch-bits=64)symbol25_64@Base 2.5
+ (arch-endian=little)symbol26_little@Base 2.6
+ (arch-endian=big)symbol27_big@Base 2.7
+ (arch-bits=32|arch-endian=little)symbol28_little_32@Base 2.8
+ (randomtagname=randomtagvalue)symbol31_randomtag@Base 3.1
+ (arch=i386|optional=reason)"symbol41_i386_and_optional@Base" 4.1
+ (arch=mips|optional=reason)"symbol42_mips_and_optional@Base" 4.2
+ symbol51_untagged@Base 5.1
diff --git a/scripts/t/Dpkg_Shlibs/ld.so.conf b/scripts/t/Dpkg_Shlibs/ld.so.conf
new file mode 100644
index 0000000..cb7a19c
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/ld.so.conf
@@ -0,0 +1,9 @@
+# Comment and empty line
+
+# Paths
+/nonexistent32
+/nonexistent/lib64
+
+include /nonexistent/*.conf
+include t/Dpkg_Shlibs/ld.so.conf.d/*.conf
+
diff --git a/scripts/t/Dpkg_Shlibs/ld.so.conf.d/inf_recurse.conf b/scripts/t/Dpkg_Shlibs/ld.so.conf.d/inf_recurse.conf
new file mode 100644
index 0000000..fbb83d8
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/ld.so.conf.d/inf_recurse.conf
@@ -0,0 +1 @@
+include t/Dpkg_Shlibs/ld.so.conf
diff --git a/scripts/t/Dpkg_Shlibs/ld.so.conf.d/normal.conf b/scripts/t/Dpkg_Shlibs/ld.so.conf.d/normal.conf
new file mode 100644
index 0000000..26e8b98
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/ld.so.conf.d/normal.conf
@@ -0,0 +1 @@
+/usr/local/lib/
diff --git a/scripts/t/Dpkg_Shlibs/ld.so.conf.d/recursive.conf b/scripts/t/Dpkg_Shlibs/ld.so.conf.d/recursive.conf
new file mode 100644
index 0000000..702e41e
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/ld.so.conf.d/recursive.conf
@@ -0,0 +1 @@
+include t/Dpkg_Shlibs/ld.so.conf_2
diff --git a/scripts/t/Dpkg_Shlibs/ld.so.conf_2 b/scripts/t/Dpkg_Shlibs/ld.so.conf_2
new file mode 100644
index 0000000..8afcaa5
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/ld.so.conf_2
@@ -0,0 +1 @@
+/nonexistent/lib128
diff --git a/scripts/t/Dpkg_Shlibs/objdump.basictags-amd64 b/scripts/t/Dpkg_Shlibs/objdump.basictags-amd64
new file mode 100644
index 0000000..aa53376
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.basictags-amd64
@@ -0,0 +1,78 @@
+
+./t/Dpkg_Shlibs/libobjdump.basictags-amd64.so: file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x00000450
+
+Program Header:
+ LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
+ filesz 0x000006d0 memsz 0x000006d0 flags r-x
+ LOAD off 0x00000f18 vaddr 0x00001f18 paddr 0x00001f18 align 2**12
+ filesz 0x000000f8 memsz 0x000000fc flags rw-
+ DYNAMIC off 0x00000f20 vaddr 0x00001f20 paddr 0x00001f20 align 2**2
+ filesz 0x000000d0 memsz 0x000000d0 flags rw-
+ NOTE off 0x00000114 vaddr 0x00000114 paddr 0x00000114 align 2**2
+ filesz 0x00000024 memsz 0x00000024 flags r--
+EH_FRAME off 0x000005b8 vaddr 0x000005b8 paddr 0x000005b8 align 2**2
+ filesz 0x0000004c memsz 0x0000004c flags r--
+ STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
+ filesz 0x00000000 memsz 0x00000000 flags rw-
+ RELRO off 0x00000f18 vaddr 0x00001f18 paddr 0x00001f18 align 2**0
+ filesz 0x000000e8 memsz 0x000000e8 flags r--
+
+Dynamic Section:
+ NEEDED libc.so.6
+ SONAME libbasictags.so.1
+ INIT 0x00000404
+ FINI 0x000005a4
+ INIT_ARRAY 0x00001f18
+ INIT_ARRAYSZ 0x00000004
+ FINI_ARRAY 0x00001f1c
+ FINI_ARRAYSZ 0x00000004
+ GNU_HASH 0x00000138
+ STRTAB 0x00000288
+ SYMTAB 0x00000188
+ STRSZ 0x00000103
+ SYMENT 0x00000010
+ PLTGOT 0x00002000
+ REL 0x000003cc
+ RELSZ 0x00000038
+ RELENT 0x00000008
+ VERNEED 0x000003ac
+ VERNEEDNUM 0x00000001
+ VERSYM 0x0000038c
+ RELCOUNT 0x00000003
+
+Version References:
+ required from libc.so.6:
+ 0x09691f73 0x00 02 GLIBC_2.1.3
+
+DYNAMIC SYMBOL TABLE:
+00000000 w D *UND* 00000000 _ITM_deregisterTMCloneTable
+00000000 w DF *UND* 00000000 GLIBC_2.1.3 __cxa_finalize
+00000000 w D *UND* 00000000 __gmon_start__
+00000000 w D *UND* 00000000 _ITM_registerTMCloneTable
+00002010 g D .data 00000000 Base _edata
+00000580 g DF .text 00000002 Base symbol26_little
+00002014 g D .bss 00000000 Base _end
+00000560 g DF .text 00000002 Base symbol21_amd64
+00002010 g D .bss 00000000 Base __bss_start
+00000570 g DF .text 00000002 Base symbol25_64
+00000404 g DF .init 00000000 Base _init
+00000590 g DF .text 00000002 Base symbol31_randomtag
+000005a4 g DF .fini 00000000 Base _fini
+000005a0 g DF .text 00000002 Base symbol51_untagged
+00000550 g DF .text 00000002 Base symbol11_optional
+
+
+DYNAMIC RELOCATION RECORDS
+OFFSET TYPE VALUE
+00001f18 R_386_RELATIVE *ABS*
+00001f1c R_386_RELATIVE *ABS*
+0000200c R_386_RELATIVE *ABS*
+00001ff0 R_386_GLOB_DAT _ITM_deregisterTMCloneTable
+00001ff4 R_386_GLOB_DAT __cxa_finalize@GLIBC_2.1.3
+00001ff8 R_386_GLOB_DAT __gmon_start__
+00001ffc R_386_GLOB_DAT _ITM_registerTMCloneTable
+
+
diff --git a/scripts/t/Dpkg_Shlibs/objdump.basictags-i386 b/scripts/t/Dpkg_Shlibs/objdump.basictags-i386
new file mode 100644
index 0000000..af0f707
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.basictags-i386
@@ -0,0 +1,80 @@
+
+./t/Dpkg_Shlibs/libobjdump.basictags-i386.so: file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x000004b0
+
+Program Header:
+ LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
+ filesz 0x00000788 memsz 0x00000788 flags r-x
+ LOAD off 0x00000f18 vaddr 0x00001f18 paddr 0x00001f18 align 2**12
+ filesz 0x000000f8 memsz 0x000000fc flags rw-
+ DYNAMIC off 0x00000f20 vaddr 0x00001f20 paddr 0x00001f20 align 2**2
+ filesz 0x000000d0 memsz 0x000000d0 flags rw-
+ NOTE off 0x00000114 vaddr 0x00000114 paddr 0x00000114 align 2**2
+ filesz 0x00000024 memsz 0x00000024 flags r--
+EH_FRAME off 0x00000638 vaddr 0x00000638 paddr 0x00000638 align 2**2
+ filesz 0x0000005c memsz 0x0000005c flags r--
+ STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
+ filesz 0x00000000 memsz 0x00000000 flags rw-
+ RELRO off 0x00000f18 vaddr 0x00001f18 paddr 0x00001f18 align 2**0
+ filesz 0x000000e8 memsz 0x000000e8 flags r--
+
+Dynamic Section:
+ NEEDED libc.so.6
+ SONAME libbasictags.so.1
+ INIT 0x00000464
+ FINI 0x00000624
+ INIT_ARRAY 0x00001f18
+ INIT_ARRAYSZ 0x00000004
+ FINI_ARRAY 0x00001f1c
+ FINI_ARRAYSZ 0x00000004
+ GNU_HASH 0x00000138
+ STRTAB 0x000002b8
+ SYMTAB 0x00000198
+ STRSZ 0x00000130
+ SYMENT 0x00000010
+ PLTGOT 0x00002000
+ REL 0x0000042c
+ RELSZ 0x00000038
+ RELENT 0x00000008
+ VERNEED 0x0000040c
+ VERNEEDNUM 0x00000001
+ VERSYM 0x000003e8
+ RELCOUNT 0x00000003
+
+Version References:
+ required from libc.so.6:
+ 0x09691f73 0x00 02 GLIBC_2.1.3
+
+DYNAMIC SYMBOL TABLE:
+00000000 w D *UND* 00000000 _ITM_deregisterTMCloneTable
+00000000 w DF *UND* 00000000 GLIBC_2.1.3 __cxa_finalize
+00000000 w D *UND* 00000000 __gmon_start__
+00000000 w D *UND* 00000000 _ITM_registerTMCloneTable
+00002010 g D .data 00000000 Base _edata
+000005e0 g DF .text 00000002 Base symbol26_little
+00002014 g D .bss 00000000 Base _end
+00000610 g DF .text 00000002 Base symbol41_i386_and_optional
+000005c0 g DF .text 00000002 Base symbol22_i386
+000005f0 g DF .text 00000002 Base symbol28_little_32
+00002010 g D .bss 00000000 Base __bss_start
+00000464 g DF .init 00000000 Base _init
+00000600 g DF .text 00000002 Base symbol31_randomtag
+000005d0 g DF .text 00000002 Base symbol24_32
+00000624 g DF .fini 00000000 Base _fini
+00000620 g DF .text 00000002 Base symbol51_untagged
+000005b0 g DF .text 00000002 Base symbol11_optional
+
+
+DYNAMIC RELOCATION RECORDS
+OFFSET TYPE VALUE
+00001f18 R_386_RELATIVE *ABS*
+00001f1c R_386_RELATIVE *ABS*
+0000200c R_386_RELATIVE *ABS*
+00001ff0 R_386_GLOB_DAT _ITM_deregisterTMCloneTable
+00001ff4 R_386_GLOB_DAT __cxa_finalize@GLIBC_2.1.3
+00001ff8 R_386_GLOB_DAT __gmon_start__
+00001ffc R_386_GLOB_DAT _ITM_registerTMCloneTable
+
+
diff --git a/scripts/t/Dpkg_Shlibs/objdump.basictags-mips b/scripts/t/Dpkg_Shlibs/objdump.basictags-mips
new file mode 100644
index 0000000..27795c4
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.basictags-mips
@@ -0,0 +1,79 @@
+
+./t/Dpkg_Shlibs/libobjdump.basictags-mips.so: file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x00000480
+
+Program Header:
+ LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
+ filesz 0x0000072c memsz 0x0000072c flags r-x
+ LOAD off 0x00000f18 vaddr 0x00001f18 paddr 0x00001f18 align 2**12
+ filesz 0x000000f8 memsz 0x000000fc flags rw-
+ DYNAMIC off 0x00000f20 vaddr 0x00001f20 paddr 0x00001f20 align 2**2
+ filesz 0x000000d0 memsz 0x000000d0 flags rw-
+ NOTE off 0x00000114 vaddr 0x00000114 paddr 0x00000114 align 2**2
+ filesz 0x00000024 memsz 0x00000024 flags r--
+EH_FRAME off 0x000005f8 vaddr 0x000005f8 paddr 0x000005f8 align 2**2
+ filesz 0x00000054 memsz 0x00000054 flags r--
+ STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
+ filesz 0x00000000 memsz 0x00000000 flags rw-
+ RELRO off 0x00000f18 vaddr 0x00001f18 paddr 0x00001f18 align 2**0
+ filesz 0x000000e8 memsz 0x000000e8 flags r--
+
+Dynamic Section:
+ NEEDED libc.so.6
+ SONAME libbasictags.so.1
+ INIT 0x00000438
+ FINI 0x000005e4
+ INIT_ARRAY 0x00001f18
+ INIT_ARRAYSZ 0x00000004
+ FINI_ARRAY 0x00001f1c
+ FINI_ARRAYSZ 0x00000004
+ GNU_HASH 0x00000138
+ STRTAB 0x000002a4
+ SYMTAB 0x00000194
+ STRSZ 0x0000011a
+ SYMENT 0x00000010
+ PLTGOT 0x00002000
+ REL 0x00000400
+ RELSZ 0x00000038
+ RELENT 0x00000008
+ VERNEED 0x000003e0
+ VERNEEDNUM 0x00000001
+ VERSYM 0x000003be
+ RELCOUNT 0x00000003
+
+Version References:
+ required from libc.so.6:
+ 0x09691f73 0x00 02 GLIBC_2.1.3
+
+DYNAMIC SYMBOL TABLE:
+00000000 w D *UND* 00000000 _ITM_deregisterTMCloneTable
+00000000 w DF *UND* 00000000 GLIBC_2.1.3 __cxa_finalize
+00000000 w D *UND* 00000000 __gmon_start__
+00000000 w D *UND* 00000000 _ITM_registerTMCloneTable
+00002010 g D .data 00000000 Base _edata
+00002014 g D .bss 00000000 Base _end
+000005d0 g DF .text 00000002 Base symbol42_mips_and_optional
+00002010 g D .bss 00000000 Base __bss_start
+00000438 g DF .init 00000000 Base _init
+000005c0 g DF .text 00000002 Base symbol31_randomtag
+000005a0 g DF .text 00000002 Base symbol24_32
+000005e4 g DF .fini 00000000 Base _fini
+000005e0 g DF .text 00000002 Base symbol51_untagged
+00000580 g DF .text 00000002 Base symbol11_optional
+00000590 g DF .text 00000002 Base symbol23_mips
+000005b0 g DF .text 00000002 Base symbol27_big
+
+
+DYNAMIC RELOCATION RECORDS
+OFFSET TYPE VALUE
+00001f18 R_386_RELATIVE *ABS*
+00001f1c R_386_RELATIVE *ABS*
+0000200c R_386_RELATIVE *ABS*
+00001ff0 R_386_GLOB_DAT _ITM_deregisterTMCloneTable
+00001ff4 R_386_GLOB_DAT __cxa_finalize@GLIBC_2.1.3
+00001ff8 R_386_GLOB_DAT __gmon_start__
+00001ffc R_386_GLOB_DAT _ITM_registerTMCloneTable
+
+
diff --git a/scripts/t/Dpkg_Shlibs/objdump.dbd-pg b/scripts/t/Dpkg_Shlibs/objdump.dbd-pg
new file mode 100644
index 0000000..c515dff
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.dbd-pg
@@ -0,0 +1,309 @@
+
+/usr/lib/perl5/auto/DBD/Pg/Pg.so: file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x000048f0
+
+Program Header:
+ LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
+ filesz 0x00020c10 memsz 0x00020c10 flags r-x
+ LOAD off 0x00021000 vaddr 0x00021000 paddr 0x00021000 align 2**12
+ filesz 0x00000c70 memsz 0x00000c74 flags rw-
+ DYNAMIC off 0x00021014 vaddr 0x00021014 paddr 0x00021014 align 2**2
+ filesz 0x000000d0 memsz 0x000000d0 flags rw-
+ STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
+ filesz 0x00000000 memsz 0x00000000 flags rw-
+
+Dynamic Section:
+ NEEDED libpq.so.5
+ NEEDED libc.so.6
+ INIT 0x3d00
+ FINI 0x1d854
+ HASH 0xb4
+ GNU_HASH 0x7e8
+ STRTAB 0x1c30
+ SYMTAB 0xbd0
+ STRSZ 0xfa4
+ SYMENT 0x10
+ PLTGOT 0x211c8
+ PLTRELSZ 0x5d8
+ PLTREL 0x11
+ JMPREL 0x3728
+ REL 0x2e20
+ RELSZ 0x908
+ RELENT 0x8
+ VERNEED 0x2de0
+ VERNEEDNUM 0x1
+ VERSYM 0x2bd4
+ RELCOUNT 0x52
+
+Version References:
+ required from libc.so.6:
+ 0x09691f73 0x00 04 GLIBC_2.1.3
+ 0x0d696911 0x00 03 GLIBC_2.1
+ 0x0d696910 0x00 02 GLIBC_2.0
+
+DYNAMIC SYMBOL TABLE:
+00000000 D *UND* 00000000 Perl_Top_ptr
+00000000 DF *UND* 00000034 GLIBC_2.0 sprintf
+00000000 DF *UND* 00000014 PQcmdStatus
+00000000 D *UND* 00000000 Perl_mg_get
+00000000 D *UND* 00000000 Perl_sv_setiv
+00000000 D *UND* 00000000 Perl_is_utf8_string
+00000000 D *UND* 00000000 Perl_sv_free
+00000000 DF *UND* 00000011 PQpass
+00000000 DF *UND* 00000191 PQputCopyEnd
+00000000 D *UND* 00000000 Perl_av_len
+00000000 D *UND* 00000000 Perl_get_sv
+00000000 D *UND* 00000000 PerlIO_printf
+00000000 D *UND* 00000000 Perl_Tstack_base_ptr
+00000000 D *UND* 00000000 Perl_newRV_noinc
+00000000 DF *UND* 000000ba lo_tell
+00000000 DF *UND* 00000058 PQconsumeInput
+00000000 w D *UND* 00000000 __gmon_start__
+00000000 w D *UND* 00000000 _Jv_RegisterClasses
+00000000 DF *UND* 00000175 PQgetResult
+00000000 D *UND* 00000000 Perl_Tstack_max_ptr
+00000000 D *UND* 00000000 Perl_av_make
+00000000 DF *UND* 0000004d PQfmod
+00000000 DF *UND* 00000024 PQprotocolVersion
+00000000 D *UND* 00000000 Perl_sv_2uv
+00000000 DF *UND* 00000021 PQsetNoticeProcessor
+00000000 DF *UND* 000000c6 GLIBC_2.0 strncpy
+00000000 DF *UND* 00000014 PQstatus
+00000000 D *UND* 00000000 Perl_Isv_yes_ptr
+00000000 DF *UND* 00000058 GLIBC_2.0 memset
+00000000 D *UND* 00000000 Perl_warn_nocontext
+00000000 D *UND* 00000000 Perl_sv_2mortal
+00000000 D *UND* 00000000 Perl_Tstack_sp_ptr
+00000000 DF *UND* 00000014 PQresultStatus
+00000000 DF *UND* 00000045 GLIBC_2.0 __strtol_internal
+00000000 DF *UND* 00000019 PQhost
+00000000 D *UND* 00000000 Perl_sv_setpv
+00000000 D *UND* 00000000 Perl_av_undef
+00000000 DF *UND* 000000e2 lo_lseek
+00000000 DF *UND* 0000004d PQftable
+00000000 D *UND* 00000000 Perl_form
+00000000 DF *UND* 00000024 PQbackendPID
+00000000 DF *UND* 00000010 PQntuples
+00000000 DF *UND* 00000099 PQoidValue
+00000000 DF *UND* 00000040 PQnotifies
+00000000 DF *UND* 0000004d PQftype
+00000000 DF *UND* 00000048 PQgetisnull
+00000000 DF *UND* 00000033 PQresultErrorField
+00000000 D *UND* 00000000 Perl_Tmarkstack_max_ptr
+00000000 DF *UND* 000000bb lo_creat
+00000000 DF *UND* 00000245 lo_export
+00000000 D *UND* 00000000 pthread_getspecific
+00000000 DF *UND* 0000005d PQexec
+00000000 DF *UND* 00000020 PQsetErrorVerbosity
+00000000 DF *UND* 00000041 PQconnectdb
+00000000 DF *UND* 0000001c PQserverVersion
+00000000 D *UND* 00000000 Perl_sv_2iv
+00000000 DF *UND* 0000003e PQuntrace
+00000000 DF *UND* 00000036 PQtrace
+00000000 D *UND* 00000000 PerlIO_findFILE
+00000000 D *UND* 00000000 Perl_av_extend
+00000000 DF *UND* 00000046 GLIBC_2.0 memcpy
+00000000 DF *UND* 000000af GLIBC_2.0 strlen
+00000000 D *UND* 00000000 Perl_sv_upgrade
+00000000 DF *UND* 00000041 PQendcopy
+00000000 D *UND* 00000000 Perl_hv_store_ent
+00000000 D *UND* 00000000 Perl_av_store
+00000000 DF *UND* 0000009e PQexecPrepared
+00000000 D *UND* 00000000 Perl_sv_setpvn
+00000000 DF *UND* 000000ce lo_read
+00000000 DF *UND* 00000024 GLIBC_2.0 strcpy
+00000000 D *UND* 00000000 Perl_hv_fetch
+00000000 DF *UND* 00000011 PQoptions
+00000000 D *UND* 00000000 Perl_stack_grow
+00000000 DF *UND* 00000011 PQdb
+00000000 DF *UND* 000001fa lo_import
+00000000 D *UND* 00000000 Perl_Tcurpad_ptr
+00000000 DF *UND* 00000014 PQsocket
+00000000 D *UND* 00000000 Perl_sv_newmortal
+00000000 D *UND* 00000000 Perl_av_fetch
+00000000 DF *UND* 00000011 PQuser
+00000000 DF *UND* 00000084 PQprepare
+00000000 DF *UND* 00000023 PQfreemem
+00000000 D *UND* 00000000 Perl_Tdirty_ptr
+00000000 DF *UND* 00000062 GLIBC_2.0 strcasecmp
+00000000 DF *UND* 0000004d PQftablecol
+00000000 DF *UND* 000000ba lo_unlink
+00000000 D *UND* 00000000 Perl_call_method
+00000000 D *UND* 00000000 Perl_Tmarkstack_ptr_ptr
+00000000 DF *UND* 00000029 PQtransactionStatus
+00000000 DF *UND* 0000002c PQfname
+00000000 D *UND* 00000000 Perl_newSV
+00000000 D *UND* 00000000 Perl_mg_set
+00000000 D *UND* 00000000 Perl_sv_2io
+00000000 DF *UND* 0000012c PQputCopyData
+00000000 D *UND* 00000000 Perl_safesysrealloc
+00000000 DF *UND* 000000ab PQexecParams
+00000000 D *UND* 00000000 Perl_newSViv
+00000000 DF *UND* 000000a4 PQgetCopyData
+00000000 D *UND* 00000000 Perl_sv_unref
+00000000 DF *UND* 00000027 PQfinish
+00000000 D *UND* 00000000 Perl_Isv_no_ptr
+00000000 D *UND* 00000000 Perl_mg_find
+00000000 DF *UND* 00000035 PQerrorMessage
+00000000 D *UND* 00000000 Perl_newAV
+00000000 DF *UND* 000001aa GLIBC_2.0 strcat
+00000000 D *UND* 00000000 Perl_croak_nocontext
+00000000 D *UND* 00000000 Perl_sv_grow
+00000000 DF *UND* 000000c6 GLIBC_2.1 __rawmemchr
+00000000 DF *UND* 00000011 PQnfields
+00000000 D *UND* 00000000 Perl_av_pop
+00000000 DF *UND* 000000cd lo_open
+00000000 D *UND* 00000000 Perl_safesysmalloc
+00000000 D *UND* 00000000 Perl_newSVpv
+00000000 D *UND* 00000000 pow
+00000000 DF *UND* 00000034 GLIBC_2.0 sscanf
+00000000 D *UND* 00000000 Perl_mg_size
+00000000 D *UND* 00000000 Perl_av_push
+00000000 D *UND* 00000000 Perl_Tna_ptr
+00000000 DF *UND* 000000f3 GLIBC_2.0 strncmp
+00000000 D *UND* 00000000 PL_memory_wrap
+00000000 D *UND* 00000000 Perl_croak
+00000000 D *UND* 00000000 Perl_Isv_undef_ptr
+00000000 D *UND* 00000000 Perl_safesysfree
+00000000 DF *UND* 00000011 PQport
+00000000 DF *UND* 0000003f PQgetvalue
+00000000 DF *UND* 0000003b GLIBC_2.0 snprintf
+00000000 D *UND* 00000000 Perl_newXS
+00000000 DF *UND* 000000ba lo_close
+00000000 D *UND* 00000000 Perl_newSVuv
+00000000 D *UND* 00000000 Perl_sv_2bool
+00000000 D *UND* 00000000 Perl_newHV
+00000000 D *UND* 00000000 Perl_Gthr_key_ptr
+00000000 DF *UND* 00000054 GLIBC_2.0 strcmp
+00000000 w DF *UND* 00000176 GLIBC_2.1.3 __cxa_finalize
+00000000 D *UND* 00000000 Perl_newSVpvn
+00000000 D *UND* 00000000 Perl_markstack_grow
+00000000 DF *UND* 000000eb lo_write
+00000000 DF *UND* 00000175 PQcmdTuples
+00000000 D *UND* 00000000 Perl_newRV
+00000000 DF *UND* 0000004d PQfsize
+00000000 D *UND* 00000000 Perl_sv_backoff
+00000000 D *UND* 00000000 Perl_dowantarray
+00000000 DF *UND* 0000006e PQclear
+00000000 D *UND* 00000000 Perl_sv_2pv_flags
+0000b0b0 g DF .text 000001a6 Base XS_DBD__Pg__db__ping
+00006bc0 g DF .text 0000025f Base XS_DBD__Pg__db__pg_type_info
+0001cac0 g DF .text 00000059 Base dequote_bool
+00007f00 g DF .text 0000026b Base XS_DBD__Pg__db_putline
+00007100 g DF .text 000001a0 Base XS_DBD__Pg__db_endcopy
+00006e20 g DF .text 00000133 Base XS_DBD__Pg__db_pg_server_untrace
+0000a750 g DF .text 000002d3 Base XS_DBD__Pg__db_pg_rollback_to
+00012e00 g DF .text 00000211 Base pg_db_release
+00018120 g DF .text 00001707 Base dbd_st_prepare
+000138a0 g DF .text 00000234 Base pg_db_getline
+00010800 g DF .text 0000062a Base XS_DBD__Pg__db_selectall_arrayref
+0000ad10 g DF .text 000001a6 Base XS_DBD__Pg__db_pg_notifies
+00007990 g DF .text 0000056c Base XS_DBD__Pg__db_pg_getline
+00013270 g DF .text 0000020a Base pg_db_savepoint
+00009640 g DF .text 00000619 Base XS_DBD__Pg__db_lo_read
+00010e30 g DF .text 00000413 Base XS_DBD__Pg__db__login
+0001a890 g DF .text 00000022 Base dbd_db_rollback
+0001b150 g DF .text 000006d7 Base dbd_db_login
+00019a60 g DF .text 000000ae Base dbd_db_getfd
+00019e60 g DF .text 00000657 Base dbd_db_FETCH_attrib
+0001d020 g DF .text 000000b2 Base quote_bool
+00010020 g DF .text 0000020e Base XS_DBD__Pg__db_commit
+0001ca90 g DF .text 00000028 Base dequote_char
+00012cf0 g DF .text 00000104 Base pg_db_lo_creat
+00007440 g DF .text 00000542 Base XS_DBD__Pg__db_getline
+00006f60 g DF .text 00000194 Base XS_DBD__Pg__db_pg_server_trace
+00012be0 g DF .text 00000103 Base pg_db_lo_write
+0000db20 g DF .text 00000608 Base XS_DBD__Pg__st_blob_read
+0000aa30 g DF .text 000002d3 Base XS_DBD__Pg__db_pg_savepoint
+0000bcb0 g DF .text 000002d8 Base XS_DBD__Pg__st_execute
+0001d0e0 g DF .text 00000156 Base quote_bytea
+00008e70 g DF .text 000003db Base XS_DBD__Pg__db_lo_lseek
+0001cb20 g DF .text 000000c2 Base quote_circle
+0000e950 g DF .text 00000266 Base XS_DBD__Pg__st_fetchall_arrayref
+0001d780 g DF .text 0000009b Base sql_type_data
+00021c70 g D *ABS* 00000000 Base _edata
+00015df0 g DF .text 00000155 Base dbd_st_finish
+0000d220 g DF .text 000003f4 Base XS_DBD__Pg__st_DESTROY
+0000aec0 g DF .text 000001e5 Base XS_DBD__Pg__db_getfd
+0001ccc0 g DF .text 000000b2 Base quote_geom
+0001d2e0 g DF .text 00000497 Base pg_type_data
+00015c30 g DF .text 000001b5 Base dbd_db_ping
+0001d854 g DF .fini 00000000 Base _fini
+00013560 g DF .text 000000e7 Base pg_db_pg_server_trace
+000127b0 g DF .text 00000118 Base pg_db_lo_open
+00003d00 g DF .init 00000000 Base _init
+0000e130 g DF .text 0000022f Base XS_DBD__Pg__st_fetchrow_array
+0001cbf0 g DF .text 000000c2 Base quote_path
+00015930 g DF .text 000002f9 Base dbd_st_destroy
+00011450 g DF .text 00000336 Base XS_DBD__Pg_constant
+00014fb0 g DF .text 0000029e Base dbd_st_STORE_attrib
+0000cac0 g DF .text 000004bc Base XS_DBD__Pg__st_bind_param
+0000f190 g DF .text 0000020e Base XS_DBD__Pg__db_rollback
+00004990 g DF .text 00001e07 Base boot_DBD__Pg
+00021c70 g D *ABS* 00000000 Base __bss_start
+0001ca60 g DF .text 00000028 Base dequote_string
+0000d840 g DF .text 000002d2 Base XS_DBD__Pg__st_STORE
+00008170 g DF .text 0000026b Base XS_DBD__Pg__db_pg_putline
+0001c790 g DF .text 00000295 Base pg_quickexec
+000072a0 g DF .text 0000019f Base XS_DBD__Pg__db_pg_endcopy
+00008700 g DF .text 0000028b Base XS_DBD__Pg__db_lo_import
+00019830 g DF .text 0000022b Base dbd_db_pg_notifies
+00011ab0 g DF .text 000000ee Base pg_db_lo_close
+0001ae70 g DF .text 000001c6 Base dbd_db_disconnect
+00021c74 g D *ABS* 00000000 Base _end
+0000cf80 g DF .text 000002a0 Base XS_DBD__Pg__st_finish
+00019b10 g DF .text 00000343 Base dbd_discon_all
+00011790 g DF .text 00000050 Base dbd_init
+000117e0 g DF .text 000000a9 Base dbd_st_rows
+0001a8c0 g DF .text 00000022 Base dbd_db_commit
+00009ec0 g DF .text 0000032b Base XS_DBD__Pg__db_lo_open
+0001ce70 g DF .text 000000fe Base dequote_bytea
+0000ebc0 g DF .text 000001f0 Base XS_DBD__Pg__st_rows
+0000bf90 g DF .text 0000056d Base XS_DBD__Pg__db_quote
+0001cfb0 g DF .text 0000006c Base quote_integer
+0000d620 g DF .text 0000021b Base XS_DBD__Pg__st_FETCH_attrib
+00013480 g DF .text 000000e0 Base pg_db_pg_server_untrace
+0000a1f0 g DF .text 0000027c Base XS_DBD__Pg__db_lo_creat
+00009250 g DF .text 000003eb Base XS_DBD__Pg__db_lo_write
+000067a0 g DF .text 00000208 Base XS_DBD__Pg__st_state
+0001ca30 g DF .text 00000028 Base null_dequote
+00013020 g DF .text 00000250 Base pg_db_rollback_to
+00010230 g DF .text 000005cb Base XS_DBD__Pg__db_selectrow_arrayref
+00008990 g DF .text 0000025b Base XS_DBD__Pg__db_lo_unlink
+000128d0 g DF .text 00000104 Base pg_db_lo_import
+0000fb30 g DF .text 0000020a Base XS_DBD__Pg__db_FETCH
+00012af0 g DF .text 000000ee Base pg_db_lo_tell
+0000a470 g DF .text 000002d3 Base XS_DBD__Pg__db_pg_release
+00011250 g DF .text 000001fa Base XS_DBD__Pg__dr_discon_all_
+00013ce0 g DF .text 000012cd Base dbd_st_FETCH_attrib
+0000b860 g DF .text 00000450 Base XS_DBD__Pg__db_do
+0000edb0 g DF .text 000003d6 Base XS_DBD__Pg__st__prepare
+0001d240 g DF .text 0000003f Base quote_sql_binary
+0000fd40 g DF .text 000002d2 Base XS_DBD__Pg__db_STORE
+000083e0 g DF .text 0000031b Base XS_DBD__Pg__db_lo_export
+0001cd80 g DF .text 000000e4 Base quote_string
+0000f3a0 g DF .text 00000378 Base XS_DBD__Pg__db_disconnect
+0000c500 g DF .text 000005be Base XS_DBD__Pg__st_bind_param_inout
+0000f720 g DF .text 0000040e Base XS_DBD__Pg__db_DESTROY
+00013ae0 g DF .text 000001f4 Base pg_db_putline
+00013650 g DF .text 00000244 Base pg_db_endcopy
+00016b40 g DF .text 000015d1 Base dbd_st_execute
+000129e0 g DF .text 00000110 Base pg_db_lo_unlink
+0001cf70 g DF .text 00000038 Base dequote_sql_binary
+00011890 g DF .text 0000010a Base pg_db_lo_lseek
+0001d280 g DF .text 00000055 Base null_quote
+00008bf0 g DF .text 0000027c Base XS_DBD__Pg__db_lo_tell
+0001a8f0 g DF .text 00000579 Base dbd_db_STORE_attrib
+0001b9a0 g DF .text 00000def Base dbd_bind_ph
+000119a0 g DF .text 00000103 Base pg_db_lo_read
+00015f50 g DF .text 000006ed Base dbd_st_fetch
+0000e360 g DF .text 00000224 Base XS_DBD__Pg__st_fetchrow_arrayref
+000069b0 g DF .text 00000208 Base XS_DBD__Pg__db_state
+00012690 g DF .text 00000118 Base pg_db_lo_export
+0001b040 g DF .text 0000010f Base dbd_db_destroy
+00009c60 g DF .text 0000025b Base XS_DBD__Pg__db_lo_close
+00011ea0 g DF .text 00000379 Base dbd_st_blob_read
+
+
diff --git a/scripts/t/Dpkg_Shlibs/objdump.glib-ia64 b/scripts/t/Dpkg_Shlibs/objdump.glib-ia64
new file mode 100644
index 0000000..a3ff4d8
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.glib-ia64
@@ -0,0 +1,350 @@
+
+/usr/lib/libglib-2.0.so.0: file format elf64-little
+architecture: ia64-elf64, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x000000000002dc40
+
+Program Header:
+ LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**16
+ filesz 0x0000000000158820 memsz 0x0000000000158820 flags r-x
+ LOAD off 0x0000000000158820 vaddr 0x0000000000168820 paddr 0x0000000000168820 align 2**16
+ filesz 0x0000000000001498 memsz 0x0000000000001a90 flags rw-
+ DYNAMIC off 0x0000000000158948 vaddr 0x0000000000168948 paddr 0x0000000000168948 align 2**3
+ filesz 0x00000000000001f0 memsz 0x00000000000001f0 flags rw-
+ STACK off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**3
+ filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
+0x70000001 off 0x0000000000150e28 vaddr 0x0000000000150e28 paddr 0x0000000000150e28 align 2**3
+ filesz 0x00000000000079f8 memsz 0x00000000000079f8 flags r--
+
+Dynamic Section:
+ NEEDED libc.so.6.1
+ SONAME libglib-2.0.so.0
+ INIT 0x15070
+ FINI 0x106360
+ INIT_ARRAY 0x168820
+ INIT_ARRAYSZ 0x18
+ FINI_ARRAY 0x168838
+ FINI_ARRAYSZ 0x8
+ HASH 0x158
+ GNU_HASH 0x25c8
+ STRTAB 0xc4c0
+ SYMTAB 0x4a38
+ STRSZ 0x5deb
+ SYMENT 0x18
+ 0x70000000 0x168dd8
+ PLTGOT 0x168dd8
+ PLTRELSZ 0xcd8
+ PLTREL 0x7
+ JMPREL 0x14398
+ RELA 0x12d18
+ RELASZ 0x1680
+ RELAENT 0x18
+ VERNEED 0x12ce8
+ VERNEEDNUM 0x1
+ VERSYM 0x122ac
+ RELACOUNT 0x60
+
+Version References:
+ required from libc.so.6.1:
+ 0x0d696913 0x00 03 GLIBC_2.3
+ 0x0d696912 0x00 02 GLIBC_2.2
+
+DYNAMIC SYMBOL TABLE:
+00000000000bbaa0 l DF .text 00000000000006b0 .hidden IA__g_thread_pool_new
+000000000007b730 l DF .text 0000000000000200 .hidden IA__g_option_group_free
+00000000000b2f30 l DF .text 0000000000000060 .hidden IA__g_str_equal
+00000000000cd0c0 l DF .text 0000000000000010 .hidden IA__g_direct_hash
+0000000000095660 l DF .text 00000000000001d0 .hidden IA__g_scanner_warn
+00000000001062e0 l DF .text 0000000000000080 .hidden __do_global_ctors_aux
+0000000000071fe0 l DF .text 00000000000000f0 .hidden IA__g_free
+0000000000074a30 l DF .text 0000000000000370 .hidden _g_log_fallback_handler
+0000000000077080 l DF .text 0000000000000a20 .hidden IA__g_log_default_handler
+00000000000afc90 l DF .text 0000000000000090 .hidden IA__g_str_hash
+0000000000095830 l DF .text 00000000000001f0 .hidden IA__g_scanner_error
+00000000000d4d60 l DF .text 0000000000000290 g_io_unix_get_flags
+00000000000d4a60 l DF .text 0000000000000120 g_io_unix_set_flags
+00000000000d4b80 l DF .text 0000000000000020 g_io_unix_free
+00000000000d4ba0 l DF .text 00000000000000c0 g_io_unix_create_watch
+00000000000d4c60 l DF .text 0000000000000100 g_io_unix_close
+00000000000d4ff0 l DF .text 00000000000001f0 g_io_unix_seek
+00000000000d51e0 l DF .text 0000000000000150 g_io_unix_write
+00000000000d5330 l DF .text 0000000000000180 g_io_unix_read
+00000000000d4820 l DF .text 0000000000000030 g_io_unix_finalize
+00000000000d4950 l DF .text 0000000000000110 g_io_unix_dispatch
+00000000000d4850 l DF .text 0000000000000080 g_io_unix_check
+00000000000d48d0 l DF .text 0000000000000080 g_io_unix_prepare
+00000000000cd720 l DF .text 0000000000000090 language_names_cache_free
+00000000000c89f0 l DF .text 0000000000000090 charset_cache_free
+00000000000c20f0 l DF .text 0000000000000050 interval_compare
+00000000000bb270 l DF .text 0000000000000830 g_thread_pool_thread_proxy
+00000000000b3360 l DF .text 0000000000000050 g_thread_fail
+00000000000b33b0 l DF .text 00000000000000c0 gettime
+00000000000b8c70 l DF .text 00000000000004a0 g_thread_cleanup
+00000000000b6790 l DF .text 00000000000003b0 g_thread_create_proxy
+00000000000a37a0 l DF .text 0000000000000320 private_thread_memory_cleanup
+000000000009a7d0 l DF .text 00000000000000e0 iter_compare
+0000000000094c10 l DF .text 0000000000000060 g_scanner_destroy_symbol_table_entry
+0000000000095f50 l DF .text 00000000000001b0 g_scanner_msg_handler
+0000000000096100 l DF .text 00000000000000a0 g_scanner_key_equal
+0000000000093210 l DF .text 0000000000000080 g_scanner_key_hash
+0000000000093290 l DF .text 00000000000000c0 g_scanner_foreach_internal
+0000000000092510 l DF .text 00000000000004a0 interpolate_replacement
+000000000008cd60 l DF .text 0000000000000050 literal_replacement
+000000000008cd00 l DF .text 0000000000000060 free_interpolation_data
+0000000000089190 l DF .text 0000000000000040 relation_delete_value_tuple
+0000000000089c20 l DF .text 0000000000000030 g_relation_free_array
+0000000000089690 l DF .text 0000000000000210 g_relation_delete_tuple
+00000000000895a0 l DF .text 00000000000000f0 g_relation_select_tuple
+0000000000088c30 l DF .text 00000000000000a0 g_relation_print_index
+0000000000088cd0 l DF .text 0000000000000170 g_relation_print_one
+00000000000889a0 l DF .text 0000000000000020 tuple_hash_2
+0000000000088940 l DF .text 0000000000000060 tuple_equal_2
+000000000007bc50 l DF .text 0000000000000050 dgettext_swapped
+00000000000787b0 l DF .text 0000000000000040 g_node_find_func
+0000000000071570 l DF .text 0000000000000200 profiler_try_realloc
+0000000000071770 l DF .text 0000000000000150 profiler_try_malloc
+0000000000073410 l DF .text 0000000000000190 profiler_calloc
+00000000000718c0 l DF .text 00000000000001c0 profiler_free
+0000000000073380 l DF .text 0000000000000090 profiler_realloc
+00000000000735a0 l DF .text 0000000000000090 profiler_malloc
+0000000000071a80 l DF .text 00000000000000d0 fallback_calloc
+000000000005a2b0 l DF .text 0000000000000040 g_source_callback_get
+000000000005d650 l DF .text 00000000000000e0 g_source_callback_unref
+000000000005a290 l DF .text 0000000000000020 g_source_callback_ref
+000000000005a340 l DF .text 00000000000000c0 g_idle_dispatch
+000000000005a330 l DF .text 0000000000000010 g_idle_check
+000000000005a310 l DF .text 0000000000000020 g_idle_prepare
+000000000005a400 l DF .text 00000000000000c0 g_child_watch_dispatch
+000000000005a5c0 l DF .text 0000000000000020 g_child_watch_check
+000000000005a5e0 l DF .text 0000000000000030 g_child_watch_prepare
+0000000000060390 l DF .text 0000000000000160 g_timeout_dispatch
+00000000000604f0 l DF .text 00000000000000f0 g_timeout_check
+00000000000605e0 l DF .text 0000000000000310 g_timeout_prepare
+000000000005cc20 l DF .text 0000000000000030 g_main_dispatch_free
+000000000005b130 l DF .text 00000000000000b0 g_child_watch_signal_handler
+00000000000619f0 l DF .text 00000000000002e0 child_watch_helper_thread
+000000000004d830 l DF .text 00000000000000b0 g_key_file_key_value_pair_free
+0000000000041860 l DF .text 0000000000000090 default_finalize_hook
+000000000002b370 l DF .text 0000000000000090 filename_charset_cache_free
+000000000001fe80 l DF .text 0000000000000440 text_raw_cb
+0000000000020660 l DF .text 0000000000000480 end_element_raw_cb
+0000000000026110 l DF .text 0000000000001cf0 start_element_raw_cb
+000000000001e790 l DF .text 0000000000000060 parse_data_free
+000000000001e6e0 l DF .text 00000000000000b0 bookmark_app_info_free
+000000000001e960 l DF .text 0000000000000260 bookmark_item_free
+000000000001c300 l DF .text 0000000000000020 stack_trace_sigchld
+0000000000019a00 l DF .text 0000000000000070 g_async_queue_invert_compare
+0000000000016be0 l DF .text 0000000000000080 __do_jv_register_classes
+0000000000016b20 l DF .text 00000000000000b0 __do_global_dtors_aux
+0000000000016aa0 l DF .text 0000000000000070 gmon_initializer
+0000000000000000 DF *UND* 0000000000000370 GLIBC_2.2 getpwuid
+0000000000000000 DF *UND* 0000000000000550 GLIBC_2.2 freopen
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 __strtod_internal
+0000000000000000 DF *UND* 0000000000000240 GLIBC_2.2 feof
+0000000000000000 DF *UND* 0000000000000450 GLIBC_2.2 localeconv
+0000000000000000 DF *UND* 00000000000001e0 GLIBC_2.2 strcpy
+0000000000000000 DF *UND* 0000000000000200 GLIBC_2.2 raise
+0000000000000000 DO *UND* 0000000000000008 GLIBC_2.2 environ
+0000000000000000 DF *UND* 0000000000000030 GLIBC_2.2 getuid
+0000000000000000 DF *UND* 0000000000000180 GLIBC_2.2 waitpid
+0000000000000000 DF *UND* 0000000000000100 GLIBC_2.2 strcasecmp
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 select
+0000000000000000 DF *UND* 0000000000000110 GLIBC_2.2 closedir
+0000000000000000 DF *UND* 0000000000000440 GLIBC_2.2 fwrite
+0000000000000000 DF *UND* 00000000000001d0 GLIBC_2.2 rewinddir
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 close
+0000000000000000 DF *UND* 0000000000000280 GLIBC_2.2 strstr
+0000000000000000 DF *UND* 0000000000000080 GLIBC_2.2 time
+0000000000000000 DF *UND* 0000000000000520 GLIBC_2.2 fdopen
+0000000000000000 w D *UND* 0000000000000000 __gmon_start__
+0000000000000000 w D *UND* 0000000000000000 _Jv_RegisterClasses
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 wcsxfrm
+0000000000000000 DF *UND* 00000000000000c0 GLIBC_2.2 strncasecmp
+0000000000000000 DF *UND* 00000000000000d0 GLIBC_2.2 remove
+0000000000000000 DF *UND* 00000000000004f0 GLIBC_2.2 malloc
+0000000000000000 DF *UND* 0000000000000080 GLIBC_2.2 execve
+0000000000000000 DF *UND* 00000000000000b0 GLIBC_2.2 fprintf
+0000000000000000 DF *UND* 0000000000000200 GLIBC_2.2 setpwent
+0000000000000000 DF *UND* 0000000000000100 GLIBC_2.2 nl_langinfo
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 chdir
+0000000000000000 DF *UND* 0000000000000100 GLIBC_2.2 gethostname
+0000000000000000 w DO *UND* 0000000000000008 GLIBC_2.2 _environ
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 rmdir
+0000000000000000 DF *UND* 0000000000000390 GLIBC_2.2 fputc
+0000000000000000 DF *UND* 0000000000000170 GLIBC_2.2 poll
+0000000000000000 DF *UND* 00000000000003e0 GLIBC_2.2 getcwd
+0000000000000000 DO *UND* 0000000000000008 GLIBC_2.2 stdin
+0000000000000000 DF *UND* 00000000000004f0 GLIBC_2.2 getpwnam_r
+0000000000000000 DF *UND* 0000000000000520 GLIBC_2.2 memmove
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 __strtoul_internal
+0000000000000000 DO *UND* 0000000000000008 GLIBC_2.2 stdout
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 strncmp
+0000000000000000 DF *UND* 0000000000000320 GLIBC_2.2 vasprintf
+0000000000000000 DF *UND* 0000000000000210 GLIBC_2.2 endpwent
+0000000000000000 DF *UND* 00000000000001f0 GLIBC_2.2 fcntl
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 dup2
+0000000000000000 DF *UND* 00000000000007e0 GLIBC_2.2 fork
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 gmtime
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 readlink
+0000000000000000 DF *UND* 0000000000000080 GLIBC_2.3 __ctype_toupper_loc
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 lseek
+0000000000000000 DF *UND* 00000000000000c0 GLIBC_2.2 __fxstat
+0000000000000000 DF *UND* 00000000000000b0 GLIBC_2.2 fscanf
+0000000000000000 DO *UND* 0000000000000008 GLIBC_2.2 __environ
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 munmap
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 strftime
+0000000000000000 DF *UND* 00000000000003a0 GLIBC_2.2 fread
+0000000000000000 DF *UND* 0000000000007090 GLIBC_2.2 vfprintf
+0000000000000000 DF *UND* 00000000000000b0 GLIBC_2.2 snprintf
+0000000000000000 DF *UND* 0000000000000330 GLIBC_2.2 iconv_open
+0000000000000000 DF *UND* 0000000000000080 GLIBC_2.3 __ctype_b_loc
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 nanosleep
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 pipe
+0000000000000000 DF *UND* 0000000000000090 GLIBC_2.2 strpbrk
+0000000000000000 DF *UND* 0000000000000640 GLIBC_2.2 realloc
+0000000000000000 DF *UND* 0000000000000240 GLIBC_2.2 ferror
+0000000000000000 DF *UND* 00000000000004f0 GLIBC_2.2 getpwuid_r
+0000000000000000 DF *UND* 0000000000000030 GLIBC_2.2 strcmp
+0000000000000000 DF *UND* 00000000000000e0 GLIBC_2.2 setenv
+0000000000000000 DF *UND* 0000000000000650 GLIBC_2.2 fclose
+0000000000000000 w DF *UND* 0000000000000220 GLIBC_2.2 __cxa_finalize
+0000000000000000 DF *UND* 0000000000000020 GLIBC_2.2 __errno_location
+0000000000000000 DF *UND* 00000000000002c0 GLIBC_2.2 exit
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 open
+0000000000000000 DF *UND* 0000000000000590 GLIBC_2.2 abort
+0000000000000000 DF *UND* 0000000000000400 GLIBC_2.2 fputs
+0000000000000000 DF *UND* 00000000000000a0 GLIBC_2.2 sigemptyset
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 localtime_r
+0000000000000000 DF *UND* 00000000000000b0 GLIBC_2.2 sprintf
+0000000000000000 DF *UND* 00000000000002c0 GLIBC_2.2 unsetenv
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 mmap
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 mkdir
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 creat
+0000000000000000 DF *UND* 00000000000000d0 GLIBC_2.2 getpid
+0000000000000000 DF *UND* 0000000000000170 GLIBC_2.2 strerror
+0000000000000000 DF *UND* 0000000000000220 GLIBC_2.2 memcmp
+0000000000000000 DF *UND* 0000000000000320 GLIBC_2.2 qsort
+0000000000000000 DF *UND* 0000000000000c70 GLIBC_2.2 sysconf
+0000000000000000 DF *UND* 0000000000000190 GLIBC_2.2 bsearch
+0000000000000000 DF *UND* 00000000000001b0 GLIBC_2.2 signal
+0000000000000000 DF *UND* 00000000000000c0 GLIBC_2.2 __xstat
+0000000000000000 DF *UND* 00000000000000c0 GLIBC_2.2 __lxstat
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 wcscoll
+0000000000000000 DF *UND* 0000000000000160 GLIBC_2.2 vsprintf
+0000000000000000 DF *UND* 0000000000000130 GLIBC_2.2 vsnprintf
+0000000000000000 DF *UND* 00000000000003e0 GLIBC_2.2 strncpy
+0000000000000000 DF *UND* 00000000000002e0 GLIBC_2.2 getenv
+0000000000000000 DF *UND* 0000000000000120 GLIBC_2.2 strchr
+0000000000000000 DF *UND* 00000000000008c0 GLIBC_2.2 calloc
+0000000000000000 DF *UND* 00000000000000a0 GLIBC_2.2 __cxa_atexit
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 write
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 stpcpy
+0000000000000000 DF *UND* 0000000000000450 GLIBC_2.2 fgets
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 rename
+0000000000000000 DF *UND* 0000000000000310 GLIBC_2.2 __uflow
+0000000000000000 DF *UND* 0000000000000410 GLIBC_2.2 memset
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 fopen
+0000000000000000 DF *UND* 0000000000000050 GLIBC_2.2 __strtol_internal
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 unlink
+0000000000000000 DF *UND* 0000000000000430 GLIBC_2.2 iconv
+0000000000000000 DF *UND* 00000000000001b0 GLIBC_2.2 perror
+0000000000000000 DF *UND* 0000000000000880 GLIBC_2.2 execvp
+0000000000000000 DF *UND* 0000000000000330 GLIBC_2.2 ungetc
+0000000000000000 DF *UND* 0000000000000140 GLIBC_2.2 _exit
+0000000000000000 DF *UND* 0000000000000080 GLIBC_2.3 __ctype_tolower_loc
+0000000000000000 DF *UND* 0000000000000070 GLIBC_2.2 bindtextdomain
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 chmod
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 timegm
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 read
+0000000000000000 DF *UND* 0000000000000300 GLIBC_2.2 readdir
+0000000000000000 DF *UND* 0000000000000300 GLIBC_2.2 free
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 dcgettext
+0000000000000000 DF *UND* 00000000000000e0 GLIBC_2.2 strrchr
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 access
+0000000000000000 DF *UND* 0000000000000390 GLIBC_2.2 fflush
+0000000000000000 DF *UND* 0000000000000070 GLIBC_2.2 bind_textdomain_codeset
+0000000000000000 DF *UND* 00000000000001c0 GLIBC_2.2 opendir
+0000000000000000 DF *UND* 0000000000000530 GLIBC_2.2 strsignal
+0000000000000000 DF *UND* 0000000000000070 GLIBC_2.2 isatty
+0000000000000000 DF *UND* 0000000000000130 GLIBC_2.2 posix_memalign
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 gettimeofday
+0000000000000000 DF *UND* 00000000000000a0 GLIBC_2.2 iconv_close
+0000000000000000 DF *UND* 0000000000000040 GLIBC_2.2 dup
+0000000000000000 DF *UND* 0000000000000540 GLIBC_2.2 memcpy
+0000000000000000 DO *UND* 0000000000000008 GLIBC_2.2 stderr
+0000000000000000 DF *UND* 0000000000000030 GLIBC_2.2 getppid
+0000000000000000 DF *UND* 0000000000000100 GLIBC_2.2 strlen
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 execv
+0000000000000000 DF *UND* 0000000000000f50 GLIBC_2.2 setlocale
+0000000000000000 DF *UND* 0000000000000060 GLIBC_2.2 sigaction
+00000000000909e0 g DF .text 0000000000000310 Base g_regex_match_full
+0000000000038400 g DF .text 0000000000000660 Base g_date_strftime
+0000000000017530 g DF .text 00000000000000f0 Base g_ptr_array_add
+00000000000c6930 g DF .text 00000000000001e0 Base g_utf8_strreverse
+0000000000039650 g DF .text 0000000000000030 Base g_date_set_time
+00000000000cab10 g DF .text 0000000000000710 Base g_utf8_collate_key_for_filename
+00000000000c26f0 g DF .text 0000000000000160 Base g_unichar_type
+000000000002a930 g DF .text 0000000000000430 Base g_uri_list_extract_uris
+00000000000cf850 g DF .text 0000000000000350 Base g_get_system_data_dirs
+000000000008b450 g DF .text 0000000000000070 Base g_rand_new_with_seed_array
+00000000000a7410 g DF .text 0000000000000080 Base g_slist_concat
+0000000000033c50 g DF .text 0000000000000020 Base g_date_valid_weekday
+000000000003f090 g DF .text 0000000000000190 Base g_hash_table_get_values
+0000000000058710 g DF .text 0000000000000010 Base g_list_pop_allocator
+000000000008c9a0 g DF .text 00000000000000b0 Base g_match_info_is_partial_match
+00000000000d3620 g DF .text 0000000000000290 Base g_get_user_name
+00000000000a84d0 g DF .text 0000000000000030 Base g_slist_free_1
+00000000000cccc0 g DF .text 00000000000002b0 Base g_unicode_canonical_decomposition
+00000000000656e0 g DF .text 0000000000000550 Base g_main_context_unref
+00000000000d42b0 g DF .text 0000000000000100 Base g_vsprintf
+0000000000079f90 g DF .text 00000000000000e0 Base g_node_get_root
+0000000000016df0 g DF .text 0000000000000130 Base g_ptr_array_remove_index_fast
+000000000007b3b0 g DF .text 0000000000000080 Base g_option_group_set_parse_hooks
+00000000000b2c80 g DF .text 0000000000000170 Base g_string_chunk_clear
+0000000000021620 g DF .text 0000000000000040 Base g_bookmark_file_error_quark
+0000000000088490 g DF .text 0000000000000110 Base g_queue_sort
+00000000000c7c00 g DF .text 0000000000000530 Base g_utf16_to_utf8
+00000000000197e0 g DF .text 0000000000000050 Base g_byte_array_prepend
+0000000000053510 g DF .text 0000000000000580 Base g_key_file_get_string_list
+0000000000169a40 g DO .sdata 0000000000000008 Base glib_mem_profiler_table
+00000000000a8760 g DF .text 00000000000000d0 Base g_slist_remove_link
+00000000000a8130 g DF .text 0000000000000060 Base g_slist_prepend
+0000000000063bf0 g DF .text 0000000000000390 Base g_main_context_find_source_by_user_data
+000000000005c540 g DF .text 00000000000000d0 Base g_main_loop_is_running
+000000000003c5e0 g DF .text 0000000000000030 Base g_mkstemp
+00000000000b0440 g DF .text 0000000000000140 Base g_string_set_size
+0000000000088160 g DF .text 0000000000000110 Base g_queue_insert_after
+00000000000738a0 g DF .text 0000000000000150 Base g_log_set_default_handler
+0000000000059c30 g DF .text 00000000000000b0 Base g_list_delete_link
+0000000000058a10 g DF .text 0000000000000090 Base g_list_position
+0000000000059110 g DF .text 0000000000000100 Base g_list_find_custom
+00000000000b0990 g DF .text 00000000000000f0 Base g_string_ascii_down
+00000000000629a0 g DF .text 0000000000000130 Base g_main_loop_new
+000000000005acb0 g DF .text 00000000000000b0 Base g_source_get_context
+0000000000033c00 g DF .text 0000000000000020 Base g_date_valid_year
+00000000000a7d90 g DF .text 0000000000000030 Base g_slist_insert_sorted
+000000000009f6a0 g DF .text 0000000000000f20 Base g_shell_parse_argv
+00000000000bca30 g DF .text 00000000000000f0 Base g_timer_stop
+0000000000099ec0 g DF .text 0000000000000120 Base g_scanner_peek_next_token
+000000000002d5a0 g DF .text 00000000000000f0 Base g_filename_display_basename
+00000000000305c0 g DF .text 0000000000000580 Base g_dataset_id_get_data
+0000000000064a50 g DF .text 0000000000000480 Base g_source_attach
+000000000003e5d0 g DF .text 0000000000000360 Base g_mkdir_with_parents
+000000000001de50 g DF .text 0000000000000110 Base g_bookmark_file_has_item
+0000000000065050 g DF .text 00000000000001c0 Base g_child_watch_add_full
+00000000000a8830 g DF .text 0000000000000050 Base g_freopen
+00000000000a8730 g DF .text 0000000000000030 Base g_slist_alloc
+0000000000054a60 g DF .text 0000000000000480 Base g_key_file_get_locale_string
+0000000000094fd0 g DF .text 00000000000001b0 Base g_scanner_input_file
+0000000000093660 g DF .text 00000000000000a0 Base g_scanner_set_scope
+0000000000022780 g DF .text 0000000000000180 Base g_bookmark_file_get_visited
+000000000002f280 g DF .text 00000000000003a0 Base g_datalist_id_get_data
+0000000000040000 g DF .text 00000000000000e0 Base g_hash_table_new_full
+00000000000d2f40 g DF .text 0000000000000260 Base g_get_user_config_dir
+0000000000059700 g DF .text 0000000000000280 Base g_list_insert_before
+0000000000079270 g DF .text 00000000000000f0 Base g_node_n_children
+00000000000d0680 g DF .text 0000000000000460 Base g_get_user_cache_dir
+000000000006a5a0 g DF .text 00000000000000d0 Base g_markup_parse_context_get_element
+00000000000aefe0 g DF .text 00000000000000a0 Base g_strndup
+
+
diff --git a/scripts/t/Dpkg_Shlibs/objdump.internal b/scripts/t/Dpkg_Shlibs/objdump.internal
new file mode 100644
index 0000000..c492a54
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.internal
@@ -0,0 +1,15 @@
+
+libinternal.so.0: file format elf32-littlearm
+architecture: arm, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x0000f668
+
+Dynamic Section:
+ SONAME libinternal.so.0
+
+DYNAMIC SYMBOL TABLE:
+00018ef4 g DF .text 00000008 Base .gomp_critical_user_foo
+0001c7f0 g DF .text 00000018 Base .gomp_critical_user_bar
+00011614 g DF .text 00000014 GCC_3.0 __aeabi_lcmp
+000115d8 w DF .text 00000000 GCC_4.0 __aeabi_unknown
+00015378 g DF .text 0000000c Base symbol
diff --git a/scripts/t/Dpkg_Shlibs/objdump.libc6-2.3 b/scripts/t/Dpkg_Shlibs/objdump.libc6-2.3
new file mode 100644
index 0000000..e761051
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.libc6-2.3
@@ -0,0 +1,2276 @@
+
+/lib/libc.so.6: file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x000161b0
+
+Program Header:
+ PHDR off 0x00000034 vaddr 0x00000034 paddr 0x00000034 align 2**2
+ filesz 0x00000120 memsz 0x00000120 flags r-x
+ INTERP off 0x0010f4a0 vaddr 0x0010f4a0 paddr 0x0010f4a0 align 2**0
+ filesz 0x00000013 memsz 0x00000013 flags r--
+ LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
+ filesz 0x00110208 memsz 0x00110208 flags r-x
+ LOAD off 0x00110c0c vaddr 0x00111c0c paddr 0x00111c0c align 2**12
+ filesz 0x00006300 memsz 0x00008d28 flags rw-
+ DYNAMIC off 0x00115d3c vaddr 0x00116d3c paddr 0x00116d3c align 2**2
+ filesz 0x000000e0 memsz 0x000000e0 flags rw-
+ NOTE off 0x00000154 vaddr 0x00000154 paddr 0x00000154 align 2**2
+ filesz 0x00000020 memsz 0x00000020 flags r--
+EH_FRAME off 0x0010f4b4 vaddr 0x0010f4b4 paddr 0x0010f4b4 align 2**2
+ filesz 0x00000d54 memsz 0x00000d54 flags r--
+ STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
+ filesz 0x00000000 memsz 0x00000000 flags rw-
+ RELRO off 0x00110c0c vaddr 0x00111c0c paddr 0x00111c0c align 2**5
+ filesz 0x00005200 memsz 0x00005200 flags r--
+
+Dynamic Section:
+ NEEDED ld-linux.so.2
+ SONAME libc.so.6
+ INIT 0x15280
+ FINI_ARRAY 0x1152d4
+ FINI_ARRAYSZ 0x4
+ HASH 0x174
+ STRTAB 0xbbc8
+ SYMTAB 0x3388
+ STRSZ 0x530f
+ SYMENT 0x10
+ PLTGOT 0x116ff4
+ PLTRELSZ 0xa8
+ PLTREL 0x11
+ JMPREL 0x14fe8
+ REL 0x122a0
+ RELSZ 0x2d48
+ RELENT 0x8
+ VERDEF 0x11fe0
+ VERDEFNUM 0x12
+ VERNEED 0x12250
+ VERNEEDNUM 0x1
+ VERSYM 0x10ed8
+ RELCOUNT 0x548
+
+Version definitions:
+1 0x01 0x0865f4e6 libc.so.6
+2 0x00 0x0d696910 GLIBC_2.0
+3 0x00 0x0d696911 GLIBC_2.1
+ GLIBC_2.0
+4 0x00 0x09691f71 GLIBC_2.1.1
+ GLIBC_2.1
+5 0x00 0x09691f72 GLIBC_2.1.2
+ GLIBC_2.1.1
+6 0x00 0x09691f73 GLIBC_2.1.3
+ GLIBC_2.1.2
+7 0x00 0x0d696912 GLIBC_2.2
+ GLIBC_2.1.3
+8 0x00 0x09691a71 GLIBC_2.2.1
+ GLIBC_2.2
+9 0x00 0x09691a72 GLIBC_2.2.2
+ GLIBC_2.2.1
+10 0x00 0x09691a73 GLIBC_2.2.3
+ GLIBC_2.2.2
+11 0x00 0x09691a74 GLIBC_2.2.4
+ GLIBC_2.2.3
+12 0x00 0x09691a76 GLIBC_2.2.6
+ GLIBC_2.2.4
+13 0x00 0x0d696913 GLIBC_2.3
+ GLIBC_2.2.6
+14 0x00 0x09691972 GLIBC_2.3.2
+ GLIBC_2.3
+15 0x00 0x09691973 GLIBC_2.3.3
+ GLIBC_2.3.2
+16 0x00 0x09691974 GLIBC_2.3.4
+ GLIBC_2.3.3
+17 0x00 0x0963cf85 GLIBC_PRIVATE
+ GLIBC_2.3.4
+18 0x00 0x0b792650 GCC_3.0
+
+Version References:
+ required from ld-linux.so.2:
+ 0x0d696911 0x00 22 GLIBC_2.1
+ 0x0d696913 0x00 21 GLIBC_2.3
+ 0x0963cf85 0x00 20 GLIBC_PRIVATE
+ 0x0d696910 0x00 19 GLIBC_2.0
+
+DYNAMIC SYMBOL TABLE:
+000151f0 l d .text 00000000 .text
+000f47a0 l d __libc_freeres_fn 00000000 __libc_freeres_fn
+000f5480 l d __libc_thread_freeres_fn 00000000 __libc_thread_freeres_fn
+000f5620 l d .rodata 00000000 .rodata
+0010f4a0 l d .interp 00000000 .interp
+0010f4b4 l d .eh_frame_hdr 00000000 .eh_frame_hdr
+00111c0c l d .eh_frame 00000000 .eh_frame
+001152d8 l d .ctors 00000000 .ctors
+001152e8 l d .dtors 00000000 .dtors
+001152f0 l d __libc_subfreeres 00000000 __libc_subfreeres
+00115344 l d __libc_atexit 00000000 __libc_atexit
+00115348 l d __libc_thread_subfreeres 00000000 __libc_thread_subfreeres
+00115360 l d .data.rel.ro 00000000 .data.rel.ro
+00117060 l d .data 00000000 .data
+00117f20 l d .bss 00000000 .bss
+000036fc g D *ABS* 00000000 Base __bss_start
+00056ef0 g DF .text 000000db GLIBC_2.2 getwchar
+0002c1e0 w DF .text 00000049 GLIBC_2.0 seed48_r
+000e3fc0 g DF .text 00000068 GLIBC_2.0 xdr_cryptkeyres
+000286a0 w DF .text 00000063 GLIBC_2.0 longjmp
+000579f0 g DF .text 000000fa GLIBC_2.0 putchar
+00069c20 w DF .text 00000041 GLIBC_2.0 stpcpy
+000b89f0 w DF .text 00000129 GLIBC_2.0 tsearch
+00117a10 g DO .data 00000004 GLIBC_2.0 __morecore
+001078f8 g DO .rodata 00000010 GLIBC_2.1 in6addr_any
+00085440 g DF .text 00000054 GLIBC_2.1 ntp_gettime
+000874d0 g DF .text 000000a8 GLIBC_2.0 setgrent
+0005fee0 g DF .text 00000028 GLIBC_2.0 _IO_remove_marker
+000be0a0 w DF .text 0000007d GLIBC_2.3 iswalpha_l
+00028900 g DF .text 0000013c GLIBC_PRIVATE __libc_sigaction
+000281d0 g DF .text 00000048 GLIBC_2.0 __isnanl
+000c60d0 g DF .text 00000033 GLIBC_2.3.2 pthread_cond_wait
+00015700 g DF .text 00000038 (GLIBC_2.0) __cmpdi2
+000ba670 g DF .text 00000036 (GLIBC_2.0) vm86
+000379e0 g DF .text 00000027 GLIBC_2.1 wcstoimax
+00053110 g DF .text 00000041 GLIBC_2.0 putw
+0006f110 w DF .text 00000048 GLIBC_2.0 mbrlen
+00068500 g DF .text 00000020 GLIBC_2.0 strcpy
+000b3be0 g DF .text 00000036 GLIBC_2.0 chroot
+000b7910 g DF .text 0000005e GLIBC_2.0 qgcvt
+00058900 g DF .text 000000db GLIBC_2.2 _IO_wdefault_xsgetn
+0007ad70 g DF .text 0000002d GLIBC_2.0 asctime
+000ee2b0 g DF .text 000000f0 GLIBC_PRIVATE _dl_vsym
+00060a60 g DF .text 00000115 GLIBC_2.0 _IO_link_in
+000ba2c0 g DF .text 00000066 GLIBC_2.2 __sysctl
+000c6110 g DF .text 0000003a GLIBC_2.3.2 pthread_cond_timedwait
+00118d40 g DO .bss 00000004 GLIBC_2.0 __daylight
+000b2c00 g DF .text 0000006a GLIBC_2.1 setrlimit64
+000d30b0 g DF .text 00000040 GLIBC_2.0 rcmd
+000efb40 g DF .text 00000096 GCC_3.0 _Unwind_Find_FDE
+0002a9a0 w DF .text 00000115 GLIBC_2.0 unsetenv
+00117d78 w DO .data 00000004 GLIBC_2.0 __malloc_hook
+0011732c g DO .data 00000004 GLIBC_2.0 h_nerr
+000d8a10 g DF .text 00000226 GLIBC_2.0 authunix_create
+00028850 w DF .text 00000046 GLIBC_2.0 gsignal
+000c5cf0 g DF .text 0000002a GLIBC_2.1 pthread_attr_init
+0005fd90 g DF .text 00000049 GLIBC_2.0 _IO_sputbackc
+00060cc0 g DF .text 000000a5 GLIBC_2.0 _IO_default_finish
+000b4170 g DF .text 0000002c GLIBC_2.2 mkstemp64
+00025bc0 w DF .text 000000f3 GLIBC_2.0 textdomain
+000dfe70 g DF .text 0000002a GLIBC_2.1.1 xdr_longlong_t
+000b9020 g DF .text 0000001d GLIBC_2.0 warnx
+000a28c0 g DF .text 000000f2 GLIBC_2.3.4 regexec
+00069960 w DF .text 0000001e GLIBC_2.0 bcmp
+000f2a60 g DF .text 0000005f (GLIBC_2.0) getgrgid_r
+00028630 g DF .text 00000038 GLIBC_2.0 setjmp
+00020870 g DF .text 0000050d (GLIBC_2.0) localeconv
+00022800 g DF .text 00000017 GLIBC_2.1 __isxdigit_l
+00118640 w DO .bss 00000004 GLIBC_2.0 __malloc_initialize_hook
+00066c00 g DF .text 00000021 GLIBC_2.0 __default_morecore
+000c6000 g DF .text 0000002a (GLIBC_2.0) pthread_cond_broadcast
+000891a0 w DF .text 0000007c GLIBC_2.0 waitpid
+00000000 g DO *ABS* 00000000 GCC_3.0 GCC_3.0
+001157a0 g DO .data.rel.ro 00000100 (GLIBC_2.1) sys_sigabbrev
+000d76d0 g DF .text 000000e1 GLIBC_2.3.3 inet6_option_alloc
+000e1210 g DF .text 00000195 GLIBC_2.0 xdrrec_create
+00000000 g DO *ABS* 00000000 GLIBC_2.2.6 GLIBC_2.2.6
+000e9700 g DF .text 00000015 GLIBC_2.1 fdetach
+000dda40 g DF .text 000000f7 GLIBC_2.0 xprt_register
+000ac030 g DF .text 00000032 (GLIBC_2.1) __lxstat64
+00089890 w DF .text 00000061 GLIBC_2.0 pause
+000b3130 w DF .text 0000003c GLIBC_2.0 ioctl
+000dbe00 g DF .text 00000675 GLIBC_2.0 clnt_broadcast
+000b35c0 w DF .text 00000072 GLIBC_2.0 writev
+00056450 g DF .text 0000012f GLIBC_2.0 _IO_setbuffer
+000ba9e0 g DF .text 00000036 GLIBC_2.0 get_kernel_syms
+000290b0 g DF .text 000000b9 GLIBC_2.0 siginterrupt
+00000000 DO *UND* 00000014 GLIBC_2.0 _r_debug
+000ebd40 g DF .text 00000021 GLIBC_2.1 pututxline
+0005ba90 w DF .text 0000003a GLIBC_2.0 vscanf
+000becc0 g DF .text 000003b8 GLIBC_2.0 putspent
+000cffb0 g DF .text 000000a2 GLIBC_2.0 getservent
+000d5810 g DF .text 0000009c GLIBC_2.1 if_indextoname
+000abfb0 g DF .text 00000032 (GLIBC_2.1) __xstat64
+000865f0 g DF .text 00000071 GLIBC_2.2 getdirentries64
+000280d0 w DF .text 00000082 GLIBC_2.0 ldexpf
+00069660 w DF .text 000000fe GLIBC_2.0 strtok_r
+00058040 g DF .text 0000007c GLIBC_2.2 _IO_wdoallocbuf
+000b7260 g DF .text 0000002e GLIBC_2.0 munlockall
+000cb740 g DF .text 0000008a GLIBC_2.0 __nss_hosts_lookup
+000e9ab0 w DF .text 00000068 GLIBC_2.0 getutid
+000ad4a0 g DF .text 00000035 GLIBC_2.1 chown
+0006e900 g DF .text 00000084 GLIBC_2.0 wcstok
+0008a470 w DF .text 0000000c GLIBC_2.0 getgid
+0008a430 g DF .text 00000008 GLIBC_2.0 __getpid
+000b9cc0 g DF .text 00000132 GLIBC_2.2 getloadavg
+000cc6f0 g DF .text 00000072 GLIBC_2.3.4 __strcpy_chk
+00054ca0 g DF .text 00000113 GLIBC_2.0 _IO_fread
+00060150 g DF .text 0000002d GLIBC_2.2 _IO_list_lock
+00087760 g DF .text 000001de GLIBC_2.1.2 getgrnam_r
+00043ce0 g DF .text 00000039 GLIBC_2.0 printf
+0008b0f0 w DF .text 00000673 GLIBC_2.0 sysconf
+0002dcb0 g DF .text 00000052 GLIBC_2.0 __strtod_internal
+001178e0 g DO .data 00000004 GLIBC_2.0 stdout
+000567f0 w DF .text 000000c4 GLIBC_2.0 vsprintf
+0002b740 w DF .text 00000062 GLIBC_2.0 random
+000b3970 g DF .text 00000094 GLIBC_2.0 __select
+000b4460 g DF .text 00000017 GLIBC_2.0 setfsent
+000abcf0 g DF .text 0000003a GLIBC_2.0 utime
+000f29f0 g DF .text 00000024 (GLIBC_2.1) versionsort64
+000dee30 g DF .text 0000027e GLIBC_2.0 svcudp_enablecache
+00070650 w DF .text 00000052 GLIBC_2.0 wcstof
+00118d40 w DO .bss 00000004 GLIBC_2.0 daylight
+00060de0 g DF .text 00000081 GLIBC_2.0 _IO_default_doallocate
+000f1830 g DF .text 000001bc (GLIBC_2.0) _IO_file_xsputn
+0006d3f0 g DF .text 00000038 GLIBC_2.1.1 __memset_gcn_by2
+0002c080 g DF .text 0000002e GLIBC_2.0 lrand48_r
+0005c8d0 g DF .text 0000003b GLIBC_2.2 __fsetlocking
+000b3790 w DF .text 00000039 GLIBC_2.0 getdtablesize
+00067fd0 g DF .text 00000021 GLIBC_2.0 _obstack_memory_used
+0002dbc0 w DF .text 0000002e GLIBC_2.1 __strtoull_l
+000b2390 g DF .text 00000010 GLIBC_2.0 cfgetospeed
+000e4100 g DF .text 0000003b GLIBC_2.1 xdr_netnamestr
+00057d10 w DF .text 000000f5 GLIBC_2.2 vswprintf
+000ce800 g DF .text 000000b2 GLIBC_2.0 sethostent
+000be020 w DF .text 0000007d GLIBC_2.3 iswalnum_l
+000d0200 g DF .text 000000ad GLIBC_2.0 setservent
+000f2640 g DF .text 0000018f (GLIBC_2.1) readdir64_r
+000d1ab0 g DF .text 00000060 GLIBC_2.0 __ivaliduser
+00021520 w DF .text 00000159 GLIBC_2.3 duplocale
+000e9580 g DF .text 0000001f GLIBC_2.1 isastream
+0005d0b0 g DF .text 0000003b GLIBC_2.0 putc_unlocked
+0008a810 g DF .text 000000dd GLIBC_2.0 getlogin
+00057f60 g DF .text 00000033 GLIBC_2.2 _IO_least_wmarker
+000c5c90 g DF .text 0000002a GLIBC_2.0 pthread_attr_destroy
+000540c0 g DF .text 00000251 GLIBC_2.1 _IO_fdopen
+000bb060 w DF .text 00000078 GLIBC_2.0 recv
+000ba030 g DF .text 0000003c GLIBC_2.3 llistxattr
+000baee0 w DF .text 00000078 GLIBC_2.0 connect
+000eede0 g DF .text 0000004e GLIBC_2.0 __register_frame
+00055ec0 g DF .text 0000008b GLIBC_2.1 _IO_popen
+000acf00 g DF .text 00000125 GLIBC_2.1 lockf64
+000567f0 g DF .text 000000c4 GLIBC_2.0 _IO_vsprintf
+00086070 g DF .text 000000cb GLIBC_2.2 readdir64
+000be3a0 w DF .text 0000007d GLIBC_2.3 iswprint_l
+00056710 w DF .text 000000d4 GLIBC_2.0 ungetc
+0002c5b0 g DF .text 00000059 GLIBC_2.0 __strtoull_internal
+000ebd10 g DF .text 00000021 GLIBC_2.1 getutxline
+000dd320 g DF .text 00000036 GLIBC_2.0 svcerr_auth
+000b2a30 g DF .text 000000a9 GLIBC_2.1 tcgetsid
+000d4570 g DF .text 00000052 GLIBC_2.0 endnetgrent
+00087340 g DF .text 000000db GLIBC_2.1.2 getgrent_r
+00000000 w D *UND* 00000000 __pthread_once
+00022700 g DF .text 00000015 GLIBC_2.1 __iscntrl_l
+00055a50 g DF .text 0000017d GLIBC_2.1 _IO_proc_close
+0002dbc0 w DF .text 0000002e GLIBC_2.3 strtoull_l
+00086560 g DF .text 00000024 GLIBC_2.2 versionsort64
+000d79a0 g DF .text 0000014d GLIBC_2.3.4 setipv4sourcefilter
+000e9b20 w DF .text 00000068 GLIBC_2.0 getutline
+00054320 g DF .text 000000eb GLIBC_2.0 _IO_fflush
+000582d0 g DF .text 00000082 GLIBC_2.2 _IO_seekwmark
+000cc6a0 g DF .text 00000047 GLIBC_2.3.4 __strcat_chk
+000d4b30 g DF .text 00000165 GLIBC_2.1.2 getaliasbyname_r
+000d0980 g DF .text 00000165 GLIBC_2.1.2 getrpcbynumber_r
+00116840 g DO .data.rel.ro 00000054 GLIBC_2.2 _IO_wfile_jumps
+00029200 g DF .text 00000034 GLIBC_2.0 sigemptyset
+000be2a0 w DF .text 0000007d GLIBC_2.3 iswlower_l
+00015430 w DF .text 00000016 GLIBC_2.1 gnu_get_libc_version
+0005c770 g DF .text 0000002c GLIBC_2.2 __fbufsize
+000b5190 w DF .text 000000ce GLIBC_2.0 utimes
+000ba990 g DF .text 00000042 GLIBC_2.3.2 epoll_wait
+000291d0 g DF .text 00000022 GLIBC_2.0 __sigdelset
+000579a0 g DF .text 0000004f GLIBC_2.2 putwchar_unlocked
+0005ad00 g DF .text 00000068 GLIBC_2.0 _IO_ferror
+000687f0 g DF .text 000000b2 GLIBC_2.0 strerror
+0008b770 w DF .text 00000201 GLIBC_2.0 fpathconf
+000e9690 g DF .text 00000048 GLIBC_2.1 putpmsg
+000540c0 g DF .text 00000251 GLIBC_2.1 fdopen
+000ddfd0 g DF .text 00000043 GLIBC_2.0 svc_exit
+0006e270 w DF .text 000000db GLIBC_2.2 memrchr
+00068780 w DF .text 00000064 GLIBC_2.0 strndup
+0008a460 w DF .text 0000000c GLIBC_2.0 geteuid
+000ba0b0 g DF .text 00000048 GLIBC_2.3 lsetxattr
+000c6ed0 g DF .text 000002b4 GLIBC_2.0 inet_pton
+000bb960 g DF .text 00000055 GLIBC_2.2 msgctl
+000f1520 g DF .text 00000101 (GLIBC_2.0) fsetpos
+0006f110 g DF .text 00000048 GLIBC_2.0 __mbrlen
+00065ed0 w DF .text 00000199 GLIBC_2.0 malloc_get_state
+0006af40 w DF .text 000000a4 GLIBC_2.0 argz_add_sep
+0006e120 g DF .text 00000071 GLIBC_2.1.1 __strncpy_by2
+000a4490 g DF .text 00000036 GLIBC_2.0 __sched_get_priority_max
+00115480 g DO .data.rel.ro 000001f8 GLIBC_2.3 sys_errlist
+00055bd0 g DF .text 000002e9 GLIBC_2.1 _IO_proc_open
+000e3d50 g DF .text 0000008f GLIBC_2.1 key_secretkey_is_set
+000d4710 g DF .text 000000db GLIBC_2.1.2 getaliasent_r
+00029590 g DF .text 00000067 GLIBC_PRIVATE __libc_allocate_rtsig_private
+00036f80 g DF .text 000000a4 GLIBC_2.0 __xpg_basename
+00028ec0 w DF .text 00000019 GLIBC_2.0 sigpause
+00069980 g DF .text 0000008d GLIBC_2.0 memmove
+000b9e30 g DF .text 00000042 GLIBC_2.3 fgetxattr
+000b8000 g DF .text 00000045 GLIBC_2.0 hsearch
+0006ddf0 g DF .text 0000003b GLIBC_2.1.1 __strpbrk_c2
+0011a820 g DO .bss 00000004 GLIBC_2.0 __rcmd_errstr
+000c6400 g DF .text 00000034 GLIBC_2.0 pthread_exit
+000a4310 g DF .text 00000045 GLIBC_2.0 getopt_long
+000e4a10 g DF .text 000001c6 GLIBC_2.1 authdes_getucred
+0005c8a0 g DF .text 0000002c GLIBC_2.2 __fpending
+00029880 g DF .text 00000074 GLIBC_2.1 sighold
+000ceed0 g DF .text 000000a9 GLIBC_2.0 endnetent
+00043d20 w DF .text 0000003b GLIBC_2.0 snprintf
+000b6d40 g DF .text 0000004d GLIBC_2.0 syscall
+000610f0 g DF .text 000000be GLIBC_2.0 _IO_default_xsgetn
+0008acd0 w DF .text 000001ea GLIBC_2.0 pathconf
+00069660 g DF .text 000000fe GLIBC_2.0 __strtok_r
+000b4d70 g DF .text 0000002a GLIBC_2.2 __endmntent
+000d1f40 g DF .text 0000009f GLIBC_2.2 ruserok_af
+000db810 g DF .text 0000013c GLIBC_2.0 pmap_set
+000b6fd0 w DF .text 0000003a GLIBC_2.0 munmap
+00022700 w DF .text 00000015 GLIBC_2.3 iscntrl_l
+000a43a0 g DF .text 0000003a GLIBC_2.0 __sched_getparam
+0005ad70 w DF .text 00000027 GLIBC_2.0 fileno_unlocked
+000bfab0 w DF .text 0000007a GLIBC_2.0 ulckpwdf
+000a43a0 w DF .text 0000003a GLIBC_2.0 sched_getparam
+000afea0 g DF .text 00000032 GLIBC_2.0 fts_set
+0007db40 w DF .text 0000056c GLIBC_2.1 getdate_r
+000286a0 w DF .text 00000063 GLIBC_2.0 _longjmp
+000b57a0 g DF .text 000004b7 GLIBC_2.0 getttyent
+000703b0 g DF .text 00000058 GLIBC_2.1 wcstoull
+0011a824 g DO .bss 00000004 GLIBC_2.0 rexecoptions
+0005c5f0 g DF .text 0000017a GLIBC_2.1 ftello64
+000caf70 g DF .text 000006a4 GLIBC_2.2.2 __nss_hostname_digits_dots
+000e7010 g DF .text 00000068 GLIBC_2.1 xdr_uint8_t
+000e08f0 g DF .text 00000032 GLIBC_2.0 xdrmem_create
+00069ba0 g DF .text 00000010 GLIBC_2.0 __ffs
+00029bb0 g DF .text 00000028 GLIBC_2.0 atol
+000bdfb0 g DF .text 0000006d GLIBC_2.1 __towupper_l
+00027bb0 g DF .text 00000027 GLIBC_2.0 __isnan
+000dcab0 g DF .text 00000033 GLIBC_2.0 xdr_des_block
+000f23c0 g DF .text 0000006f (GLIBC_2.0) _IO_file_init
+000d44a0 g DF .text 00000034 GLIBC_PRIVATE __internal_setnetgrent
+000e2660 g DF .text 0000002a GLIBC_2.1 ecb_crypt
+000acaa0 w DF .text 0000007c GLIBC_2.0 __write
+000dcaf0 g DF .text 00000062 GLIBC_2.0 xdr_opaque_auth
+000f1100 g DF .text 00000088 (GLIBC_2.0) popen
+000661b0 w DF .text 00000225 GLIBC_2.0 malloc_stats
+0005fa90 g DF .text 0000002a GLIBC_2.0 _IO_sgetn
+00070530 g DF .text 00000052 GLIBC_2.0 __wcstold_internal
+000b4390 g DF .text 00000030 GLIBC_2.0 endfsent
+000d38f0 g DF .text 00000445 GLIBC_2.0 ruserpass
+0005d000 w DF .text 00000028 GLIBC_2.0 getc_unlocked
+0011a5a0 g DO .bss 00000004 GLIBC_2.0 _nl_domain_bindings
+00086f30 g DF .text 00000125 GLIBC_2.0 getgrgid
+000890b0 w DF .text 00000036 GLIBC_2.0 times
+000d9240 g DF .text 000000dd GLIBC_2.0 clnt_spcreateerror
+000ac0f0 w DF .text 0000012f GLIBC_2.1 statfs64
+00027fb0 w DF .text 0000009a GLIBC_2.0 modff
+0011a6b8 g DO .bss 00000004 GLIBC_2.0 re_syntax_options
+000afe70 g DF .text 00000024 GLIBC_2.1 ftw64
+0002be50 g DF .text 00000037 GLIBC_2.0 nrand48
+000f3b50 g DF .text 00000031 (GLIBC_2.0) chown
+00037980 g DF .text 00000027 GLIBC_2.1 strtoimax
+0011a6e0 g DO .bss 00000004 GLIBC_2.1 argp_program_bug_address
+000cf210 g DF .text 00000125 GLIBC_2.0 getprotobynumber
+000d85d0 g DF .text 0000016c GLIBC_2.0 authunix_create_default
+000d3ed0 g DF .text 000001d2 GLIBC_PRIVATE __internal_getnetgrent_r
+000d93b0 g DF .text 00000090 GLIBC_2.0 clnt_perrno
+0002a780 g DF .text 000000ef GLIBC_2.0 getenv
+0005d470 g DF .text 0000003b GLIBC_2.0 _IO_file_seek
+0006e580 w DF .text 00000064 GLIBC_2.0 wcslen
+000bd4c0 w DF .text 000000d5 GLIBC_2.0 iswcntrl
+000be5a0 w DF .text 0000006d GLIBC_2.3 towlower_l
+000cc440 g DF .text 00000005 GLIBC_2.2 __cyg_profile_func_exit
+000ab0a0 w DF .text 00000094 GLIBC_2.1 pwrite64
+000ac7a0 w DF .text 0000003a GLIBC_2.0 fchmod
+000f21e0 g DF .text 00000063 (GLIBC_2.0) _IO_file_setbuf
+00087190 g DF .text 000001ac GLIBC_2.1 putgrent
+00104d78 g DO .rodata 00000004 (GLIBC_2.1) _sys_nerr
+000bd920 w DF .text 000000d5 GLIBC_2.0 iswpunct
+000674f0 g DF .text 000001e5 GLIBC_2.0 mtrace
+000b4e30 g DF .text 0000035f GLIBC_2.2 __getmntent_r
+000ba530 g DF .text 00000013 GLIBC_2.0 setfsuid
+0002ddd0 w DF .text 00000052 GLIBC_2.0 strtold
+0008a480 w DF .text 0000000c GLIBC_2.0 getegid
+00022640 g DF .text 0000007b GLIBC_2.0 isblank
+00115680 g DO .data.rel.ro 00000104 GLIBC_2.3.3 sys_siglist
+000ebc80 g DF .text 00000017 GLIBC_2.1 setutxent
+0005b7e0 g DF .text 00000038 GLIBC_2.0 setlinebuf
+0006a7d0 g DF .text 000000c6 GLIBC_2.1 __rawmemchr
+000b2f80 g DF .text 0000003c GLIBC_2.0 setpriority
+0002b2b0 g DF .text 0000000d GLIBC_2.0 labs
+000702f0 g DF .text 00000058 GLIBC_2.1 wcstoll
+00054a80 g DF .text 000000cc GLIBC_2.2 fopencookie
+000ab140 g DF .text 00000034 GLIBC_2.2 posix_spawn_file_actions_init
+000b2f30 g DF .text 00000042 GLIBC_2.0 getpriority
+000bd300 w DF .text 000000d5 GLIBC_2.0 iswalpha
+000557d0 w DF .text 0000016f GLIBC_2.0 gets
+000f2570 g DF .text 000000cb (GLIBC_2.1) readdir64
+000c85f0 g DF .text 00000029 GLIBC_2.2 __res_ninit
+000babe0 w DF .text 00000036 GLIBC_2.0 personality
+00000000 w D *UND* 00000000 __pthread_key_create
+000bd3e0 w DF .text 000000d5 GLIBC_2.1 iswblank
+0005fe70 g DF .text 0000006a GLIBC_2.0 _IO_init_marker
+0006a740 g DF .text 00000082 GLIBC_2.0 memmem
+0002c370 g DF .text 00000059 GLIBC_2.0 __strtol_internal
+0005f670 g DF .text 0000008f GLIBC_2.1 _IO_file_finish
+00000000 g DO *ABS* 00000000 GLIBC_2.3.4 GLIBC_2.3.4
+0008a710 w DF .text 00000035 GLIBC_2.0 getresuid
+00029e20 g DF .text 0000006c GLIBC_2.0 bsearch
+00029900 g DF .text 00000074 GLIBC_2.1 sigrelse
+000bc350 g DF .text 000001c1 GLIBC_2.0 __monstartup
+000b4250 g DF .text 0000003c GLIBC_2.0 usleep
+000f3b90 g DF .text 0000002b (GLIBC_2.1) nftw
+000f2490 g DF .text 000000d5 (GLIBC_2.0) _IO_file_close_it
+000ce670 g DF .text 000000da GLIBC_2.1.2 gethostent_r
+0006edd0 w DF .text 00000034 GLIBC_2.2 wmempcpy
+000cbf50 w DF .text 000002bd GLIBC_2.1 backtrace_symbols
+00117d88 g DO .data 00000008 GLIBC_2.0 __tzname
+00058490 g DF .text 00000054 GLIBC_2.2 __woverflow
+00117960 g DO .data 00000050 GLIBC_2.0 _IO_stdout_
+000e4610 g DF .text 0000005d GLIBC_2.1 getnetname
+00089a40 w DF .text 00000068 GLIBC_2.0 execve
+00117560 g DO .data 00000098 GLIBC_2.1 _IO_2_1_stdout_
+000cf7b0 g DF .text 00000125 GLIBC_2.0 getprotobyname
+00029560 g DF .text 00000027 GLIBC_2.1 __libc_current_sigrtmax
+00070410 g DF .text 00000059 GLIBC_2.0 __wcstoull_internal
+000568c0 w DF .text 00000093 GLIBC_2.0 vsscanf
+000bba10 g DF .text 0000004f GLIBC_2.0 semget
+000c5fd0 g DF .text 0000002a GLIBC_2.0 pthread_condattr_init
+000e6ec0 g DF .text 00000069 GLIBC_2.1 xdr_int16_t
+0006adb0 w DF .text 00000122 GLIBC_2.0 argz_insert
+0008a430 w DF .text 00000008 GLIBC_2.0 getpid
+000b3760 w DF .text 00000026 GLIBC_2.0 getpagesize
+00000000 w D *UND* 00000000 __pthread_rwlock_wrlock
+000d74b0 g DF .text 00000033 GLIBC_2.3.3 inet6_option_init
+0002bfe0 w DF .text 00000099 GLIBC_2.0 erand48_r
+000ba070 g DF .text 0000003a GLIBC_2.3 lremovexattr
+000ebda0 g DF .text 0000002a GLIBC_2.1 updwtmpx
+00035000 w DF .text 00000027 GLIBC_2.1 __strtold_l
+000dfdb0 g DF .text 000000bd GLIBC_2.1.1 xdr_u_hyper
+00054410 g DF .text 000001b8 GLIBC_2.2 _IO_fgetpos
+0006b410 g DF .text 00000042 GLIBC_2.0 envz_get
+000b8050 g DF .text 000001e0 GLIBC_2.0 hsearch_r
+000ad070 g DF .text 0000003a GLIBC_2.0 __dup2
+0002a630 g DF .text 00000147 GLIBC_2.0 qsort
+000d44e0 w DF .text 00000086 GLIBC_2.0 getnetgrent_r
+000d47f0 g DF .text 000000a6 GLIBC_2.0 endaliasent
+0006e870 g DF .text 00000035 GLIBC_2.0 wcsrchr
+000ad4e0 w DF .text 00000035 GLIBC_2.0 fchown
+000b5430 w DF .text 0000003a GLIBC_2.0 truncate
+0002bae0 w DF .text 00000103 GLIBC_2.0 setstate_r
+00052290 g DF .text 00000024 GLIBC_2.0 fscanf
+000e3ae0 g DF .text 00000073 GLIBC_2.1 key_decryptsession
+000545d0 w DF .text 00000151 GLIBC_2.0 fgets
+00060640 g DF .text 00000177 GLIBC_2.0 _IO_flush_all_linebuffered
+000b9af0 g DF .text 000000cb GLIBC_2.0 dirname
+000f2c20 g DF .text 00000e58 (GLIBC_2.1) glob64
+00073ea0 w DF .text 00000037 GLIBC_2.1 __wcstod_l
+00057bd0 g DF .text 00000036 GLIBC_2.2 vwprintf
+000bf2c0 g DF .text 00000165 GLIBC_2.1.2 getspnam_r
+000ced40 g DF .text 000000a4 GLIBC_2.0 getnetent
+0002c4f0 g DF .text 00000059 GLIBC_2.0 __strtoll_internal
+000f2a20 g DF .text 00000037 (GLIBC_2.0) getgrent_r
+000ba280 g DF .text 0000003a GLIBC_2.3.4 vm86
+000bd140 w DF .text 000000d5 GLIBC_2.0 iswxdigit
+0005a4f0 g DF .text 0000014c GLIBC_2.2 _IO_wdo_write
+000b3af0 g DF .text 000000a2 GLIBC_PRIVATE __libc_pselect
+0006e350 g DF .text 000000ac GLIBC_2.3.4 __xpg_strerror_r
+000d7590 g DF .text 000000c1 GLIBC_2.3.3 inet6_option_find
+00055380 w DF .text 0000024e GLIBC_2.0 __getdelim
+0006d650 g DF .text 0000003f GLIBC_2.1.1 __strcmp_gg
+000aca20 w DF .text 0000007c GLIBC_2.0 __read
+000b9380 w DF .text 00000185 GLIBC_2.0 error_at_line
+0006b620 g DF .text 000000fb GLIBC_2.0 envz_add
+000beb20 g DF .text 00000195 GLIBC_2.0 fgetspent
+000cea20 g DF .text 000001d0 GLIBC_2.1.2 getnetbyaddr_r
+000b7fd0 g DF .text 0000002d GLIBC_2.0 hcreate
+00087fe0 w DF .text 000000d2 GLIBC_2.0 getpw
+000e3be0 g DF .text 0000005a GLIBC_2.1 key_setsecret
+000abff0 g DF .text 00000032 (GLIBC_2.1) __fxstat64
+000b1610 g DF .text 0000005f GLIBC_2.3.3 posix_fadvise64
+000ccca0 g DF .text 000000ff GLIBC_2.3.4 __fprintf_chk
+00053270 g DF .text 0000002d GLIBC_2.0 _IO_funlockfile
+000f3e40 g DF .text 0000005f (GLIBC_2.0) getspnam_r
+000e3900 g DF .text 0000005f GLIBC_2.1 key_get_conv
+000c7280 g DF .text 00000287 GLIBC_2.0 inet_nsap_addr
+000ba100 g DF .text 0000003a GLIBC_2.3 removexattr
+0005b220 w DF .text 000000cc GLIBC_2.0 getc
+000227e0 w DF .text 00000017 GLIBC_2.3 isupper_l
+00057170 g DF .text 000000a2 GLIBC_2.2 fgetws_unlocked
+000bac60 w DF .text 00000048 GLIBC_2.0 prctl
+000f3bc0 g DF .text 0000002b (GLIBC_2.1) nftw64
+000be4a0 g DF .text 0000007d GLIBC_2.1 __iswspace_l
+000ad1e0 w DF .text 00000036 GLIBC_2.0 fchdir
+000580c0 g DF .text 00000075 GLIBC_2.2 _IO_switch_to_wget_mode
+000bb840 w DF .text 000000c4 GLIBC_2.0 msgrcv
+000bbb20 g DF .text 00000066 GLIBC_2.0 shmat
+00117d7c w DO .data 00000004 GLIBC_2.0 __realloc_hook
+000ba570 g DF .text 00000028 GLIBC_2.3.3 gnu_dev_major
+000a27a0 w DF .text 00000048 GLIBC_2.0 re_search_2
+00069ef0 g DF .text 00000046 GLIBC_2.0 memcpy
+00052700 g DF .text 0000009d GLIBC_2.1 tmpfile
+0007d9a0 w DF .text 0000003c GLIBC_2.0 setitimer
+0006e990 w DF .text 0000012c GLIBC_2.1 wcswcs
+000601e0 g DF .text 000000ee GLIBC_2.0 _IO_default_xsputn
+00104d78 g DO .rodata 00000004 (GLIBC_2.1) sys_nerr
+001179c0 g DO .data 00000050 GLIBC_2.0 _IO_stderr_
+000f2bc0 g DF .text 0000005f (GLIBC_2.0) getpwuid_r
+00029560 g DF .text 00000027 GLIBC_PRIVATE __libc_current_sigrtmax_private
+000dbb10 g DF .text 000001ae GLIBC_2.0 pmap_getport
+00056580 w DF .text 0000018f GLIBC_2.0 setvbuf
+0006aad0 w DF .text 0000003e GLIBC_2.0 argz_count
+00089da0 g DF .text 00000195 GLIBC_2.0 execl
+0006d500 g DF .text 00000031 GLIBC_2.1.1 __mempcpy_byn
+00085950 g DF .text 0000007a GLIBC_2.0 seekdir
+00055210 g DF .text 00000167 GLIBC_2.0 _IO_fwrite
+000a4510 w DF .text 0000003a GLIBC_2.0 sched_rr_get_interval
+0005b5a0 g DF .text 00000021 GLIBC_2.1 pclose
+0005fde0 g DF .text 0000004c GLIBC_2.0 _IO_sungetc
+000bb460 g DF .text 00000050 GLIBC_2.0 isfdtype
+00022820 g DF .text 00000011 GLIBC_2.1 __tolower_l
+0008c350 g DF .text 00000e58 GLIBC_2.0 glob
+000dd1e0 g DF .text 0000004e GLIBC_2.0 svc_sendreply
+000ebce0 g DF .text 00000021 GLIBC_2.1 getutxid
+00052410 g DF .text 000000c8 GLIBC_2.0 perror
+0001dc90 g DF .text 00000016 GLIBC_PRIVATE __gconv_get_cache
+000db460 g DF .text 0000002d GLIBC_2.0 _rpc_dtablesize
+000e3b60 g DF .text 00000073 GLIBC_2.1 key_encryptsession
+00000000 g DO *ABS* 00000000 GLIBC_2.1.1 GLIBC_2.1.1
+000c60a0 g DF .text 0000002a (GLIBC_2.0) pthread_cond_signal
+0006a600 g DF .text 0000003e GLIBC_2.0 swab
+00022580 g DF .text 00000015 GLIBC_2.1 __isblank_l
+0002d5c0 w DF .text 0000002e GLIBC_2.3 strtoll_l
+000ad0f0 w DF .text 00000078 GLIBC_2.0 creat
+00088970 g DF .text 000001de GLIBC_2.1.2 getpwuid_r
+000adf50 w DF .text 0000003c GLIBC_2.0 readlink
+00067440 g DF .text 00000005 GLIBC_2.0 tr_break
+000b2b20 g DF .text 00000032 GLIBC_2.2 setrlimit
+0006dbb0 g DF .text 000000b2 GLIBC_2.1.1 __stpcpy_small
+00027f20 w DF .text 00000024 GLIBC_2.0 isinff
+000b3970 w DF .text 00000094 GLIBC_PRIVATE __libc_select
+00059e40 g DF .text 00000233 GLIBC_2.2 _IO_wfile_overflow
+00065960 g DF .text 00000225 GLIBC_2.0 __libc_memalign
+000c6150 g DF .text 00000036 GLIBC_2.0 pthread_equal
+0005c7f0 g DF .text 00000013 GLIBC_2.2 __fwritable
+00055f50 w DF .text 0000017f GLIBC_2.0 puts
+000d4670 g DF .text 00000098 GLIBC_2.0 getnetgrent
+0002b1e0 g DF .text 000000b6 GLIBC_2.1.3 __cxa_finalize
+000611b0 g DF .text 00000067 GLIBC_2.0 __overflow
+0006d480 g DF .text 00000033 GLIBC_2.1.1 __mempcpy_by4
+000b8ff0 g DF .text 00000022 GLIBC_2.0 errx
+000ad070 w DF .text 0000003a GLIBC_2.0 dup2
+000f09a0 g DF .text 00000095 (GLIBC_2.0) _IO_fopen
+00029530 g DF .text 00000027 GLIBC_2.1 __libc_current_sigrtmin
+00022250 g DF .text 0000007d GLIBC_2.0 islower
+00070350 g DF .text 00000059 GLIBC_2.0 __wcstoll_internal
+000b95d0 g DF .text 00000068 GLIBC_2.0 ustat
+0006f160 w DF .text 0000024b GLIBC_2.0 mbrtowc
+000bb660 g DF .text 0000002c GLIBC_2.2.4 sockatmark
+00023d90 w DF .text 00000041 GLIBC_2.2 dngettext
+000b2940 g DF .text 00000033 GLIBC_2.0 tcflush
+00089bf0 g DF .text 000001ad GLIBC_2.0 execle
+00056960 g DF .text 000001a3 GLIBC_2.2 fgetpos64
+00053200 g DF .text 0000002d GLIBC_2.0 _IO_flockfile
+0005c820 g DF .text 00000076 GLIBC_2.2 __fpurge
+00021f60 g DF .text 00000068 GLIBC_2.0 tolower
+0008a450 w DF .text 0000000c GLIBC_2.0 getuid
+000b6010 g DF .text 000002f6 GLIBC_2.0 getpass
+0006aa80 w DF .text 00000047 GLIBC_2.0 argz_add
+00022ec0 w DF .text 00000023 GLIBC_2.0 dgettext
+00027b80 g DF .text 0000002d GLIBC_2.0 __isinf
+000858d0 g DF .text 00000077 GLIBC_2.0 rewinddir
+000b2980 g DF .text 00000077 GLIBC_2.0 tcsendbreak
+000bd680 w DF .text 000000d5 GLIBC_2.0 iswlower
+0006dee0 g DF .text 00000063 GLIBC_2.1.1 __strsep_2c
+0002bfb0 g DF .text 0000002e GLIBC_2.0 drand48_r
+00035550 w DF .text 0000007d GLIBC_2.0 system
+0005ac90 w DF .text 00000068 GLIBC_2.0 feof
+00057010 g DF .text 00000151 GLIBC_2.2 fgetws
+000b4870 w DF .text 00000083 GLIBC_2.0 hasmntopt
+000dd0f0 g DF .text 00000039 GLIBC_2.2.3 __rpc_thread_svc_max_pollfd
+0005e190 g DF .text 00000032 GLIBC_2.0 _IO_file_close
+0006e820 g DF .text 00000041 GLIBC_2.0 wcspbrk
+0006aee0 w DF .text 00000054 GLIBC_2.0 argz_stringify
+000701d0 g DF .text 00000058 GLIBC_2.0 wcstol
+00022820 w DF .text 00000011 GLIBC_2.3 tolower_l
+00067d40 g DF .text 000000ba GLIBC_2.0 _obstack_begin_1
+000dde40 g DF .text 0000009d GLIBC_2.0 svcraw_create
+00065780 g DF .text 000001d4 GLIBC_2.0 malloc
+0011a5a4 g DO .bss 00000004 GLIBC_2.0 _nl_msg_cat_cntr
+00053160 g DF .text 00000057 GLIBC_2.0 remove
+000ac840 w DF .text 0000007c GLIBC_2.0 __open
+0005fff0 g DF .text 00000036 GLIBC_2.0 _IO_unsave_markers
+000155f0 g DF .text 0000002a (GLIBC_2.0) __floatdidf
+000ade90 w DF .text 00000032 GLIBC_2.0 isatty
+000ab520 g DF .text 0000004e GLIBC_2.2 posix_spawn
+000b23a0 g DF .text 00000018 GLIBC_2.0 cfgetispeed
+000bdf30 w DF .text 0000007d GLIBC_2.3 iswxdigit_l
+00022ec0 g DF .text 00000023 GLIBC_2.0 __dgettext
+000a2a10 g DF .text 000003af GLIBC_2.0 confstr
+0006e010 g DF .text 00000045 GLIBC_2.1.1 __strcat_c
+000bda00 w DF .text 000000d5 GLIBC_2.0 iswspace
+00000000 g DO *ABS* 00000000 GLIBC_2.1 GLIBC_2.1
+00088630 g DF .text 000000a6 GLIBC_2.0 endpwent
+000286a0 w DF .text 00000063 GLIBC_2.0 siglongjmp
+00054dc0 g DF .text 00000131 GLIBC_2.2 fsetpos
+000c5f20 g DF .text 00000033 GLIBC_2.0 pthread_attr_getscope
+000dea50 g DF .text 000002a5 GLIBC_2.0 svctcp_create
+001174c0 g DO .data 00000098 GLIBC_2.1 _IO_2_1_stdin_
+00089640 w DF .text 0000024e GLIBC_2.0 sleep
+000f0a40 g DF .text 000001c7 (GLIBC_2.0) fdopen
+0011a6bc g DO .bss 00000004 GLIBC_2.0 optarg
+00022780 g DF .text 00000017 GLIBC_2.1 __isprint_l
+000a43e0 w DF .text 0000003c GLIBC_2.0 sched_setscheduler
+00043da0 g DF .text 00000034 GLIBC_2.1 __asprintf
+000688b0 g DF .text 00000154 GLIBC_2.0 __strerror_r
+00069b60 g DF .text 00000032 GLIBC_2.0 __bzero
+0006ee10 w DF .text 0000017c GLIBC_2.0 btowc
+000bada0 g DF .text 00000036 GLIBC_2.0 sysinfo
+00027e80 w DF .text 00000083 GLIBC_2.0 ldexp
+0011a6d0 g DO .bss 00000004 GLIBC_2.0 loc2
+0002c550 g DF .text 00000058 GLIBC_2.0 strtoll
+0005bb50 w DF .text 000000f5 GLIBC_2.0 vsnprintf
+00080aa0 g DF .text 00001e8b GLIBC_2.3 __strftime_l
+000e3f30 g DF .text 0000008f GLIBC_2.1 xdr_unixcred
+00015be0 g DF .text 00000113 GLIBC_2.1 iconv_open
+00115480 g DO .data.rel.ro 000001ec (GLIBC_2.0) sys_errlist
+0002c5b0 g DF .text 00000059 (GLIBC_2.0) __strtouq_internal
+000e2410 g DF .text 0000006b GLIBC_2.1 authdes_create
+0007a030 w DF .text 00000063 GLIBC_2.3 wcscasecmp_l
+000ce0c0 g DF .text 0000027e GLIBC_2.1.2 gethostbyname2_r
+0006d580 g DF .text 0000003c GLIBC_2.1.1 __strncpy_gg
+0005b3d0 g DF .text 000000c2 GLIBC_2.0 open_memstream
+000e4180 g DF .text 00000032 GLIBC_2.0 xdr_keystatus
+0011a4cc g DO .bss 00000004 GLIBC_PRIVATE _dl_open_hook
+000bb0e0 w DF .text 00000078 GLIBC_2.0 recvfrom
+00117dd4 g DO .data 00000014 GLIBC_2.0 h_errlist
+000b2850 w DF .text 000000a8 GLIBC_2.0 tcdrain
+000dd280 g DF .text 00000042 GLIBC_2.0 svcerr_decode
+000e0480 g DF .text 00000166 GLIBC_2.0 xdr_bytes
+000ede60 g DF .text 00000033 GLIBC_2.1 _dl_mcount_wrapper
+000379b0 g DF .text 00000027 GLIBC_2.1 strtoumax
+000f0a40 g DF .text 000001c7 (GLIBC_2.0) _IO_fdopen
+000ac070 w DF .text 0000003a GLIBC_2.0 statfs
+000e6ca0 g DF .text 000000d3 GLIBC_2.1.1 xdr_int64_t
+0006e6b0 g DF .text 000000bf GLIBC_2.0 wcsncmp
+00089ab0 g DF .text 000000f1 GLIBC_2.0 fexecve
+000c9960 g DF .text 00000360 GLIBC_PRIVATE __nss_lookup_function
+000bac20 g DF .text 0000003a GLIBC_2.2.1 pivot_root
+000ebdd0 g DF .text 00000033 GLIBC_2.1.1 getutmpx
+0006d9a0 g DF .text 00000036 GLIBC_2.1.1 __strstr_cg
+00000000 w D *UND* 00000000 __pthread_rwlock_rdlock
+000225a0 g DF .text 00000042 GLIBC_2.0 _toupper
+000e0cf0 g DF .text 0000005d GLIBC_2.0 xdrrec_endofrecord
+000286a0 g DF .text 00000063 GLIBC_PRIVATE __libc_longjmp
+0002b910 w DF .text 000000b9 GLIBC_2.0 random_r
+0002c490 g DF .text 00000058 GLIBC_2.0 strtoul
+0006c810 w DF .text 00000a85 GLIBC_2.3 strxfrm_l
+000bcb80 w DF .text 000004b8 GLIBC_2.2.3 sprofil
+000e9720 w DF .text 00000068 GLIBC_2.0 getutent
+00061f40 g DF .text 000000a5 GLIBC_PRIVATE __libc_malloc_pthread_startup
+00070e50 w DF .text 0000003e GLIBC_2.1 __wcstoul_l
+000a4420 w DF .text 00000036 GLIBC_2.0 sched_getscheduler
+0006e990 g DF .text 0000012c GLIBC_2.0 wcsstr
+00057c50 g DF .text 0000003f GLIBC_2.2 wscanf
+00085740 w DF .text 0000018f GLIBC_2.0 readdir_r
+000ebcc0 g DF .text 00000017 GLIBC_2.1 endutxent
+000b4100 g DF .text 0000003e GLIBC_2.0 mktemp
+00035000 w DF .text 00000027 GLIBC_2.3 strtold_l
+00057fa0 g DF .text 0000002b GLIBC_2.2 _IO_switch_to_main_wget_area
+000ba630 w DF .text 0000003c GLIBC_2.1 modify_ldt
+000223d0 g DF .text 0000007b GLIBC_2.0 ispunct
+000c6500 g DF .text 00000048 GLIBC_PRIVATE __libc_pthread_init
+0007b830 w DF .text 0000003a GLIBC_2.0 settimeofday
+000cd920 g DF .text 00000162 GLIBC_2.0 gethostbyaddr
+00022780 w DF .text 00000017 GLIBC_2.3 isprint_l
+00022e70 g DF .text 00000043 GLIBC_2.0 __dcgettext
+0002b690 g DF .text 000000a3 GLIBC_2.0 wctomb
+00027f70 w DF .text 00000011 GLIBC_2.0 finitef
+0006a720 g DF .text 0000001b GLIBC_2.0 memfrob
+00067e00 g DF .text 00000199 GLIBC_2.0 _obstack_newchunk
+000702f0 w DF .text 00000058 GLIBC_2.0 wcstoq
+00054f00 g DF .text 000001d8 GLIBC_2.0 _IO_ftell
+00080aa0 w DF .text 00001e8b GLIBC_2.3 strftime_l
+0011728c g DO .data 00000004 GLIBC_2.0 opterr
+000d8e80 g DF .text 000002dc GLIBC_2.0 clnt_create
+00029070 w DF .text 0000003a GLIBC_2.0 sigaltstack
+000616c0 g DF .text 0000004e GLIBC_2.0 _IO_str_init_readonly
+000adfd0 w DF .text 00000036 GLIBC_2.0 rmdir
+0007b870 w DF .text 00000119 GLIBC_2.0 adjtime
+000ba780 g DF .text 00000036 GLIBC_2.0 __adjtimex
+0002b640 g DF .text 00000046 GLIBC_2.0 wcstombs
+00027df0 w DF .text 0000000d GLIBC_2.1 scalbln
+0006d9e0 g DF .text 00000046 GLIBC_2.1.1 __strstr_g
+000bf830 w DF .text 00000082 GLIBC_2.0 sgetspent_r
+000226c0 w DF .text 00000015 GLIBC_2.3 isalnum_l
+000bb3e0 w DF .text 00000039 GLIBC_2.0 socket
+000b3970 w DF .text 00000094 GLIBC_2.0 select
+000baa20 g DF .text 00000048 GLIBC_2.0 init_module
+000efc80 g DF .text 0000007c GLIBC_2.0 __frame_state_for
+00000000 w D *UND* 00000000 _pthread_cleanup_pop_restore
+00027f70 g DF .text 00000011 GLIBC_2.0 __finitef
+00085670 w DF .text 000000cb GLIBC_2.0 readdir
+0005c810 g DF .text 0000000f GLIBC_2.2 __flbf
+000ac0b0 w DF .text 0000003a GLIBC_2.0 fstatfs
+000581e0 g DF .text 0000003f GLIBC_2.2 _IO_adjust_wcolumn
+000ad520 w DF .text 00000035 GLIBC_2.0 lchown
+0006ed00 w DF .text 000000c8 GLIBC_2.0 wcpncpy
+000e21e0 g DF .text 00000228 GLIBC_2.1 authdes_pk_create
+000a2880 w DF .text 00000039 GLIBC_2.0 re_match
+00086e40 g DF .text 00000032 GLIBC_2.0 setgroups
+000dc610 g DF .text 00000100 GLIBC_2.0 pmap_rmtcall
+0002b070 g DF .text 00000036 GLIBC_PRIVATE __on_exit
+0002c430 g DF .text 00000059 GLIBC_2.0 __strtoul_internal
+00061290 g DF .text 0000015c GLIBC_2.0 _IO_str_seekoff
+00065520 w DF .text 00000147 GLIBC_2.0 pvalloc
+000ba8c0 g DF .text 0000003c GLIBC_2.0 delete_module
+0005e560 g DF .text 0000055b GLIBC_2.1 _IO_file_seekoff
+000d96f0 g DF .text 00000094 GLIBC_2.0 clnt_perror
+0005cf90 g DF .text 0000000b GLIBC_2.0 clearerr_unlocked
+000d05c0 g DF .text 000000e2 GLIBC_2.1.2 getrpcent_r
+000d1fe0 g DF .text 00000031 GLIBC_2.0 ruserok
+0011a6c4 g DO .bss 00000004 GLIBC_2.0 error_message_count
+00022450 g DF .text 0000007d GLIBC_2.0 isspace
+00057cd0 g DF .text 0000003a GLIBC_2.2 vwscanf
+000c5da0 g DF .text 00000033 GLIBC_2.0 pthread_attr_getinheritsched
+00119118 w DO .bss 00000004 GLIBC_2.0 ___brk_addr
+000f4490 g DF .text 00000037 (GLIBC_2.0) getaliasent_r
+00000000 w D *UND* 00000000 __pthread_rwlock_unlock
+000b8280 g DF .text 000000ce GLIBC_2.0 hcreate_r
+00022840 w DF .text 00000011 GLIBC_2.3 toupper_l
+000bf8c0 w DF .text 000001d7 GLIBC_2.0 fgetspent_r
+00069a70 g DF .text 00000044 GLIBC_2.1 mempcpy
+000b0d70 g DF .text 00000273 GLIBC_2.0 fts_open
+00043ce0 g DF .text 00000039 GLIBC_2.0 _IO_printf
+00062aa0 g DF .text 00000087 GLIBC_2.0 __libc_mallinfo
+000156c0 g DF .text 00000038 (GLIBC_2.0) __ucmpdi2
+00054320 w DF .text 000000eb GLIBC_2.0 fflush
+001190fc w DO .bss 00000004 GLIBC_2.0 _environ
+0011a6b4 g DO .bss 00000004 GLIBC_2.1 getdate_err
+0008a660 g DF .text 00000013 GLIBC_2.0 __bsd_getpgrp
+000ad170 g DF .text 00000023 GLIBC_2.1 creat64
+000dfba0 g DF .text 0000000a GLIBC_2.0 xdr_void
+000e4140 g DF .text 0000003b GLIBC_2.0 xdr_keybuf
+000e6ca0 g DF .text 000000d3 GLIBC_2.3.4 xdr_quad_t
+00022e30 w DF .text 00000015 GLIBC_2.2 bind_textdomain_codeset
+000abc90 g DF .text 00000018 GLIBC_2.2 posix_madvise
+000c4600 w DF .text 000001b5 GLIBC_2.1 argp_error
+000aae90 g DF .text 00000082 GLIBC_PRIVATE __libc_pwrite
+000f4430 g DF .text 0000005f (GLIBC_2.0) getrpcbynumber_r
+000d0810 g DF .text 00000165 GLIBC_2.1.2 getrpcbyname_r
+000f42e0 g DF .text 00000066 (GLIBC_2.0) getservbyport_r
+000b5470 w DF .text 0000003a GLIBC_2.0 ftruncate
+000d12a0 g DF .text 00000158 GLIBC_2.0 ether_ntohost
+00027f50 w DF .text 00000018 GLIBC_2.0 isnanf
+000b42d0 g DF .text 00000032 GLIBC_2.0 stty
+000dbcc0 g DF .text 00000077 GLIBC_2.0 xdr_pmap
+0005eac0 g DF .text 000000da GLIBC_2.1 _IO_file_sync
+000f43d0 g DF .text 0000005f (GLIBC_2.0) getrpcbyname_r
+000baba0 g DF .text 0000003c GLIBC_2.0 nfsservctl
+000dd3d0 g DF .text 0000004e GLIBC_2.0 svcerr_progvers
+0006d320 g DF .text 00000031 GLIBC_2.1.1 __memcpy_g
+00028770 w DF .text 000000da GLIBC_2.0 ssignal
+000be720 g DF .text 00000071 GLIBC_2.2 __wctrans_l
+00086670 g DF .text 0000018a GLIBC_2.0 fgetgrent
+0008b9f0 w DF .text 00000082 GLIBC_2.0 glob_pattern_p
+000ba330 g DF .text 0000008e GLIBC_2.0 __clone
+000dd230 g DF .text 00000042 GLIBC_2.0 svcerr_noproc
+00056ec0 w DF .text 0000002a GLIBC_2.2 getwc_unlocked
+0006dc70 g DF .text 00000039 GLIBC_2.1.1 __strcspn_c1
+00057870 g DF .text 00000038 GLIBC_2.2 putwc_unlocked
+00000000 w D *UND* 00000000 __pthread_kill_other_threads_np
+000f1260 g DF .text 00000124 (GLIBC_2.0) _IO_fgetpos
+00015aa0 g DF .text 00000035 (GLIBC_2.0) __udivdi3
+000f29c0 g DF .text 00000024 (GLIBC_2.1) alphasort64
+000d0360 g DF .text 00000125 GLIBC_2.0 getrpcbyname
+0002b520 g DF .text 00000046 GLIBC_2.0 mbstowcs
+0002a870 g DF .text 00000091 GLIBC_2.0 putenv
+0006ab10 w DF .text 000000a3 GLIBC_2.0 argz_create
+000acb20 w DF .text 0000003c GLIBC_2.0 lseek
+00065c60 g DF .text 0000021c GLIBC_2.0 __libc_realloc
+00020e00 g DF .text 00000049 GLIBC_2.2 __nl_langinfo_l
+0006ebd0 w DF .text 00000058 GLIBC_2.0 wmemcpy
+00029270 g DF .text 00000040 GLIBC_2.0 sigaddset
+000ba5a0 g DF .text 0000001d GLIBC_2.3.3 gnu_dev_minor
+000159e0 g DF .text 000000ba (GLIBC_2.0) __moddi3
+00028c20 g DF .text 00000066 GLIBC_PRIVATE __libc_sigwait
+0002a910 w DF .text 00000082 GLIBC_2.0 clearenv
+001190fc g DO .bss 00000004 GLIBC_2.0 __environ
+0005f700 g DF .text 0000019b GLIBC_2.1 _IO_file_close_it
+00020870 g DF .text 0000050d GLIBC_2.2 localeconv
+000890f0 w DF .text 000000a9 GLIBC_2.0 __wait
+000ab4f0 g DF .text 00000012 GLIBC_2.2 posix_spawnattr_getpgroup
+000b6f00 w DF .text 0000005e GLIBC_2.0 mmap
+00057e90 g DF .text 000000a0 GLIBC_2.2 vswscanf
+000e1970 g DF .text 000000ef GLIBC_2.0 getsecretkey
+00069d80 w DF .text 00000085 GLIBC_2.0 strncasecmp
+00089a28 w DF .text 00000013 GLIBC_2.1.1 _Exit
+00117280 g DO .data 00000004 GLIBC_2.0 obstack_exit_failure
+000e05f0 g DF .text 00000050 GLIBC_2.0 xdr_vector
+000dd4d0 g DF .text 000001f7 GLIBC_2.2 svc_getreq_common
+0002caf0 w DF .text 0000002e GLIBC_2.3 strtol_l
+0006fd70 w DF .text 0000034d GLIBC_2.0 wcsnrtombs
+000dc480 g DF .text 000000fe GLIBC_2.0 xdr_rmtcall_args
+000cf560 g DF .text 000000e2 GLIBC_2.1.2 getprotoent_r
+000d30f0 g DF .text 000005d3 GLIBC_2.2 rexec_af
+00069b60 w DF .text 00000032 GLIBC_2.0 bzero
+0006da30 g DF .text 000000df GLIBC_2.1.1 __mempcpy_small
+0005c7d0 g DF .text 00000013 GLIBC_2.2 __freadable
+0008a610 w DF .text 0000003a GLIBC_2.0 setpgid
+000eb230 w DF .text 000000f3 GLIBC_2.2.1 posix_openpt
+000bb1e0 w DF .text 00000078 GLIBC_2.0 send
+000b38b0 g DF .text 00000074 GLIBC_2.0 getdomainname
+00104d74 g DO .rodata 00000004 (GLIBC_2.0) _sys_nerr
+000dd420 g DF .text 00000036 GLIBC_2.0 svc_getreq
+00056450 w DF .text 0000012f GLIBC_2.0 setbuffer
+000a4710 g DF .text 00000042 GLIBC_2.0 freeaddrinfo
+000e6400 g DF .text 00000012 GLIBC_2.1 svcunixfd_create
+00029c10 g DF .text 00000210 GLIBC_2.0 abort
+00071940 w DF .text 0000003e GLIBC_2.1 __wcstoull_l
+000cf650 g DF .text 000000a6 GLIBC_2.0 endprotoent
+000eb330 w DF .text 00000031 GLIBC_2.1 getpt
+00022800 w DF .text 00000017 GLIBC_2.3 isxdigit_l
+000e9c70 w DF .text 00000072 GLIBC_2.0 getutline_r
+0002c0b0 w DF .text 00000054 GLIBC_2.0 nrand48_r
+000dd8e0 g DF .text 000000b5 GLIBC_2.0 xprt_unregister
+0006b380 g DF .text 00000081 GLIBC_2.0 envz_entry
+000ba940 g DF .text 00000042 GLIBC_2.3.2 epoll_ctl
+000c5ea0 g DF .text 00000033 GLIBC_2.0 pthread_attr_getschedpolicy
+00115680 g DO .data.rel.ro 00000100 (GLIBC_2.1) sys_siglist
+00000000 DO *UND* 00000438 GLIBC_PRIVATE _rtld_global
+00069ba0 w DF .text 00000010 GLIBC_2.1 ffsl
+00078520 w DF .text 0000004b GLIBC_2.0 wcscoll
+000be610 w DF .text 0000008c GLIBC_2.3 wctype_l
+000ecf50 g DF .text 00000a90 GLIBC_PRIVATE _dl_close
+00020e90 g DF .text 0000068a GLIBC_2.1 __newlocale
+000ebd70 g DF .text 00000021 GLIBC_2.1 utmpxname
+00056ec0 w DF .text 0000002a GLIBC_2.2 fgetwc_unlocked
+0003f2d0 g DF .text 000024e5 GLIBC_2.0 __printf_fp
+00117d88 w DO .data 00000008 GLIBC_2.0 tzname
+0007aee0 w DF .text 00000030 GLIBC_2.0 gmtime_r
+0002bf40 g DF .text 00000039 GLIBC_2.0 seed48
+000ac760 w DF .text 0000003a GLIBC_2.0 chmod
+000d4fb0 g DF .text 0000085d GLIBC_2.1 getnameinfo
+00079660 w DF .text 000008f6 GLIBC_2.3 wcsxfrm_l
+00053230 w DF .text 00000032 GLIBC_2.0 ftrylockfile
+0002b9d0 w DF .text 0000010e GLIBC_2.0 srandom_r
+00021fd0 g DF .text 0000007d GLIBC_2.0 isxdigit
+000b8600 w DF .text 000003eb GLIBC_2.0 tdelete
+000d77c0 g DF .text 00000075 GLIBC_2.3.3 inet6_option_append
+00054b50 g DF .text 00000146 GLIBC_2.0 _IO_fputs
+0008a5d0 g DF .text 00000036 GLIBC_2.0 __getpgid
+000abbd0 g DF .text 0000003a GLIBC_2.2 posix_spawnattr_getschedparam
+0011a6c8 g DO .bss 00000004 GLIBC_2.0 error_print_progname
+000dffb0 g DF .text 0000004e GLIBC_2.0 xdr_char
+0006d7f0 g DF .text 00000035 GLIBC_2.1.1 __strcspn_cg
+0005f620 g DF .text 00000047 GLIBC_2.1 _IO_file_init
+00089600 g DF .text 00000036 GLIBC_2.0 alarm
+0005c7a0 g DF .text 0000001a GLIBC_2.2 __freading
+00061440 g DF .text 00000042 GLIBC_2.0 _IO_str_pbackfail
+000d9320 g DF .text 00000090 GLIBC_2.0 clnt_pcreateerror
+00055ec0 g DF .text 0000008b GLIBC_2.1 popen
+000f5480 g DF __libc_thread_freeres_fn 00000041 GLIBC_PRIVATE __libc_thread_freeres
+00059430 g DF .text 000001c6 GLIBC_2.2 _IO_wfile_xsputn
+000b71a0 g DF .text 0000003a GLIBC_2.0 mlock
+000b3ba0 g DF .text 00000036 GLIBC_2.0 acct
+000f3f80 g DF .text 00000066 (GLIBC_2.0) gethostbyname_r
+0005eba0 g DF .text 000001eb GLIBC_2.1 _IO_file_overflow
+000ca560 g DF .text 000000b0 GLIBC_2.0 __nss_next
+000e5590 g DF .text 000000bb GLIBC_2.1 xdecrypt
+000808f0 w DF .text 00000045 GLIBC_2.3.2 strptime_l
+00089570 g DF .text 00000082 GLIBC_PRIVATE __libc_waitid
+000b3110 g DF .text 00000015 GLIBC_2.0 sstk
+0007a030 g DF .text 00000063 GLIBC_2.1 __wcscasecmp_l
+00021680 g DF .text 00000084 GLIBC_2.1 __freelocale
+0002c550 w DF .text 00000058 GLIBC_2.0 strtoq
+0002c3d0 g DF .text 00000058 GLIBC_2.0 strtol
+000285a0 g DF .text 0000002f GLIBC_2.0 __sigsetjmp
+000afe20 g DF .text 00000041 GLIBC_2.3.3 nftw64
+000ad0b0 w DF .text 00000036 GLIBC_2.0 pipe
+000cc670 g DF .text 0000002d GLIBC_2.3.4 __stpcpy_chk
+000dc580 g DF .text 00000087 GLIBC_2.0 xdr_rmtcallres
+000d0d60 g DF .text 00000157 GLIBC_2.0 ether_hostton
+000cc210 g DF .text 0000022e GLIBC_2.1 __backtrace_symbols_fd
+000b2d90 g DF .text 00000072 GLIBC_2.0 vlimit
+0008a650 g DF .text 00000008 GLIBC_2.0 getpgrp
+00068ac0 g DF .text 000000b7 GLIBC_2.0 strnlen
+000ba6b0 g DF .text 0000003a (GLIBC_2.0) getrlimit
+0006a7d0 w DF .text 000000c6 GLIBC_2.1 rawmemchr
+000704d0 w DF .text 00000052 GLIBC_2.0 wcstod
+000ce8c0 g DF .text 00000157 GLIBC_2.0 getnetbyaddr
+000e0850 g DF .text 000000a0 GLIBC_2.0 xdr_double
+00027f10 g DF .text 0000000f GLIBC_2.1 __signbit
+0002b440 g DF .text 000000d2 GLIBC_2.0 mblen
+00022740 w DF .text 00000017 GLIBC_2.3 islower_l
+000ba800 g DF .text 0000003a GLIBC_2.1 capget
+000ab3e0 g DF .text 00000034 GLIBC_2.2 posix_spawnattr_init
+000abe90 g DF .text 0000008d GLIBC_2.0 __lxstat
+00089070 w DF .text 00000036 GLIBC_2.0 uname
+000bd840 w DF .text 000000d5 GLIBC_2.0 iswprint
+00020e90 w DF .text 0000068a GLIBC_2.3 newlocale
+00079660 g DF .text 000008f6 GLIBC_2.1 __wcsxfrm_l
+000bae20 w DF .text 00000078 GLIBC_2.0 accept
+00029590 g DF .text 00000067 GLIBC_2.1 __libc_allocate_rtsig
+000b8fc0 g DF .text 00000023 GLIBC_2.0 verrx
+00035ae0 g DF .text 00000066 GLIBC_2.0 a64l
+000c6190 g DF .text 0000003a GLIBC_2.0 pthread_getschedparam
+000eeda0 g DF .text 0000003f GLIBC_2.0 __register_frame_table
+000b23c0 g DF .text 0000005c GLIBC_2.0 cfsetispeed
+000f1390 g DF .text 00000181 (GLIBC_2.1) _IO_fgetpos64
+000e6e40 g DF .text 0000003f GLIBC_2.1 xdr_int32_t
+000eaf60 w DF .text 00000103 GLIBC_2.0 utmpname
+00056b40 g DF .text 00000137 GLIBC_2.2 _IO_fsetpos64
+0006a480 g DF .text 00000179 GLIBC_2.1 __strcasestr
+000b8230 g DF .text 00000049 GLIBC_2.0 hdestroy_r
+000531c0 g DF .text 0000003a GLIBC_2.0 rename
+00022860 g DF .text 00000048 GLIBC_2.3 __isctype
+000f4350 g DF .text 00000037 (GLIBC_2.0) getservent_r
+000be6a0 g DF .text 00000072 GLIBC_2.1 __iswctype_l
+000291a0 g DF .text 00000022 GLIBC_2.0 __sigaddset
+000f3ad0 g DF .text 00000033 (GLIBC_2.3.3) sched_getaffinity
+000dcb60 g DF .text 00000406 GLIBC_2.0 xdr_callmsg
+00060090 g DF .text 00000016 GLIBC_2.2 _IO_iter_begin
+000cc770 g DF .text 000000eb GLIBC_2.3.4 __strncat_chk
+000c6300 g DF .text 00000033 GLIBC_2.0 pthread_setcancelstate
+000e0210 g DF .text 000000a3 GLIBC_2.0 xdr_union
+00070230 g DF .text 00000059 GLIBC_2.0 __wcstoul_internal
+000b5720 g DF .text 00000072 GLIBC_2.0 setttyent
+00029390 g DF .text 000000a7 GLIBC_2.0 __sysv_signal
+00068df0 g DF .text 000001b9 GLIBC_2.0 strrchr
+0006fa40 w DF .text 00000330 GLIBC_2.0 mbsnrtowcs
+0006b720 g DF .text 0000002c GLIBC_2.0 basename
+000228b0 g DF .text 00000071 GLIBC_2.3 __ctype_tolower_loc
+00066dd0 g DF .text 0000002b GLIBC_2.0 mprobe
+00089570 w DF .text 00000082 GLIBC_2.1 waitid
+00118648 w DO .bss 00000004 GLIBC_2.0 __after_morecore_hook
+00089900 w DF .text 00000078 GLIBC_2.0 nanosleep
+0006e4a0 g DF .text 00000032 GLIBC_2.0 wcscpy
+000e00d0 g DF .text 0000002a GLIBC_2.0 xdr_enum
+00067c80 g DF .text 000000ba GLIBC_2.0 _obstack_begin
+000be5a0 g DF .text 0000006d GLIBC_2.1 __towlower_l
+00066840 w DF .text 000003b7 GLIBC_2.0 calloc
+00039c80 g DF .text 0000009b GLIBC_2.0 cuserid
+00028250 w DF .text 00000187 GLIBC_2.0 modfl
+00069e10 w DF .text 00000041 GLIBC_2.3 strcasecmp_l
+00015ae0 g DF .text 0000003b (GLIBC_2.0) __umoddi3
+000e0050 g DF .text 00000079 GLIBC_2.0 xdr_bool
+0005e4d0 g DF .text 00000025 GLIBC_2.0 _IO_file_stat
+00093ca0 w DF .text 0000004b GLIBC_2.0 re_set_registers
+000bc270 w DF .text 0000008b GLIBC_2.2 moncontrol
+000e4360 g DF .text 000001a2 GLIBC_2.1 host2netname
+0002b2c0 w DF .text 00000031 GLIBC_2.1.1 imaxabs
+000619b0 w DF .text 00000034 GLIBC_2.0 malloc_usable_size
+0002dd70 g DF .text 00000052 GLIBC_2.0 __strtold_internal
+000ba630 g DF .text 0000003c GLIBC_PRIVATE __modify_ldt
+000b85e0 w DF .text 00000012 GLIBC_2.1 tdestroy
+00089250 w DF .text 00000042 GLIBC_2.0 wait4
+0007a0a0 w DF .text 0000007c GLIBC_2.3 wcsncasecmp_l
+000eed00 g DF .text 00000095 GCC_3.0 __register_frame_info_bases
+00059cd0 g DF .text 0000016a GLIBC_2.2 _IO_wfile_sync
+00065520 g DF .text 00000147 GLIBC_2.0 __libc_pvalloc
+0002d5c0 w DF .text 0000002e GLIBC_2.1 __strtoll_l
+000f2250 g DF .text 0000016b (GLIBC_2.0) _IO_file_fopen
+000cd3b0 g DF .text 0000002d GLIBC_2.0 inet_lnaof
+000f1260 g DF .text 00000124 (GLIBC_2.0) fgetpos
+0002dd10 w DF .text 00000052 GLIBC_2.0 strtod
+00000000 g DO *ABS* 00000000 GLIBC_2.1.2 GLIBC_2.1.2
+000e02c0 g DF .text 0000003b GLIBC_2.0 xdr_wrapstring
+00027b80 w DF .text 0000002d GLIBC_2.0 isinf
+000a4420 g DF .text 00000036 GLIBC_2.0 __sched_getscheduler
+000dc8f0 g DF .text 00000085 GLIBC_2.0 xdr_rejected_reply
+00068df0 w DF .text 000001b9 GLIBC_2.0 rindex
+0006de80 g DF .text 0000005f GLIBC_2.1.1 __strtok_r_1c
+000a6d20 g DF .text 0000007e GLIBC_2.1 gai_strerror
+000cd3e0 g DF .text 0000005c GLIBC_2.0 inet_makeaddr
+0011a6d4 g DO .bss 00000004 GLIBC_2.0 locs
+000cf700 g DF .text 000000ad GLIBC_2.0 setprotoent
+000ac490 w DF .text 00000153 GLIBC_2.1 statvfs64
+000b1b00 g DF .text 00000042 GLIBC_2.1 sendfile
+0005e160 g DF .text 0000002a GLIBC_2.1 _IO_do_write
+000bfb30 w DF .text 000002b5 GLIBC_2.0 lckpwdf
+00000000 w D *UND* 00000000 __pthread_getspecific
+000f4210 g DF .text 0000005f (GLIBC_2.0) getprotobyname_r
+000c5fa0 g DF .text 0000002a GLIBC_2.0 pthread_condattr_destroy
+000acaa0 w DF .text 0000007c GLIBC_2.0 write
+000c5f60 g DF .text 00000033 GLIBC_2.0 pthread_attr_setscope
+000b2b60 g DF .text 00000099 GLIBC_2.2 getrlimit64
+0011748c g DO .data 00000004 (GLIBC_2.2) __ctype32_toupper
+000d2210 g DF .text 00000e93 GLIBC_2.2 rcmd_af
+00065670 g DF .text 00000107 GLIBC_2.0 __libc_valloc
+0006eac0 g DF .text 00000069 GLIBC_2.0 wmemchr
+000cd440 g DF .text 0000002f GLIBC_2.0 inet_netof
+000ba200 g DF .text 0000003c GLIBC_2.0 ioperm
+000b2cb0 w DF .text 000000d2 GLIBC_2.0 ulimit
+000328c0 w DF .text 00000027 GLIBC_2.1 __strtod_l
+00115480 g DO .data.rel.ro 000001f4 (GLIBC_2.1) _sys_errlist
+000cbe30 w DF .text 0000011e GLIBC_2.1 backtrace
+00020e50 w DF .text 00000038 GLIBC_2.0 __ctype_get_mb_cur_max
+00029b60 g DF .text 0000001f GLIBC_2.0 atof
+000cbe30 g DF .text 0000011e GLIBC_2.1 __backtrace
+001190fc w DO .bss 00000004 GLIBC_2.0 environ
+000cbf50 g DF .text 000002bd GLIBC_2.1 __backtrace_symbols
+000ba2c0 w DF .text 00000066 GLIBC_2.0 sysctl
+000dfb80 g DF .text 0000001f GLIBC_2.0 xdr_free
+00000000 DO *UND* 000001cc GLIBC_PRIVATE _rtld_global_ro
+000e01d0 g DF .text 0000003a GLIBC_2.0 xdr_netobj
+000b3cd0 g DF .text 00000036 GLIBC_2.0 fdatasync
+00043cb0 g DF .text 00000024 GLIBC_2.0 fprintf
+000f19f0 g DF .text 0000002a (GLIBC_2.0) _IO_do_write
+000b7410 g DF .text 000002d5 GLIBC_2.0 fcvt_r
+00117900 g DO .data 00000050 GLIBC_2.0 _IO_stdin_
+0002c140 w DF .text 00000052 GLIBC_2.0 jrand48_r
+00029000 g DF .text 0000006e GLIBC_2.0 sigstack
+0011a8e8 g DO .bss 00000004 GLIBC_2.1 __key_encryptsession_pk_LOCAL
+00028af0 w DF .text 0000003a GLIBC_2.0 kill
+0005d380 g DF .text 00000098 GLIBC_2.1 fputs_unlocked
+000bd760 w DF .text 000000d5 GLIBC_2.0 iswgraph
+000886e0 g DF .text 000000a8 GLIBC_2.0 setpwent
+000c4550 w DF .text 000000af GLIBC_2.1 argp_state_help
+000e3a50 g DF .text 00000081 GLIBC_2.1 key_encryptsession_pk
+0007ae30 g DF .text 0000001b GLIBC_2.0 ctime
+00069ba0 g DF .text 00000010 GLIBC_2.0 ffs
+00021710 g DF .text 0000010e GLIBC_2.3 __uselocale
+000eda10 w DF .text 00000189 GLIBC_2.2.4 dl_iterate_phdr
+000cb860 g DF .text 0000008a GLIBC_2.0 __nss_group_lookup
+000dd830 g DF .text 000000af GLIBC_2.0 svc_register
+000e6fa0 g DF .text 00000068 GLIBC_2.1 xdr_int8_t
+000dfbb0 g DF .text 00000041 GLIBC_2.0 xdr_long
+00068140 g DF .text 000001aa GLIBC_2.0 strcat
+0009f5d0 w DF .text 00000081 GLIBC_2.0 re_compile_pattern
+0011a6e4 g DO .bss 00000004 GLIBC_2.1 argp_program_version
+000d7b90 g DF .text 000001c1 GLIBC_2.3.4 getsourcefilter
+00057780 g DF .text 000000e3 GLIBC_2.2 putwc
+000ab470 g DF .text 00000038 GLIBC_2.2 posix_spawnattr_setsigdefault
+00022e70 w DF .text 00000043 GLIBC_2.0 dcgettext
+000baea0 g DF .text 00000039 GLIBC_2.0 bind
+00030150 w DF .text 00000027 GLIBC_2.3 strtof_l
+000be1a0 g DF .text 0000007d GLIBC_2.1 __iswcntrl_l
+0002bd30 g DF .text 00000052 GLIBC_2.0 rand_r
+0008a610 g DF .text 0000003a GLIBC_2.0 __setpgid
+00117484 g DO .data 00000004 (GLIBC_2.0) __ctype_toupper
+000b4e30 w DF .text 0000035f GLIBC_2.0 getmntent_r
+000cf4b0 g DF .text 000000a2 GLIBC_2.0 getprotoent
+000d7d60 g DF .text 0000017a GLIBC_2.3.4 setsourcefilter
+000dd2d0 g DF .text 00000042 GLIBC_2.0 svcerr_systemerr
+00028ee0 w DF .text 00000114 GLIBC_2.0 sigvec
+000d5be0 g DF .text 00000326 GLIBC_2.1 if_nameindex
+000c6b00 g DF .text 00000028 GLIBC_2.0 inet_addr
+000b3350 w DF .text 00000072 GLIBC_2.0 readv
+000b79e0 g DF .text 000000c3 GLIBC_2.0 qfcvt
+000cd390 w DF .text 00000007 GLIBC_2.0 ntohl
+000b54b0 g DF .text 00000050 GLIBC_2.1 truncate64
+000bd040 g DF .text 00000019 GLIBC_2.0 __profile_frequency
+0003ee90 g DF .text 00000036 GLIBC_2.0 vprintf
+0006d710 g DF .text 00000023 GLIBC_2.1.1 __strchr_g
+000ba4d0 w DF .text 00000057 GLIBC_2.3 readahead
+000c5cc0 g DF .text 0000002a (GLIBC_2.0) pthread_attr_init
+000ba490 w DF .text 0000003a GLIBC_2.1 umount2
+00069c20 g DF .text 00000041 GLIBC_2.0 __stpcpy
+000e4030 g DF .text 00000057 GLIBC_2.0 xdr_cryptkeyarg
+000b5550 g DF .text 00000032 GLIBC_2.0 chflags
+000b7970 g DF .text 00000064 GLIBC_2.0 qecvt
+000abd30 g DF .text 0000003c GLIBC_2.0 mkfifo
+000227c0 w DF .text 00000017 GLIBC_2.3 isspace_l
+0007b7f0 g DF .text 0000003a GLIBC_2.0 __gettimeofday
+000283e0 w DF .text 0000000d GLIBC_2.0 scalbnl
+000d58b0 g DF .text 000000ae GLIBC_2.1 if_nametoindex
+00061490 g DF .text 00000172 GLIBC_2.0 _IO_str_overflow
+000ee430 g DF .text 00000021 GLIBC_2.0 __deregister_frame_info
+0006d790 g DF .text 00000024 GLIBC_2.1.1 __strrchr_c
+000b70d0 g DF .text 0000003c GLIBC_2.0 madvise
+00115480 g DO .data.rel.ro 000001f4 (GLIBC_2.1) sys_errlist
+0005bd00 w DF .text 000001c8 GLIBC_2.0 obstack_vprintf
+000713d0 w DF .text 0000003e GLIBC_2.3 wcstoll_l
+000b3d10 g DF .text 00000039 GLIBC_2.0 reboot
+000bb1e0 w DF .text 00000078 GLIBC_2.0 __send
+000ad1a0 w DF .text 00000036 GLIBC_2.0 chdir
+00029770 w DF .text 00000069 GLIBC_2.1 sigwaitinfo
+00057b90 g DF .text 0000003b GLIBC_2.2 swprintf
+000c5de0 g DF .text 00000033 GLIBC_2.0 pthread_attr_setinheritsched
+00027be0 g DF .text 00000011 GLIBC_2.0 __finite
+00086c90 g DF .text 000000bf GLIBC_2.0 initgroups
+0006e090 g DF .text 00000022 GLIBC_2.1.1 __memset_cg
+00070e50 w DF .text 0000003e GLIBC_2.3 wcstoul_l
+000ac070 g DF .text 0000003a GLIBC_2.2 __statfs
+00117fe0 g DO .bss 00000004 (GLIBC_2.0) _errno
+000db700 g DF .text 00000105 GLIBC_2.0 pmap_unset
+0005bff0 g DF .text 000000e1 GLIBC_2.1 fseeko
+000b3680 w DF .text 00000032 GLIBC_2.0 setregid
+000b15c0 g DF .text 00000043 GLIBC_2.2 posix_fadvise
+000b9fa0 g DF .text 0000003c GLIBC_2.3 listxattr
+00029980 g DF .text 0000006e GLIBC_2.1 sigignore
+000bbb90 g DF .text 0000004d GLIBC_2.0 shmdt
+00027c20 w DF .text 000001cf GLIBC_2.0 modf
+000ac3f0 g DF .text 00000094 GLIBC_2.1 fstatvfs
+00087420 g DF .text 000000a6 GLIBC_2.0 endgrent
+000bb360 g DF .text 00000039 GLIBC_2.0 setsockopt
+001170f8 g DO .data 00000002 GLIBC_2.0 __fpu_control
+000be420 g DF .text 0000007d GLIBC_2.1 __iswpunct_l
+00028770 w DF .text 000000da GLIBC_2.0 bsd_signal
+000dfed0 g DF .text 00000068 GLIBC_2.0 xdr_short
+000be220 w DF .text 0000007d GLIBC_2.3 iswdigit_l
+000ccb80 g DF .text 00000113 GLIBC_2.3.4 __printf_chk
+0005b130 g DF .text 000000e1 GLIBC_2.0 fseek
+0006ad60 w DF .text 00000049 GLIBC_2.0 argz_extract
+00056580 g DF .text 0000018f GLIBC_2.0 _IO_setvbuf
+000bab50 w DF .text 00000042 GLIBC_2.0 mremap
+000c61d0 g DF .text 0000003a GLIBC_2.0 pthread_setschedparam
+00039c50 g DF .text 00000030 GLIBC_2.0 ctermid
+000f0870 g DF .text 0000003b (GLIBC_2.0) atexit
+00089220 w DF .text 00000029 GLIBC_2.0 wait3
+000bb6d0 g DF .text 00000051 GLIBC_2.1 __libc_sa_len
+00023de0 w DF .text 00000042 GLIBC_2.2 ngettext
+00052900 g DF .text 0000007c GLIBC_2.0 tmpnam_r
+000dd6d0 g DF .text 00000082 GLIBC_2.0 svc_getreqset
+00020d80 g DF .text 0000007a GLIBC_2.0 nl_langinfo
+000bbbe0 g DF .text 0000004f GLIBC_2.0 shmget
+000225f0 g DF .text 00000042 GLIBC_2.0 _tolower
+00055380 w DF .text 0000024e GLIBC_2.0 getdelim
+000d4a00 g DF .text 00000125 GLIBC_2.0 getaliasbyname
+000433d0 g DF .text 0000002d GLIBC_2.1 printf_size_info
+000b7ab0 g DF .text 0000031e GLIBC_2.0 qfcvt_r
+0002b7b0 w DF .text 0000007b GLIBC_2.0 setstate
+000b2420 g DF .text 00000042 GLIBC_2.0 cfsetospeed
+00069eb0 w DF .text 0000003e GLIBC_2.0 memccpy
+000b5590 g DF .text 00000032 GLIBC_2.0 fchflags
+000bade0 g DF .text 00000036 GLIBC_2.0 uselib
+0006d360 g DF .text 0000001d GLIBC_2.1.1 __memset_ccn_by4
+00070590 w DF .text 00000052 GLIBC_2.0 wcstold
+00117288 g DO .data 00000004 GLIBC_2.0 optind
+00015410 w DF .text 00000016 GLIBC_2.1 gnu_get_libc_release
+000abc70 g DF .text 00000015 GLIBC_2.2 posix_spawnattr_setschedparam
+00055940 g DF .text 000000d3 GLIBC_2.0 _IO_padn
+00089900 w DF .text 00000078 GLIBC_2.2.6 __nanosleep
+000be320 g DF .text 0000007d GLIBC_2.1 __iswgraph_l
+000697c0 w DF .text 0000019b GLIBC_2.0 memchr
+00055620 g DF .text 000001a4 GLIBC_2.1 _IO_getline_info
+000e96e0 g DF .text 00000015 GLIBC_2.1 fattach
+000dd9a0 g DF .text 00000098 GLIBC_2.2 svc_getreq_poll
+00088b50 g DF .text 00000332 GLIBC_PRIVATE _nss_files_parse_pwent
+000b40c0 w DF .text 00000036 GLIBC_2.0 swapoff
+000cd150 g DF .text 00000046 GLIBC_2.3.4 __chk_fail
+00000000 g DO *ABS* 00000000 GLIBC_2.3.2 GLIBC_2.3.2
+0011a7c0 g DO .bss 00000030 GLIBC_2.2 _res_hconf
+00027310 g DF .text 00000866 GLIBC_PRIVATE __open_catalog
+001178dc g DO .data 00000004 GLIBC_2.0 stdin
+000b8450 w DF .text 0000005b GLIBC_2.0 tfind
+000890f0 w DF .text 000000a9 GLIBC_2.0 wait
+000cc210 w DF .text 0000022e GLIBC_2.1 backtrace_symbols_fd
+00028ea0 g DF .text 0000001c GLIBC_PRIVATE __libc___xpg_sigpause
+00092ee0 g DF .text 000002ec GLIBC_2.2.3 fnmatch
+000b7110 g DF .text 0000003c GLIBC_2.2 mincore
+000a27f0 w DF .text 0000004a GLIBC_2.0 re_match_2
+000dc980 g DF .text 0000009e GLIBC_2.0 xdr_accepted_reply
+00104d70 g DO .rodata 00000004 GLIBC_2.3 sys_nerr
+00061710 g DF .text 00000047 GLIBC_2.0 _IO_str_init_static
+000859e0 g DF .text 000001ed GLIBC_2.0 scandir
+000ac750 w DF .text 00000010 GLIBC_2.0 umask
+001198e0 g DO .bss 00000200 (GLIBC_2.0) _res
+0006b750 g DF .text 0000103c GLIBC_2.1 __strcoll_l
+000b8b20 g DF .text 00000048 GLIBC_2.0 lfind
+000be6a0 w DF .text 00000072 GLIBC_2.3 iswctype_l
+00055f50 g DF .text 0000017f GLIBC_2.0 _IO_puts
+00069bb0 g DF .text 00000062 GLIBC_2.1 ffsll
+00036df0 w DF .text 00000042 GLIBC_2.3 strfmon_l
+00043de0 g DF .text 00000034 GLIBC_2.0 dprintf
+000b9ec0 g DF .text 0000003a GLIBC_2.3 fremovexattr
+000dd360 g DF .text 0000001c GLIBC_2.0 svcerr_weakauth
+000d8c40 g DF .text 000000c1 GLIBC_2.0 xdr_authunix_parms
+000f0c10 g DF .text 0000016c (GLIBC_2.0) fclose
+0005ed90 g DF .text 0000020b GLIBC_2.1 _IO_file_underflow
+000d4110 g DF .text 000002e8 GLIBC_2.0 innetgr
+000de7a0 g DF .text 00000012 GLIBC_2.0 svcfd_create
+00000000 g DO *ABS* 00000000 GLIBC_2.2.1 GLIBC_2.2.1
+0007b7a0 g DF .text 0000003c GLIBC_2.0 mktime
+00088e90 w DF .text 000001d7 GLIBC_2.0 fgetpwent_r
+00117db8 g DO .data 00000004 GLIBC_2.0 __progname
+00118d44 w DO .bss 00000004 GLIBC_2.0 timezone
+00028ec0 g DF .text 00000019 GLIBC_PRIVATE __libc_sigpause
+0006a480 w DF .text 00000179 GLIBC_2.1 strcasestr
+00000000 g DO *ABS* 00000000 GLIBC_2.0 GLIBC_2.0
+000f3ff0 g DF .text 00000041 (GLIBC_2.0) gethostent_r
+000eee60 g DF .text 000000f4 GCC_3.0 __deregister_frame_info_bases
+00027080 g DF .text 00000086 GLIBC_2.0 catgets
+00066ce0 g DF .text 0000004d GLIBC_2.2 mcheck_check_all
+00060a30 g DF .text 00000022 GLIBC_2.0 _IO_flush_all
+0005ad00 w DF .text 00000068 GLIBC_2.0 ferror
+000693c0 g DF .text 00000186 GLIBC_2.0 strstr
+0007a0a0 g DF .text 0000007c GLIBC_2.1 __wcsncasecmp_l
+000eb810 g DF .text 0000006a GLIBC_2.1 unlockpt
+00056fd0 g DF .text 0000003b GLIBC_2.2 getwchar_unlocked
+000dfea0 g DF .text 0000002a GLIBC_2.1.1 xdr_u_longlong_t
+000600d0 g DF .text 00000008 GLIBC_2.2 _IO_iter_file
+000e4830 g DF .text 000001d9 GLIBC_2.1 rtime
+0005fe30 g DF .text 0000003b GLIBC_2.0 _IO_adjust_column
+0002bd10 g DF .text 00000017 GLIBC_2.0 rand
+000ebca0 g DF .text 00000017 GLIBC_2.1 getutxent
+0011a6d8 g DO .bss 00000004 GLIBC_2.0 loc1
+00028230 w DF .text 0000001e GLIBC_2.0 copysignl
+000e6d80 g DF .text 000000bb GLIBC_2.1.1 xdr_uint64_t
+0005c0e0 g DF .text 000001c8 GLIBC_2.1 ftello
+000acdc0 w DF .text 0000003a GLIBC_2.0 flock
+00028220 w DF .text 0000000e GLIBC_2.0 finitel
+00062bd0 w DF .text 000003db GLIBC_2.0 malloc_set_state
+0008a500 w DF .text 0000002f GLIBC_2.0 setgid
+00015260 g DF .text 00000005 GLIBC_2.0 __libc_init_first
+0006d740 g DF .text 00000020 GLIBC_2.1.1 __strchrnul_c
+00028770 w DF .text 000000da GLIBC_2.0 signal
+000524e0 g DF .text 0000021b GLIBC_2.0 psignal
+000c2b90 w DF .text 00000327 GLIBC_2.1 argp_failure
+000aca20 w DF .text 0000007c GLIBC_2.0 read
+00117fe0 g DO .bss 00000004 (GLIBC_2.0) errno
+00086060 g DF .text 0000000a GLIBC_2.0 dirfd
+000e9920 w DF .text 00000059 GLIBC_2.0 endutent
+0006e060 g DF .text 00000022 GLIBC_2.1.1 __memset_gg
+000bf210 g DF .text 000000a8 GLIBC_2.0 setspent
+0006e090 g DF .text 00000022 GLIBC_2.1.1 __memset_cc
+000ad3e0 g DF .text 000000bd GLIBC_2.0 get_current_dir_name
+000be8b0 g DF .text 00000125 GLIBC_2.0 getspnam
+0006d540 g DF .text 00000031 GLIBC_2.1.1 __stpcpy_g
+000b66c0 g DF .text 00000080 GLIBC_2.0 openlog
+000aaf90 w DF .text 00000094 GLIBC_2.1 pread64
+00029530 g DF .text 00000027 GLIBC_PRIVATE __libc_current_sigrtmin_private
+000e0000 g DF .text 0000004e GLIBC_2.0 xdr_u_char
+000bb260 w DF .text 00000078 GLIBC_2.0 sendmsg
+000be520 g DF .text 0000007d GLIBC_2.1 __iswupper_l
+00107908 g DO .rodata 00000010 GLIBC_2.1 in6addr_loopback
+000bdd70 w DF .text 00000072 GLIBC_2.0 iswctype
+000684b0 g DF .text 0000004b GLIBC_2.0 strcoll
+000b6490 g DF .text 0000008a GLIBC_2.0 closelog
+000da7c0 g DF .text 00000048 GLIBC_2.0 clntudp_create
+000224d0 g DF .text 0000007d GLIBC_2.0 isupper
+000e39c0 g DF .text 00000081 GLIBC_2.1 key_decryptsession_pk
+0006aad0 g DF .text 0000003e GLIBC_2.0 __argz_count
+00022840 g DF .text 00000011 GLIBC_2.1 __toupper_l
+00068c40 g DF .text 000000f3 GLIBC_2.0 strncmp
+000ab570 g DF .text 00000051 GLIBC_2.2 posix_spawnp
+00043cb0 w DF .text 00000024 GLIBC_2.0 _IO_fprintf
+0011a668 g DO .bss 00000004 (GLIBC_2.0) _obstack
+000bacb0 g DF .text 00000048 GLIBC_2.0 query_module
+0002af50 g DF .text 00000033 GLIBC_2.0 __secure_getenv
+00035b50 g DF .text 0000004b GLIBC_2.0 l64a
+00104d70 g DO .rodata 00000004 GLIBC_2.3 _sys_nerr
+000685d0 g DF .text 00000146 GLIBC_2.1.1 __strverscmp
+00058400 g DF .text 00000081 GLIBC_2.2 _IO_wdefault_doallocate
+000226e0 g DF .text 00000017 GLIBC_2.1 __isalpha_l
+000294b0 g DF .text 00000035 GLIBC_2.0 sigorset
+0006f6e0 w DF .text 00000360 GLIBC_2.0 wcsrtombs
+000e1a60 g DF .text 000000e8 GLIBC_2.0 getpublickey
+000557d0 g DF .text 0000016f GLIBC_2.0 _IO_gets
+00065780 g DF .text 000001d4 GLIBC_2.0 __libc_malloc
+00085c40 g DF .text 00000024 GLIBC_2.0 alphasort
+000aaf90 w DF .text 00000094 GLIBC_2.1 __pread64
+000b5fa0 g DF .text 00000040 GLIBC_2.0 getusershell
+000b3870 g DF .text 0000003a GLIBC_2.0 sethostname
+000bb690 g DF .text 00000040 GLIBC_2.0 __cmsg_nxthdr
+00053230 g DF .text 00000032 GLIBC_2.0 _IO_ftrylockfile
+000bd060 w DF .text 00000013 GLIBC_2.0 mcount
+00022720 g DF .text 00000017 GLIBC_2.1 __isdigit_l
+00085c70 g DF .text 00000024 GLIBC_2.1 versionsort
+0006ec60 g DF .text 00000051 GLIBC_2.0 wmemset
+000b98a0 w DF .text 0000001a GLIBC_2.0 get_avphys_pages
+00000000 g DO *ABS* 00000000 GLIBC_PRIVATE GLIBC_PRIVATE
+0008a680 g DF .text 0000001a GLIBC_2.0 setpgrp
+000a9f60 g DF .text 00000df2 GLIBC_2.1 wordexp
+0005ff30 g DF .text 0000003a GLIBC_2.0 _IO_marker_delta
+000d4400 g DF .text 00000097 GLIBC_PRIVATE __internal_endnetgrent
+000635b0 g DF .text 000000b8 GLIBC_2.0 __libc_free
+00068d40 g DF .text 000000a3 GLIBC_2.0 strncpy
+000adf90 w DF .text 00000036 GLIBC_2.0 unlink
+0002aed0 w DF .text 00000073 GLIBC_2.0 setenv
+000b2c70 w DF .text 0000003a GLIBC_2.0 getrusage
+000b3ca0 g DF .text 0000002e GLIBC_2.0 sync
+0005c2b0 g DF .text 0000024c GLIBC_2.1 freopen64
+0006de30 g DF .text 00000047 GLIBC_2.1.1 __strpbrk_c3
+00058190 g DF .text 0000004c GLIBC_2.2 _IO_sungetwc
+00117db8 w DO .data 00000004 GLIBC_2.0 program_invocation_short_name
+00069d10 w DF .text 00000068 GLIBC_2.0 strcasecmp
+000cd390 g DF .text 00000007 GLIBC_2.0 htonl
+000bb2e0 w DF .text 00000078 GLIBC_2.0 sendto
+000ac7e0 g DF .text 00000015 GLIBC_2.3.2 lchmod
+000dfc30 g DF .text 00000065 GLIBC_2.0 xdr_u_long
+000226e0 w DF .text 00000017 GLIBC_2.3 isalpha_l
+000a4490 w DF .text 00000036 GLIBC_2.0 sched_get_priority_max
+000b4020 g DF .text 00000015 GLIBC_2.0 revoke
+0005efa0 g DF .text 00000063 GLIBC_2.1 _IO_file_setbuf
+000abb70 g DF .text 0000003a GLIBC_2.2 posix_spawnattr_getsigmask
+000d45d0 g DF .text 00000068 GLIBC_2.0 setnetgrent
+00053270 w DF .text 0000002d GLIBC_2.0 funlockfile
+000ebe10 g DF .text 00000248 GLIBC_PRIVATE _dl_open
+000785d0 g DF .text 00000096 GLIBC_2.0 wcwidth
+00022560 g DF .text 00000011 GLIBC_2.0 isascii
+000f4100 g DF .text 00000066 (GLIBC_2.0) getnetbyname_r
+000dca20 g DF .text 00000081 GLIBC_2.0 xdr_replymsg
+00065c60 g DF .text 0000021c GLIBC_2.0 realloc
+000b4900 w DF .text 0000046f GLIBC_2.0 addmntent
+0002b070 w DF .text 00000036 GLIBC_2.0 on_exit
+000c6550 g DF .text 00000158 GLIBC_2.3.2 __register_atfork
+000286a0 g DF .text 00000063 GLIBC_PRIVATE __libc_siglongjmp
+0005bfd0 w DF .text 00000017 GLIBC_2.0 fcloseall
+000bd080 g DF .text 000000bd GLIBC_2.0 towupper
+000be220 g DF .text 0000007d GLIBC_2.1 __iswdigit_l
+000e3c40 g DF .text 00000103 GLIBC_2.1 key_gendes
+000be2a0 g DF .text 0000007d GLIBC_2.1 __iswlower_l
+000d02b0 g DF .text 000000a2 GLIBC_2.0 getrpcent
+00068720 g DF .text 00000057 GLIBC_2.0 __strdup
+0002b1a0 g DF .text 0000003c GLIBC_2.1.3 __cxa_atexit
+000be120 w DF .text 0000007d GLIBC_2.3 iswblank_l
+00117328 g DO .data 00000004 GLIBC_2.1 argp_err_exit_status
+000ebdd0 g DF .text 00000033 GLIBC_2.1.1 getutmp
+000527a0 g DF .text 000000a2 GLIBC_2.1 tmpfile64
+00037b30 w DF .text 00000065 GLIBC_2.1 makecontext
+00027f50 g DF .text 00000018 GLIBC_2.0 __isnanf
+00000000 g DO *ABS* 00000000 GLIBC_2.3.3 GLIBC_2.3.3
+0006d5c0 g DF .text 00000033 GLIBC_2.1.1 __strcat_g
+00104d74 g DO .rodata 00000004 (GLIBC_2.0) sys_nerr
+00115680 g DO .data.rel.ro 00000100 (GLIBC_2.1) _sys_siglist
+00058290 g DF .text 0000003d GLIBC_2.2 _IO_wmarker_delta
+000ba900 g DF .text 00000036 GLIBC_2.3.2 epoll_create
+000f3f10 g DF .text 00000063 (GLIBC_2.0) gethostbyname2_r
+000f09a0 g DF .text 00000095 (GLIBC_2.0) fopen
+00069ac0 g DF .text 0000009d GLIBC_2.0 bcopy
+000700c0 w DF .text 00000075 GLIBC_2.1 wcsnlen
+000c9730 w DF .text 0000010e (GLIBC_2.0) res_init
+0005b220 g DF .text 000000cc GLIBC_2.0 _IO_getc
+00062a90 g DF .text 0000000f GLIBC_2.0 __libc_mallopt
+000b55f0 g DF .text 0000001a GLIBC_2.0 remque
+00069550 g DF .text 0000010c GLIBC_2.0 strtok
+000bded0 w DF .text 0000005d GLIBC_2.0 towctrans
+00056710 g DF .text 000000d4 GLIBC_2.0 _IO_ungetc
+00029240 g DF .text 00000027 GLIBC_2.0 sigfillset
+000e6f30 g DF .text 00000069 GLIBC_2.1 xdr_uint16_t
+00069960 g DF .text 0000001e GLIBC_2.0 memcmp
+000a43e0 g DF .text 0000003c GLIBC_2.0 __sched_setscheduler
+000bb020 g DF .text 00000039 GLIBC_2.0 listen
+000dd380 g DF .text 00000042 GLIBC_2.0 svcerr_noprog
+000f4f20 g DF __libc_freeres_fn 00000087 GLIBC_2.1 __libc_freeres
+0007aee0 g DF .text 00000030 GLIBC_2.0 __gmtime_r
+000a44d0 w DF .text 00000036 GLIBC_2.0 sched_get_priority_min
+000b1670 g DF .text 000001d5 GLIBC_2.2 posix_fallocate
+000df0b0 g DF .text 00000344 GLIBC_2.0 svcudp_bufcreate
+000e0100 g DF .text 000000cd GLIBC_2.0 xdr_opaque
+000a6da0 g DF .text 00000059 GLIBC_2.1 wordfree
+00062b30 w DF .text 00000092 GLIBC_2.0 malloc_trim
+000d7840 g DF .text 00000152 GLIBC_2.3.4 getipv4sourcefilter
+00117480 g DO .data 00000004 (GLIBC_2.0) __ctype_tolower
+000ab430 g DF .text 00000038 GLIBC_2.2 posix_spawnattr_getsigdefault
+00037ba0 w DF .text 000000a6 GLIBC_2.1 swapcontext
+00089980 w DF .text 00000059 GLIBC_2.0 fork
+000299f0 g DF .text 0000016d GLIBC_2.1 sigset
+00052300 g DF .text 00000034 GLIBC_2.0 sscanf
+000713d0 w DF .text 0000003e GLIBC_2.1 __wcstoll_l
+00022740 g DF .text 00000017 GLIBC_2.1 __islower_l
+0006d8c0 g DF .text 00000047 GLIBC_2.1.1 __strspn_g
+000c60a0 g DF .text 0000002a GLIBC_2.3.2 pthread_cond_signal
+00089bb0 g DF .text 00000034 GLIBC_2.0 execv
+000b4da0 w DF .text 00000084 GLIBC_2.0 setmntent
+000a4460 g DF .text 0000002e GLIBC_2.0 __sched_yield
+000220d0 g DF .text 0000007d GLIBC_2.0 isalpha
+000ac350 g DF .text 00000094 GLIBC_2.1 statvfs
+00086e80 g DF .text 000000a2 GLIBC_2.0 getgrent
+00069e10 g DF .text 00000041 GLIBC_2.1 __strcasecmp_l
+0006e4e0 g DF .text 0000003c GLIBC_2.0 wcscspn
+00000000 g DO *ABS* 00000000 GLIBC_2.2.3 GLIBC_2.2.3
+00070290 g DF .text 00000058 GLIBC_2.0 wcstoul
+000f1a20 g DF .text 0000006d (GLIBC_2.0) _IO_file_write
+0005ff10 g DF .text 00000013 GLIBC_2.0 _IO_marker_difference
+00068b80 g DF .text 000000b8 GLIBC_2.0 strncat
+0008a790 w DF .text 00000035 GLIBC_2.0 setresuid
+000b2ef0 g DF .text 00000031 GLIBC_2.0 vtimes
+0008a2b0 g DF .text 0000017a GLIBC_2.0 execlp
+000ab340 g DF .text 00000097 GLIBC_2.2 posix_spawn_file_actions_adddup2
+00057330 g DF .text 0000007b GLIBC_2.2 fputws_unlocked
+000bb780 w DF .text 000000b5 GLIBC_2.0 msgsnd
+00028a40 w DF .text 00000053 GLIBC_2.0 sigaction
+0002bf80 g DF .text 0000002d GLIBC_2.0 lcong48
+000e57f0 g DF .text 000002da GLIBC_2.1 clntunix_create
+0006e440 g DF .text 00000021 GLIBC_2.0 wcschr
+000583a0 g DF .text 00000058 GLIBC_2.2 _IO_free_wbackup_area
+000dc850 g DF .text 0000009d GLIBC_2.0 xdr_callhdr
+000b3930 g DF .text 0000003a GLIBC_2.0 setdomainname
+0009f490 w DF .text 0000013f GLIBC_2.0 re_comp
+000b4d70 w DF .text 0000002a GLIBC_2.0 endmntent
+0002bf10 g DF .text 0000002d GLIBC_2.0 srand48
+000c9730 g DF .text 0000010e GLIBC_2.2 __res_init
+000db540 g DF .text 000000e7 GLIBC_2.0 getrpcport
+000288a0 g DF .text 00000042 GLIBC_2.0 killpg
+000b1510 g DF .text 000000a2 GLIBC_2.1 __poll
+000b3760 g DF .text 00000026 GLIBC_2.0 __getpagesize
+000cf340 g DF .text 00000165 GLIBC_2.1.2 getprotobynumber_r
+00054ca0 w DF .text 00000113 GLIBC_2.0 fread
+0011962c g DO .bss 00000004 GLIBC_PRIVATE __librt_multiple_threads
+000ccfb0 g DF .text 00000195 GLIBC_2.3.4 __gets_chk
+0006f160 g DF .text 0000024b GLIBC_2.0 __mbrtowc
+0008a530 w DF .text 00000097 GLIBC_2.0 group_member
+000cda90 g DF .text 000002d2 GLIBC_2.1.2 gethostbyaddr_r
+000abc10 g DF .text 0000003b GLIBC_2.2 posix_spawnattr_setsigmask
+000b41f0 g DF .text 00000053 GLIBC_2.0 ualarm
+000ccda0 g DF .text 00000110 GLIBC_2.3.4 __vprintf_chk
+00060180 g DF .text 00000052 GLIBC_2.0 _IO_free_backup_area
+000adbd0 w DF .text 000002b3 GLIBC_2.0 ttyname_r
+00029340 w DF .text 00000015 GLIBC_2.0 sigreturn
+000cd620 g DF .text 000002c6 GLIBC_2.0 inet_network
+000e95f0 g DF .text 00000048 GLIBC_2.1 getpmsg
+000bc350 w DF .text 000001c1 GLIBC_2.0 monstartup
+00000000 g DO *ABS* 00000000 GLIBC_2.2 GLIBC_2.2
+00057c90 g DF .text 00000034 GLIBC_2.2 fwscanf
+000b3090 w DF .text 00000073 GLIBC_2.0 sbrk
+0008a8f0 g DF .text 00000149 GLIBC_2.0 getlogin_r
+00103c60 g DO .rodata 00000024 GLIBC_PRIVATE _itoa_lower_digits
+00068720 w DF .text 00000057 GLIBC_2.0 strdup
+00028050 w DF .text 0000000d GLIBC_2.0 scalbnf
+00060fb0 g DF .text 00000138 GLIBC_2.0 __underflow
+000c6950 w DF .text 000001a9 GLIBC_2.0 inet_aton
+00022760 g DF .text 00000017 GLIBC_2.1 __isgraph_l
+000a4550 g DF .text 0000007a GLIBC_2.3.4 sched_getaffinity
+000b46a0 g DF .text 0000002b GLIBC_2.0 getfsent
+0007e0b0 g DF .text 00000052 GLIBC_2.1 getdate
+0006e1a0 g DF .text 00000069 GLIBC_2.1.1 __strncpy_by4
+000ba240 g DF .text 00000036 GLIBC_2.0 iopl
+000d1230 g DF .text 0000006a GLIBC_2.0 ether_ntoa_r
+00067fa0 g DF .text 0000002c GLIBC_2.0 _obstack_allocated_p
+000abfb0 g DF .text 00000032 GLIBC_2.2 __xstat64
+0002c610 g DF .text 00000058 GLIBC_2.0 strtoull
+000ce750 g DF .text 000000a9 GLIBC_2.0 endhostent
+00000000 w D *UND* 00000000 _pthread_cleanup_push_defer
+000682f0 w DF .text 00000167 GLIBC_2.0 index
+0009ff50 w DF .text 00000125 GLIBC_2.0 regcomp
+0002c110 g DF .text 0000002e GLIBC_2.0 mrand48_r
+00029170 g DF .text 00000028 GLIBC_2.0 __sigismember
+000adf10 w DF .text 0000003a GLIBC_2.0 symlink
+0007b7f0 w DF .text 0000003a GLIBC_2.0 gettimeofday
+000b6310 g DF .text 000000c2 GLIBC_2.0 ttyslot
+00028b70 g DF .text 000000a2 GLIBC_2.1.3 __sigsuspend
+00037ac0 w DF .text 00000068 GLIBC_2.0 setcontext
+000f4040 g DF .text 00000063 (GLIBC_2.0) getnetbyaddr_r
+000d4950 g DF .text 000000a2 GLIBC_2.0 getaliasent
+000f4390 g DF .text 00000037 (GLIBC_2.0) getrpcent_r
+00021710 w DF .text 0000010e GLIBC_2.3 uselocale
+0007ac70 w DF .text 000000fa GLIBC_2.0 asctime_r
+0006e5f0 g DF .text 000000b8 GLIBC_2.0 wcsncat
+000ad0b0 g DF .text 00000036 GLIBC_2.0 __pipe
+000a41d0 g DF .text 00000043 GLIBC_2.0 getopt
+000b3640 w DF .text 00000032 GLIBC_2.0 setreuid
+0006d380 g DF .text 0000002f GLIBC_2.1.1 __memset_ccn_by2
+000584f0 g DF .text 000000fd GLIBC_2.2 _IO_wdefault_xsputn
+0007af10 g DF .text 00000036 GLIBC_2.0 localtime
+0005fa50 g DF .text 00000033 GLIBC_2.0 _IO_default_uflow
+000578b0 g DF .text 000000ec GLIBC_2.2 putwchar
+00069a10 g DF .text 00000056 GLIBC_2.0 memset
+000cc440 g DF .text 00000005 GLIBC_2.2 __cyg_profile_func_enter
+00037a10 g DF .text 00000027 GLIBC_2.1 wcstoumax
+000e41c0 g DF .text 00000091 GLIBC_2.1 netname2host
+000b8e80 g DF .text 00000022 GLIBC_2.0 err
+000f3d50 g DF .text 0000005c (GLIBC_2.0) semctl
+00015e80 g DF .text 00000038 GLIBC_2.1 iconv_close
+0002caf0 w DF .text 0000002e GLIBC_2.1 __strtol_l
+000f1e80 g DF .text 0000009a (GLIBC_2.0) _IO_file_sync
+000b7340 g DF .text 000000c3 GLIBC_2.0 fcvt
+000b2a00 g DF .text 00000030 GLIBC_2.0 cfmakeraw
+000aef00 g DF .text 00000024 GLIBC_2.0 ftw
+00029360 g DF .text 00000022 GLIBC_2.0 siggetmask
+000ace00 g DF .text 000000f6 GLIBC_2.0 lockf
+000c6060 g DF .text 00000033 GLIBC_2.3.2 pthread_cond_init
+000c6480 g DF .text 0000000b GLIBC_PRIVATE __librt_disable_asynccancel
+000763d0 w DF .text 00000037 GLIBC_2.3 wcstold_l
+0006e8b0 g DF .text 0000004d GLIBC_2.0 wcsspn
+000d1e30 g DF .text 000000cf GLIBC_2.2 iruserok_af
+0008a6a0 g DF .text 00000036 GLIBC_2.0 getsid
+00054f00 w DF .text 000001d8 GLIBC_2.0 ftell
+000227a0 g DF .text 00000015 GLIBC_2.1 __ispunct_l
+000cc4a0 g DF .text 0000009e GLIBC_2.3.4 __memmove_chk
+0002b8b0 w DF .text 0000005b GLIBC_2.0 srand
+000cc970 g DF .text 000000be GLIBC_2.3.4 __vsprintf_chk
+000b3f50 g DF .text 000000ca GLIBC_2.0 sethostid
+000dd130 g DF .text 00000039 GLIBC_2.2.3 __rpc_thread_svc_pollfd
+000f3c60 g DF .text 00000099 (GLIBC_2.1) getrlimit64
+000be610 g DF .text 0000008c GLIBC_2.1 __wctype_l
+00069760 g DF .text 00000052 GLIBC_2.0 strxfrm
+000be0a0 g DF .text 0000007d GLIBC_2.1 __iswalpha_l
+00035ce0 g DF .text 00000067 GLIBC_2.0 strfmon
+000f3b10 g DF .text 00000033 (GLIBC_2.3.3) sched_setaffinity
+000b98c0 w DF .text 0000001a GLIBC_2.0 get_phys_pages
+000445f0 w DF .text 00003c1e GLIBC_2.2 vfwprintf
+0006f670 w DF .text 00000067 GLIBC_2.0 mbsrtowcs
+000cca30 g DF .text 00000039 GLIBC_2.3.4 __snprintf_chk
+00115680 g DO .data.rel.ro 00000080 (GLIBC_2.0) sys_siglist
+000be1a0 w DF .text 0000007d GLIBC_2.3 iswcntrl_l
+000f2b60 g DF .text 0000005f (GLIBC_2.0) getpwnam_r
+000bdc70 w DF .text 000000fd GLIBC_2.0 wctype
+0005ac30 g DF .text 0000005c GLIBC_2.0 clearerr
+000b9fe0 g DF .text 00000042 GLIBC_2.3 lgetxattr
+000c6000 g DF .text 0000002a GLIBC_2.3.2 pthread_cond_broadcast
+000ab2a0 g DF .text 00000094 GLIBC_2.2 posix_spawn_file_actions_addopen
+0002b830 w DF .text 0000007b GLIBC_2.0 initstate
+00062a90 w DF .text 0000000f GLIBC_2.0 mallopt
+000cceb0 g DF .text 000000fc GLIBC_2.3.4 __vfprintf_chk
+000eb730 g DF .text 000000d7 GLIBC_2.1 grantpt
+000ac8c0 w DF .text 000000d4 GLIBC_2.1 open64
+0005b2f0 g DF .text 000000d9 GLIBC_2.0 getchar
+000ab4b0 g DF .text 00000012 GLIBC_2.2 posix_spawnattr_getflags
+000e0300 g DF .text 0000017a GLIBC_2.0 xdr_string
+000cd3a0 w DF .text 0000000e GLIBC_2.0 ntohs
+00087e40 g DF .text 00000195 GLIBC_2.0 fgetpwent
+000cd4c0 g DF .text 00000105 GLIBC_2.0 inet_ntoa
+0008a440 w DF .text 00000008 GLIBC_2.0 getppid
+000b2700 w DF .text 000000be GLIBC_2.0 tcgetattr
+000e4510 g DF .text 000000fc GLIBC_2.1 user2netname
+000cfd00 g DF .text 00000135 GLIBC_2.0 getservbyport
+000b4310 g DF .text 0000007a GLIBC_2.0 ptrace
+000ca4b0 g DF .text 000000ae GLIBC_2.0 __nss_configure_lookup
+0007b7e0 g DF .text 00000010 GLIBC_2.0 time
+000f3c20 g DF .text 0000003e (GLIBC_2.2) posix_fallocate64
+000b5cb0 g DF .text 00000052 GLIBC_2.0 endusershell
+0006d690 g DF .text 00000042 GLIBC_2.1.1 __strncmp_g
+000854a0 w DF .text 00000134 GLIBC_2.0 opendir
+00058810 g DF .text 000000e7 GLIBC_2.2 __wunderflow
+0006d2a0 g DF .text 00000033 GLIBC_2.1.1 __memcpy_by4
+000cc450 g DF .text 00000050 GLIBC_2.3.4 __memcpy_chk
+000cedf0 g DF .text 000000da GLIBC_2.1.2 getnetent_r
+00060e70 g DF .text 00000138 GLIBC_2.0 __uflow
+0008a490 w DF .text 00000032 GLIBC_2.0 getgroups
+000e1690 g DF .text 00000035 GLIBC_2.0 xdrstdio_create
+0006d880 g DF .text 00000035 GLIBC_2.1.1 __strspn_cg
+000f3ea0 g DF .text 0000006c (GLIBC_2.0) gethostbyaddr_r
+000eec70 g DF .text 00000087 GCC_3.0 __register_frame_info_table_bases
+00035550 g DF .text 0000007d GLIBC_PRIVATE __libc_system
+000d2020 g DF .text 000001c9 GLIBC_2.2 rresvport_af
+000222d0 g DF .text 0000007d GLIBC_2.0 isgraph
+0006e770 g DF .text 000000ab GLIBC_2.0 wcsncpy
+00021bb0 g DF .text 00000162 GLIBC_2.0 __assert_fail
+00052300 g DF .text 00000034 GLIBC_2.0 _IO_sscanf
+0006d760 g DF .text 00000022 GLIBC_2.1.1 __strchrnul_g
+000b1510 w DF .text 000000a2 GLIBC_2.0 poll
+00029680 w DF .text 00000072 GLIBC_2.1 sigtimedwait
+000ba7c0 g DF .text 0000003a GLIBC_2.0 bdflush
+000c60d0 g DF .text 00000033 (GLIBC_2.0) pthread_cond_wait
+000d0490 g DF .text 00000125 GLIBC_2.0 getrpcbynumber
+000bb730 g DF .text 00000047 GLIBC_2.0 ftok
+000f2ac0 g DF .text 0000005f (GLIBC_2.0) getgrnam_r
+000f0c10 g DF .text 0000016c (GLIBC_2.0) _IO_fclose
+000bdf30 g DF .text 0000007d GLIBC_2.1 __iswxdigit_l
+000c6110 g DF .text 0000003a (GLIBC_2.0) pthread_cond_timedwait
+00086d50 g DF .text 000000ee GLIBC_2.2.4 getgrouplist
+00057fd0 g DF .text 0000002d GLIBC_2.2 _IO_switch_to_wbackup_area
+000b6740 g DF .text 00000024 GLIBC_2.0 syslog
+00022050 g DF .text 0000007b GLIBC_2.0 isalnum
+000784e0 w DF .text 00000037 GLIBC_2.1 __wcstof_l
+000ebc20 g DF .text 00000055 GLIBC_2.1 ptsname
+00028500 g DF .text 00000023 GLIBC_2.1 __signbitl
+000600e0 g DF .text 0000003b GLIBC_2.2 _IO_list_resetlock
+00070140 w DF .text 00000024 GLIBC_2.2 wcschrnul
+000829f0 w DF .text 000021b8 GLIBC_2.3 wcsftime_l
+0007d960 w DF .text 0000003a GLIBC_2.0 getitimer
+000b7fa0 w DF .text 00000024 GLIBC_2.0 hdestroy
+00052850 g DF .text 000000af GLIBC_2.0 tmpnam
+00057b50 w DF .text 00000034 GLIBC_2.2 fwprintf
+000abf20 g DF .text 00000082 GLIBC_2.0 __xmknod
+00022350 g DF .text 0000007d GLIBC_2.0 isprint
+000b36c0 g DF .text 0000004d GLIBC_2.0 seteuid
+0002be90 g DF .text 00000034 GLIBC_2.0 mrand48
+000dfca0 g DF .text 0000002a GLIBC_2.0 xdr_u_int
+000e0f40 g DF .text 00000056 GLIBC_2.0 xdrrec_skiprecord
+000568c0 w DF .text 00000093 GLIBC_2.0 __vsscanf
+0005b5d0 w DF .text 000000e7 GLIBC_2.0 putc
+0006c810 g DF .text 00000a85 GLIBC_2.1 __strxfrm_l
+000a42c0 g DF .text 00000048 GLIBC_2.0 getopt_long_only
+0006b750 w DF .text 0000103c GLIBC_2.3 strcoll_l
+000b56e0 g DF .text 0000003c GLIBC_2.0 endttyent
+000e6ca0 g DF .text 000000d3 GLIBC_2.3.4 xdr_u_quad_t
+000be7a0 g DF .text 0000005d GLIBC_2.1 __towctrans_l
+000dbd40 g DF .text 000000b1 GLIBC_2.0 xdr_pmaplist
+000a45d0 g DF .text 0000013f GLIBC_2.3.4 sched_setaffinity
+0006b460 g DF .text 00000088 GLIBC_2.0 envz_strip
+000c5d20 g DF .text 00000033 GLIBC_2.0 pthread_attr_getdetachstate
+000c6030 g DF .text 0000002a (GLIBC_2.0) pthread_cond_destroy
+000ba3c0 w DF .text 00000087 GLIBC_2.0 llseek
+0006dcb0 g DF .text 00000048 GLIBC_2.1.1 __strcspn_c2
+000acb20 w DF .text 0000003c GLIBC_2.0 __lseek
+00102375 g DO .rodata 00000012 GLIBC_2.0 _nl_default_dirname
+000bab00 w DF .text 00000048 GLIBC_2.0 mount
+00028ea0 w DF .text 0000001c GLIBC_2.2 __xpg_sigpause
+000d06b0 g DF .text 000000a6 GLIBC_2.0 endrpcent
+000c71b0 g DF .text 000000c9 GLIBC_2.0 inet_nsap_ntoa
+00027be0 w DF .text 00000011 GLIBC_2.0 finite
+000b2fc0 g DF .text 0000007c GLIBC_2.0 nice
+000555d0 g DF .text 00000045 GLIBC_2.0 _IO_getline
+000b4da0 g DF .text 00000084 GLIBC_2.2 __setmntent
+00087c30 w DF .text 00000208 GLIBC_2.0 fgetgrent_r
+000b4290 g DF .text 00000032 GLIBC_2.0 gtty
+000d21f0 g DF .text 0000001c GLIBC_2.0 rresvport
+000c6880 g DF .text 000000d0 GLIBC_2.0 herror
+0005d1c0 g DF .text 0000005b GLIBC_2.1 fread_unlocked
+00068460 g DF .text 00000043 GLIBC_2.0 strcmp
+00058000 g DF .text 00000035 GLIBC_2.2 _IO_wdefault_uflow
+000b76f0 g DF .text 00000220 GLIBC_2.0 ecvt_r
+00117334 g DO .data 00000004 GLIBC_2.0 __check_rhosts_file
+00115680 g DO .data.rel.ro 00000080 (GLIBC_2.0) _sys_siglist
+000bb3a0 w DF .text 00000039 GLIBC_2.0 shutdown
+000c5a10 w DF .text 00000038 GLIBC_2.1 argp_usage
+000c47c0 w DF .text 0000001d GLIBC_2.1 argp_help
+000e4260 g DF .text 000000f8 GLIBC_2.1 netname2user
+00016910 g DF .text 00000016 GLIBC_PRIVATE __gconv_get_alias_db
+000c62b0 g DF .text 0000002a GLIBC_2.0 pthread_mutex_unlock
+000d9b90 g DF .text 000002ba GLIBC_2.0 callrpc
+000dc710 g DF .text 00000135 GLIBC_2.0 _seterr_reply
+000dd1b0 g DF .text 00000030 GLIBC_2.2.3 __rpc_thread_svc_fdset
+000db950 g DF .text 00000119 GLIBC_2.0 pmap_getmaps
+0002be10 g DF .text 00000034 GLIBC_2.0 lrand48
+00117d84 g DO .data 00000004 GLIBC_2.0 obstack_alloc_failed_handler
+000be420 w DF .text 0000007d GLIBC_2.3 iswpunct_l
+00115480 g DO .data.rel.ro 000001f8 GLIBC_2.3 _sys_errlist
+000ad770 g DF .text 00000274 GLIBC_2.0 ttyname
+000417c0 w DF .text 0000009d GLIBC_2.0 register_printf_function
+00088420 g DF .text 00000125 GLIBC_2.0 getpwuid
+000f1630 g DF .text 00000101 (GLIBC_2.1) _IO_fsetpos64
+000f0ec0 g DF .text 00000235 (GLIBC_2.0) _IO_proc_open
+000ad030 w DF .text 00000036 GLIBC_2.0 dup
+000cd8f0 g DF .text 00000028 GLIBC_2.0 __h_errno_location
+000c9920 g DF .text 00000031 GLIBC_PRIVATE __nss_disable_nscd
+000ab210 g DF .text 00000084 GLIBC_2.2 posix_spawn_file_actions_addclose
+0002cfa0 w DF .text 0000002e GLIBC_2.3 strtoul_l
+000b1850 g DF .text 000002ad GLIBC_2.3.3 posix_fallocate64
+000b4080 w DF .text 0000003a GLIBC_2.0 swapon
+00028c90 w DF .text 0000007a GLIBC_2.0 sigblock
+0006d830 g DF .text 00000048 GLIBC_2.1.1 __strcspn_g
+00027c00 w DF .text 0000001e GLIBC_2.0 copysign
+000297e0 w DF .text 0000009e GLIBC_2.1 sigqueue
+00092ee0 g DF .text 000002ec (GLIBC_2.0) fnmatch
+000ad220 w DF .text 00000137 GLIBC_2.0 getcwd
+000acba0 w DF .text 00000116 GLIBC_2.0 euidaccess
+0006d2e0 g DF .text 0000003c GLIBC_2.1.1 __memcpy_by2
+000c9840 g DF .text 00000028 GLIBC_2.2 __res_state
+000cdd70 g DF .text 0000019a GLIBC_2.0 gethostbyname
+000690c0 g DF .text 000001f2 GLIBC_2.0 strsignal
+00000000 w D *UND* 00000000 _dl_starting_up
+000882f0 g DF .text 00000125 GLIBC_2.0 getpwnam
+00060d70 g DF .text 00000070 GLIBC_2.0 _IO_setb
+000eee30 g DF .text 0000002f GLIBC_2.0 __deregister_frame
+000bf160 g DF .text 000000a6 GLIBC_2.0 endspent
+000d84c0 g DF .text 0000005c GLIBC_2.0 authnone_create
+00022860 w DF .text 00000048 GLIBC_2.3 isctype
+000899e0 g DF .text 00000048 GLIBC_2.1.2 __vfork
+00000000 g DO *ABS* 00000000 GLIBC_2.2.4 GLIBC_2.2.4
+00027f90 w DF .text 0000001e GLIBC_2.0 copysignf
+0006dd60 g DF .text 0000002e GLIBC_2.1.1 __strspn_c1
+00088790 g DF .text 000001de GLIBC_2.1.2 getpwnam_r
+000cfa50 g DF .text 00000135 GLIBC_2.0 getservbyname
+0005b220 w DF .text 000000cc GLIBC_2.0 fgetc
+000b37d0 w DF .text 00000096 GLIBC_2.0 gethostname
+00065960 w DF .text 00000225 GLIBC_2.0 memalign
+00043d60 g DF .text 00000034 GLIBC_2.0 sprintf
+000f20f0 g DF .text 000000e6 (GLIBC_2.0) _IO_file_underflow
+000b8d00 g DF .text 0000014d GLIBC_2.0 vwarn
+00069a70 g DF .text 00000044 GLIBC_2.0 __mempcpy
+000d0b20 g DF .text 00000234 GLIBC_2.0 ether_aton_r
+000da030 g DF .text 0000033d GLIBC_2.0 clnttcp_create
+00043da0 w DF .text 00000034 GLIBC_2.0 asprintf
+000b7050 w DF .text 0000007c GLIBC_2.0 msync
+00053ef0 g DF .text 000001ca GLIBC_2.1 fclose
+000688b0 w DF .text 00000154 GLIBC_2.0 strerror_r
+00059600 g DF .text 000006c2 GLIBC_2.2 _IO_wfile_seekoff
+0007ae90 g DF .text 0000000d GLIBC_2.0 difftime
+000be020 g DF .text 0000007d GLIBC_2.1 __iswalnum_l
+00037a40 w DF .text 0000007b GLIBC_2.1 getcontext
+0002dc50 w DF .text 00000052 GLIBC_2.0 strtof
+0005a080 g DF .text 00000469 GLIBC_2.2 _IO_wfile_underflow
+000b55d0 g DF .text 0000001b GLIBC_2.0 insque
+000328c0 w DF .text 00000027 GLIBC_2.3 strtod_l
+00022550 w DF .text 0000000b GLIBC_2.1 __toascii_l
+000b3af0 w DF .text 000000a2 GLIBC_2.0 pselect
+00022550 g DF .text 0000000b GLIBC_2.0 toascii
+00053db0 g DF .text 0000013e GLIBC_2.0 _IO_file_doallocate
+000545d0 g DF .text 00000151 GLIBC_2.0 _IO_fgets
+00068520 g DF .text 000000ae GLIBC_2.0 strcspn
+001022fc g DO .rodata 00000005 GLIBC_2.0 _libc_intl_domainname
+00069e60 w DF .text 0000004e GLIBC_2.3 strncasecmp_l
+000cf040 g DF .text 000001c7 GLIBC_2.1.2 getnetbyname_r
+000be4a0 w DF .text 0000007d GLIBC_2.3 iswspace_l
+000bdfb0 w DF .text 0000006d GLIBC_2.3 towupper_l
+000be3a0 g DF .text 0000007d GLIBC_2.1 __iswprint_l
+000b7dd0 g DF .text 000001cc GLIBC_2.0 qecvt_r
+000e3ec0 g DF .text 00000068 GLIBC_2.0 xdr_key_netstres
+00058220 g DF .text 00000070 GLIBC_2.2 _IO_init_wmarker
+0006d950 g DF .text 00000045 GLIBC_2.1.1 __strpbrk_g
+00053200 w DF .text 0000002d GLIBC_2.0 flockfile
+0001e9e0 g DF .text 0000065e GLIBC_2.0 setlocale
+000baf60 w DF .text 00000039 GLIBC_2.0 getpeername
+00036e40 g DF .text 00000139 GLIBC_2.0 getsubopt
+000bd5a0 w DF .text 000000d5 GLIBC_2.0 iswdigit
+000b2470 g DF .text 00000074 GLIBC_2.0 cfsetspeed
+000522c0 g DF .text 0000003f GLIBC_2.0 scanf
+0009c410 w DF .text 000000a8 GLIBC_2.0 regerror
+000e3960 g DF .text 0000005a GLIBC_2.1 key_setnet
+0005e500 g DF .text 00000057 GLIBC_2.0 _IO_file_read
+000ce340 g DF .text 00000271 GLIBC_2.1.2 gethostbyname_r
+001178e4 g DO .data 00000004 GLIBC_2.0 stderr
+0007ae50 g DF .text 00000039 GLIBC_2.0 ctime_r
+000b5280 w DF .text 000001a6 GLIBC_2.3 futimes
+000ba450 w DF .text 00000036 GLIBC_2.0 umount
+000e9980 w DF .text 00000062 GLIBC_2.0 pututline
+000d48a0 g DF .text 000000a8 GLIBC_2.0 setaliasent
+000b6f60 w DF .text 00000070 GLIBC_2.1 mmap64
+000bbc30 g DF .text 00000055 GLIBC_2.2 shmctl
+000829f0 g DF .text 000021b8 GLIBC_2.3 __wcsftime_l
+000b4140 g DF .text 00000029 GLIBC_2.0 mkstemp
+0006dd90 g DF .text 00000023 GLIBC_2.1.1 __strspn_c2
+000b5c60 g DF .text 0000004c GLIBC_2.0 getttynam
+000b9510 w DF .text 000000b5 GLIBC_2.0 error
+000be120 g DF .text 0000007d GLIBC_2.1 __iswblank_l
+0002bdd0 g DF .text 00000037 GLIBC_2.0 erand48
+00027df0 w DF .text 0000000d GLIBC_2.0 scalbn
+000ac5f0 w DF .text 00000153 GLIBC_2.1 fstatvfs64
+000899e0 w DF .text 00000048 GLIBC_2.0 vfork
+000d0760 g DF .text 000000ad GLIBC_2.0 setrpcent
+00015d00 g DF .text 0000017e GLIBC_2.1 iconv
+000b63e0 g DF .text 00000023 GLIBC_2.0 setlogmask
+00116a80 g DO .data.rel.ro 00000054 GLIBC_2.0 _IO_file_jumps
+0002b8b0 w DF .text 0000005b GLIBC_2.0 srandom
+000680c0 g DF .text 00000078 GLIBC_2.0 obstack_free
+0006b090 w DF .text 000002e9 GLIBC_2.0 argz_replace
+000bc6c0 w DF .text 000001ba GLIBC_2.0 profil
+0006a3f0 w DF .text 00000090 GLIBC_2.0 strsep
+000e9640 g DF .text 00000050 GLIBC_2.1 putmsg
+000635b0 w DF .text 000000b8 GLIBC_2.0 cfree
+00030150 w DF .text 00000027 GLIBC_2.1 __strtof_l
+000ba140 g DF .text 00000048 GLIBC_2.3 setxattr
+000e1be0 g DF .text 000000b3 GLIBC_2.1 xdr_sizeof
+00022560 w DF .text 00000011 GLIBC_2.1 __isascii_l
+00067450 g DF .text 00000094 GLIBC_2.0 muntrace
+00027f20 g DF .text 00000024 GLIBC_2.0 __isinff
+000ac220 w DF .text 0000012f GLIBC_2.1 fstatfs64
+000891a0 g DF .text 0000007c GLIBC_2.0 __waitpid
+000f41d0 g DF .text 00000037 (GLIBC_2.0) getprotoent_r
+00027bb0 w DF .text 00000027 GLIBC_2.0 isnan
+000f1520 g DF .text 00000101 (GLIBC_2.0) _IO_fsetpos
+000d6890 g DF .text 00000bae GLIBC_2.3 getifaddrs
+00089980 g DF .text 00000059 GLIBC_PRIVATE __libc_fork
+0009feb0 w DF .text 00000092 GLIBC_2.0 re_compile_fastmap
+000e1540 g DF .text 00000142 GLIBC_2.0 xdr_reference
+000f4270 g DF .text 00000066 (GLIBC_2.0) getservbyname_r
+000b8e50 g DF .text 00000023 GLIBC_2.0 verr
+000be520 w DF .text 0000007d GLIBC_2.3 iswupper_l
+00057af0 g DF .text 00000059 GLIBC_2.0 putchar_unlocked
+000a4360 w DF .text 0000003a GLIBC_2.0 sched_setparam
+0002b350 g DF .text 00000044 GLIBC_2.0 ldiv
+000de130 g DF .text 00000222 GLIBC_2.0 registerrpc
+000292f0 g DF .text 00000046 GLIBC_2.0 sigismember
+000705f0 g DF .text 00000052 GLIBC_2.0 __wcstof_internal
+0007b7a0 w DF .text 0000003c GLIBC_2.0 timelocal
+00015620 g DF .text 00000031 (GLIBC_2.0) __fixunsxfdi
+000ab510 g DF .text 00000010 GLIBC_2.2 posix_spawnattr_setpgroup
+000e2690 g DF .text 000000a0 GLIBC_2.1 cbc_crypt
+000c9620 g DF .text 00000106 GLIBC_PRIVATE __res_maybe_init
+00056df0 w DF .text 000000cd GLIBC_2.2 getwc
+0011a8ec g DO .bss 00000004 GLIBC_2.1 __key_gendes_LOCAL
+00043400 g DF .text 000008a1 GLIBC_2.1 printf_size
+00070a60 w DF .text 0000003e GLIBC_2.3 wcstol_l
+000f1100 g DF .text 00000088 (GLIBC_2.0) _IO_popen
+000b3c20 w DF .text 00000071 GLIBC_2.0 fsync
+0006d7c0 g DF .text 00000028 GLIBC_2.1.1 __strrchr_g
+000ac030 g DF .text 00000032 GLIBC_2.2 __lxstat64
+00065670 w DF .text 00000107 GLIBC_2.0 valloc
+0006a3f0 g DF .text 00000090 GLIBC_2.1.1 __strsep_g
+000f3e00 g DF .text 00000037 (GLIBC_2.0) getspent_r
+00028170 w DF .text 00000055 GLIBC_2.0 isinfl
+0005ada0 g DF .text 000000e7 GLIBC_2.0 fputc
+00000000 DF *UND* 000003de GLIBC_2.3 ___tls_get_addr
+000ca610 g DF .text 000003c4 GLIBC_2.0 __nss_database_lookup
+000d1f00 g DF .text 00000031 GLIBC_2.0 iruserok
+0006b4f0 g DF .text 000000df GLIBC_2.0 envz_merge
+000b72e0 g DF .text 00000056 GLIBC_2.0 ecvt
+000be800 g DF .text 000000a2 GLIBC_2.0 getspent
+00078770 g DF .text 00000ee8 GLIBC_2.1 __wcscoll_l
+000cc860 g DF .text 000000b8 GLIBC_2.3.4 __strncpy_chk
+000281d0 w DF .text 00000048 GLIBC_2.0 isnanl
+0005cfa0 g DF .text 00000010 GLIBC_2.0 feof_unlocked
+000c6490 g DF .text 00000065 GLIBC_PRIVATE __librt_enable_asynccancel
+000e0ee0 g DF .text 00000059 GLIBC_2.0 xdrrec_eof
+00058ce0 g DF .text 000000ab GLIBC_2.2 _IO_wdefault_finish
+000ede10 g DF .text 00000043 GLIBC_2.1 _dl_mcount_wrapper_check
+0007da80 g DF .text 0000003e GLIBC_2.0 timegm
+000b9c40 w DF .text 00000073 GLIBC_2.0 step
+0006df50 g DF .text 00000073 GLIBC_2.1.1 __strsep_3c
+000b0ff0 g DF .text 00000517 GLIBC_2.0 fts_read
+0005d0f0 g DF .text 000000d0 GLIBC_2.0 _IO_peekc_locked
+00020e00 w DF .text 00000049 GLIBC_2.3 nl_langinfo_l
+00062aa0 w DF .text 00000087 GLIBC_2.0 mallinfo
+000d9440 g DF .text 000002ac GLIBC_2.0 clnt_sperror
+000bc300 g DF .text 00000042 GLIBC_2.0 _mcleanup
+0005ac90 g DF .text 00000068 GLIBC_2.0 _IO_feof
+000229b0 g DF .text 00000071 GLIBC_2.3 __ctype_b_loc
+0006a640 g DF .text 000000dc GLIBC_2.0 strfry
+00117290 g DO .data 00000004 GLIBC_2.0 optopt
+0005d030 g DF .text 00000039 GLIBC_2.0 getchar_unlocked
+000baee0 w DF .text 00000078 GLIBC_2.0 __connect
+000f3db0 g DF .text 0000004f (GLIBC_2.0) shmctl
+0006db10 g DF .text 00000094 GLIBC_2.1.1 __strcpy_small
+00068780 g DF .text 00000064 GLIBC_2.2 __strndup
+00119b50 g DO .bss 00000004 (GLIBC_2.0) h_errno
+00088550 g DF .text 000000db GLIBC_2.1.2 getpwent_r
+000aadb0 w DF .text 00000082 GLIBC_2.1 pread
+000cfe40 g DF .text 0000016c GLIBC_2.1.2 getservbyport_r
+000c62e0 g DF .text 00000020 GLIBC_2.0 pthread_self
+000f0d80 g DF .text 0000013d (GLIBC_2.0) _IO_proc_close
+000c6340 g DF .text 00000033 GLIBC_2.0 pthread_setcanceltype
+0005ab20 g DF .text 0000010f GLIBC_2.2 fwide
+000bdae0 w DF .text 000000d0 GLIBC_2.0 iswupper
+00115480 g DO .data.rel.ro 000001ec (GLIBC_2.0) _sys_errlist
+000bafe0 w DF .text 00000039 GLIBC_2.0 getsockopt
+00087580 g DF .text 000001de GLIBC_2.1.2 getgrgid_r
+000bf080 g DF .text 000000db GLIBC_2.1.2 getspent_r
+0008ba80 g DF .text 0000006a GLIBC_2.0 globfree
+0007af50 w DF .text 00000033 GLIBC_2.0 localtime_r
+000c67e0 g DF .text 0000009e GLIBC_2.0 hstrerror
+000d60c0 g DF .text 00000021 GLIBC_2.3 freeifaddrs
+000a4a90 g DF .text 00000625 GLIBC_2.0 getaddrinfo
+000168f0 g DF .text 00000016 GLIBC_PRIVATE __gconv_get_modules_db
+00093980 w DF .text 0000001f GLIBC_2.0 re_set_syntax
+000bb420 w DF .text 00000039 GLIBC_2.0 socketpair
+00058140 g DF .text 00000049 GLIBC_2.2 _IO_sputbackwc
+0008a7d0 w DF .text 00000035 GLIBC_2.0 setresgid
+0005d070 g DF .text 0000003e GLIBC_2.0 fflush_unlocked
+000b7150 w DF .text 00000048 GLIBC_2.3.3 remap_file_pages
+000edf70 g DF .text 00000037 GLIBC_PRIVATE __libc_dlclose
+000b8550 w DF .text 00000022 GLIBC_2.0 twalk
+000b5260 w DF .text 00000015 GLIBC_2.3 lutimes
+000f1190 g DF .text 00000021 (GLIBC_2.0) pclose
+000e24f0 g DF .text 000000bf GLIBC_2.1 xdr_authdes_cred
+00080940 g DF .text 00000059 GLIBC_2.0 strftime
+0006abc0 w DF .text 000000c7 GLIBC_2.0 argz_create_sep
+00028050 w DF .text 0000000d GLIBC_2.1 scalblnf
+00057220 g DF .text 0000010f GLIBC_2.2 fputws
+00070a60 w DF .text 0000003e GLIBC_2.1 __wcstol_l
+000e9b90 w DF .text 000000d2 GLIBC_2.0 getutid_r
+0005d220 g DF .text 000000a6 GLIBC_2.1 fwrite_unlocked
+0005bed0 w DF .text 00000034 GLIBC_2.0 obstack_printf
+00118d44 g DO .bss 00000004 GLIBC_2.0 __timezone
+0006eb30 g DF .text 0000009c GLIBC_2.0 wmemcmp
+0007dac0 g DF .text 0000007a GLIBC_2.0 ftime
+0002b3a0 g DF .text 00000095 GLIBC_2.0 lldiv
+0006d3b0 g DF .text 00000035 GLIBC_2.1.1 __memset_gcn_by4
+00058360 g DF .text 00000036 GLIBC_2.2 _IO_unsave_wmarkers
+0006ec30 w DF .text 00000024 GLIBC_2.0 wmemmove
+000b1b50 g DF .text 00000042 GLIBC_2.3 sendfile64
+0005f0a0 g DF .text 00000147 GLIBC_2.0 _IO_file_open
+000ab4d0 g DF .text 0000001e GLIBC_2.2 posix_spawnattr_setflags
+000c7580 g DF .text 00000034 GLIBC_2.0 __res_randomid
+00086590 g DF .text 0000005e GLIBC_2.0 getdirentries
+000221d0 g DF .text 0000007d GLIBC_2.0 isdigit
+000f1f20 g DF .text 00000143 (GLIBC_2.0) _IO_file_overflow
+00054dc0 g DF .text 00000131 GLIBC_2.2 _IO_fsetpos
+000f44d0 g DF .text 0000005f (GLIBC_2.0) getaliasbyname_r
+00069c70 w DF .text 00000091 GLIBC_2.0 stpncpy
+000b41a0 g DF .text 00000043 GLIBC_2.2 mkdtemp
+000b4700 g DF .text 00000084 GLIBC_2.0 getmntent
+000226c0 g DF .text 00000015 GLIBC_2.1 __isalnum_l
+00055210 w DF .text 00000167 GLIBC_2.0 fwrite
+00060120 g DF .text 0000002d GLIBC_2.2 _IO_list_unlock
+000ac9a0 w DF .text 00000071 GLIBC_2.0 __close
+000bad00 g DF .text 00000042 GLIBC_2.0 quotactl
+0007da20 g DF .text 00000058 GLIBC_2.0 dysize
+000f11c0 g DF .text 0000009d (GLIBC_2.0) tmpfile
+0011a8f4 g DO .bss 0000000c GLIBC_2.0 svcauthdes_stats
+00037340 g DF .text 00000631 GLIBC_2.1 fmtmsg
+000acb60 w DF .text 0000003a GLIBC_2.0 access
+0011a664 g DO .bss 00000004 GLIBC_2.0 mallwatch
+000ba550 g DF .text 00000013 GLIBC_2.0 setfsgid
+000abd70 g DF .text 0000008d GLIBC_2.0 __xstat
+000a44d0 g DF .text 00000036 GLIBC_2.0 __sched_get_priority_min
+000aeeb0 g DF .text 00000041 GLIBC_2.3.3 nftw
+0002c4f0 g DF .text 00000059 (GLIBC_2.0) __strtoq_internal
+0005f940 g DF .text 00000077 GLIBC_2.0 _IO_switch_to_get_mode
+0006d600 g DF .text 00000042 GLIBC_2.1.1 __strncat_g
+000e5530 g DF .text 0000005a GLIBC_2.1 passwd2des
+000ab1e0 g DF .text 00000026 GLIBC_2.2 posix_spawn_file_actions_destroy
+000e95a0 g DF .text 0000004d GLIBC_2.1 getmsg
+00048410 g DF .text 00005615 GLIBC_2.0 _IO_vfscanf
+000d8d10 g DF .text 0000016c GLIBC_2.0 bindresvport
+00056960 g DF .text 000001a3 GLIBC_2.2 _IO_fgetpos64
+000d0af0 g DF .text 0000002d GLIBC_2.0 ether_aton
+000cd3a0 g DF .text 0000000e GLIBC_2.0 htons
+00035ab0 w DF .text 00000029 GLIBC_2.0 canonicalize_file_name
+0002dbf0 g DF .text 00000052 GLIBC_2.0 __strtof_internal
+000c6210 g DF .text 0000002a GLIBC_2.0 pthread_mutex_destroy
+0011a840 g DO .bss 00000080 GLIBC_2.0 svc_fdset
+00021680 w DF .text 00000084 GLIBC_2.3 freelocale
+00027110 g DF .text 0000006d GLIBC_2.0 catclose
+001157a0 g DO .data.rel.ro 00000080 (GLIBC_2.0) sys_sigabbrev
+000b8b70 g DF .text 00000075 GLIBC_2.0 lsearch
+00079f60 w DF .text 00000053 GLIBC_2.1 wcscasecmp
+000483d0 w DF .text 00000037 GLIBC_2.0 vfscanf
+000f1630 g DF .text 00000101 (GLIBC_2.1) fsetpos64
+0007e110 g DF .text 00000062 GLIBC_2.0 strptime
+000dd170 g DF .text 00000039 GLIBC_2.2.3 __rpc_thread_createerr
+0005b6c0 g DF .text 000000d2 GLIBC_2.0 rewind
+0002c610 w DF .text 00000058 GLIBC_2.0 strtouq
+00117284 g DO .data 00000004 GLIBC_2.0 re_max_failures
+0005ae90 g DF .text 00000296 GLIBC_2.0 freopen
+00066e00 g DF .text 000000f8 GLIBC_2.0 mcheck
+000589e0 g DF .text 000000e7 GLIBC_2.2 __wuflow
+000a2840 w DF .text 00000037 GLIBC_2.0 re_search
+0005d000 w DF .text 00000028 GLIBC_2.1 fgetc_unlocked
+0008b0f0 g DF .text 00000673 GLIBC_2.2 __sysconf
+000bb840 g DF .text 000000c4 GLIBC_PRIVATE __libc_msgrcv
+0002bbf0 w DF .text 00000117 GLIBC_2.0 initstate_r
+000c6280 g DF .text 0000002a GLIBC_2.0 pthread_mutex_lock
+000f4170 g DF .text 0000005f (GLIBC_2.0) getprotobynumber_r
+0002bd90 g DF .text 00000034 GLIBC_2.0 drand48
+000b27c0 g DF .text 00000041 GLIBC_2.0 tcgetpgrp
+000d5b90 g DF .text 00000046 GLIBC_2.1 if_freenameindex
+00028a40 w DF .text 00000053 GLIBC_2.0 __sigaction
+000cc920 g DF .text 00000032 GLIBC_2.3.4 __sprintf_chk
+00029470 g DF .text 00000035 GLIBC_2.0 sigandset
+00022ef0 w DF .text 00000024 GLIBC_2.0 gettext
+00066840 g DF .text 000003b7 GLIBC_2.0 __libc_calloc
+0006aee0 g DF .text 00000054 GLIBC_2.0 __argz_stringify
+00028170 g DF .text 00000055 GLIBC_2.0 __isinfl
+0002c230 w DF .text 0000006a GLIBC_2.0 lcong48_r
+00119118 g DO .bss 00000004 GLIBC_2.0 __curbrk
+00057690 g DF .text 000000e1 GLIBC_2.2 ungetwc
+00070170 g DF .text 00000059 GLIBC_2.0 __wcstol_internal
+00015690 g DF .text 00000023 (GLIBC_2.0) __fixunsdfdi
+00000000 DO *UND* 00000004 GLIBC_PRIVATE __libc_enable_secure
+0006d450 g DF .text 00000030 GLIBC_2.1.1 __strcpy_g
+000b1510 g DF .text 000000a2 GLIBC_PRIVATE __libc_poll
+000e0810 g DF .text 0000003e GLIBC_2.0 xdr_float
+0005f9c0 g DF .text 00000076 GLIBC_2.0 _IO_doallocbuf
+00069e60 g DF .text 0000004e GLIBC_2.1 __strncasecmp_l
+00000000 g DO *ABS* 00000000 GLIBC_2.2.2 GLIBC_2.2.2
+00060640 w DF .text 00000177 GLIBC_2.2 _flushlbf
+000ce5c0 g DF .text 000000a4 GLIBC_2.0 gethostent
+000809a0 g DF .text 00000059 GLIBC_2.2 wcsftime
+000cebf0 g DF .text 0000014c GLIBC_2.0 getnetbyname
+000dd760 g DF .text 00000074 GLIBC_2.0 svc_unregister
+000155c0 g DF .text 00000028 GLIBC_2.0 __errno_location
+00015960 g DF .text 0000007c (GLIBC_2.0) __divdi3
+00036df0 g DF .text 00000042 GLIBC_2.1 __strfmon_l
+000aded0 w DF .text 0000003a GLIBC_2.0 link
+000bba60 g DF .text 00000062 GLIBC_2.2 semctl
+000b98e0 w DF .text 00000210 GLIBC_2.0 get_nprocs
+0006ac90 g DF .text 00000044 GLIBC_2.0 __argz_next
+00087940 g DF .text 000002e5 GLIBC_PRIVATE _nss_files_parse_grent
+00117488 g DO .data 00000004 (GLIBC_2.2) __ctype32_tolower
+0005bb50 w DF .text 000000f5 GLIBC_2.0 __vsnprintf
+0006e520 g DF .text 0000005b GLIBC_2.0 wcsdup
+000be7a0 w DF .text 0000005d GLIBC_2.3 towctrans_l
+000680c0 g DF .text 00000078 GLIBC_2.0 _obstack_free
+000bb9c0 g DF .text 0000004f GLIBC_2.0 semop
+0002af90 g DF .text 000000db GLIBC_2.0 exit
+000c6060 g DF .text 00000033 (GLIBC_2.0) pthread_cond_init
+00118644 w DO .bss 00000004 GLIBC_2.0 __free_hook
+000c6030 g DF .text 0000002a GLIBC_2.3.2 pthread_cond_destroy
+0006d430 g DF .text 00000016 GLIBC_2.1.1 __strlen_g
+000bdbb0 g DF .text 000000be GLIBC_2.0 towlower
+00000000 w D *UND* 00000000 __pthread_setspecific
+00069d10 g DF .text 00000068 GLIBC_2.0 __strcasecmp
+000bb780 g DF .text 000000b5 GLIBC_PRIVATE __libc_msgsnd
+000abe00 g DF .text 0000008d GLIBC_2.0 __fxstat
+000d1200 g DF .text 0000002d GLIBC_2.0 ether_ntoa
+0002cfa0 w DF .text 0000002e GLIBC_2.1 __strtoul_l
+0002b2c0 g DF .text 00000031 GLIBC_2.0 llabs
+00043d60 g DF .text 00000034 GLIBC_2.0 _IO_sprintf
+000d74f0 g DF .text 0000009d GLIBC_2.3.3 inet6_option_next
+000be320 w DF .text 0000007d GLIBC_2.3 iswgraph_l
+00022e50 w DF .text 00000015 GLIBC_2.0 bindtextdomain
+0007d9e0 g DF .text 00000036 GLIBC_2.0 stime
+000b9e80 g DF .text 0000003c GLIBC_2.3 flistxattr
+000baac0 g DF .text 0000003c GLIBC_2.0 klogctl
+00058c50 g DF .text 00000083 GLIBC_2.2 _IO_wsetb
+000292b0 g DF .text 00000040 GLIBC_2.0 sigdelset
+00035c60 g DF .text 0000007c GLIBC_2.0 rpmatch
+0005b7a0 g DF .text 00000033 GLIBC_2.0 setbuf
+00028060 w DF .text 0000006b GLIBC_2.0 frexpf
+000e5650 g DF .text 000000bb GLIBC_2.0 xencrypt
+00029390 w DF .text 000000a7 GLIBC_2.1 sysv_signal
+000c6bc0 g DF .text 00000255 GLIBC_2.0 inet_ntop
+000283f0 w DF .text 00000072 GLIBC_2.0 frexpl
+00022720 w DF .text 00000017 GLIBC_2.3 isdigit_l
+000b3040 w DF .text 00000042 GLIBC_2.0 brk
+000bd220 w DF .text 000000d5 GLIBC_2.0 iswalnum
+000db490 g DF .text 000000ac GLIBC_2.0 get_myaddress
+00057f30 g DF .text 00000024 GLIBC_2.2 swscanf
+0008a750 w DF .text 00000035 GLIBC_2.0 getresgid
+00021d20 g DF .text 00000195 GLIBC_2.0 __assert_perror_fail
+0003ad40 g DF .text 0000414a GLIBC_2.0 _IO_vfprintf
+00087060 g DF .text 00000125 GLIBC_2.0 getgrnam
+0011a8c0 g DO .bss 0000000c GLIBC_2.0 _null_auth
+0006e470 g DF .text 0000002e GLIBC_2.0 wcscmp
+000e14c0 g DF .text 0000007f GLIBC_2.0 xdr_pointer
+000cdf10 g DF .text 000001a2 GLIBC_2.0 gethostbyname2
+000ab0a0 w DF .text 00000094 GLIBC_2.1 __pwrite64
+000561e0 g DF .text 000000ea GLIBC_2.0 _IO_seekoff
+000ba5c0 g DF .text 0000006b GLIBC_2.3.3 gnu_dev_makedev
+00056b40 g DF .text 00000137 GLIBC_2.2 fsetpos64
+0011a6cc g DO .bss 00000004 GLIBC_2.0 error_one_per_line
+000ddb40 g DF .text 00000062 GLIBC_2.1 _authenticate
+00000000 DO *UND* 00000004 GLIBC_PRIVATE _dl_argv
+000227a0 w DF .text 00000015 GLIBC_2.3 ispunct_l
+000b7290 g DF .text 00000050 GLIBC_2.0 gcvt
+000ba780 w DF .text 00000036 GLIBC_2.1 ntp_adjtime
+00054840 g DF .text 00000033 GLIBC_2.1 fopen
+00029b80 g DF .text 00000028 GLIBC_2.0 atoi
+0008d450 g DF .text 0000006a GLIBC_2.1 globfree64
+0006d910 g DF .text 00000032 GLIBC_2.1.1 __strpbrk_cg
+00022150 g DF .text 0000007b GLIBC_2.0 iscntrl
+000aff20 g DF .text 000000ef GLIBC_2.0 fts_close
+0005cfb0 g DF .text 00000010 GLIBC_2.0 ferror_unlocked
+00027180 g DF .text 00000182 GLIBC_2.0 catopen
+0005b5d0 g DF .text 000000e7 GLIBC_2.0 _IO_putc
+000f3d00 g DF .text 0000004f (GLIBC_2.0) msgctl
+000ba6f0 g DF .text 0000003a (GLIBC_2.0) setrlimit
+000cca70 g DF .text 00000102 GLIBC_2.3.4 __vsnprintf_chk
+000e99f0 w DF .text 00000069 GLIBC_2.0 getutent_r
+000f27d0 g DF .text 000001ed (GLIBC_2.1) scandir64
+0005ad70 g DF .text 00000027 GLIBC_2.0 fileno
+000c4de0 w DF .text 00000b50 GLIBC_2.1 argp_parse
+000b6770 g DF .text 000005c7 GLIBC_2.0 vsyslog
+000370e0 g DF .text 00000072 GLIBC_2.1 addseverity
+000c5ee0 g DF .text 00000033 GLIBC_2.0 pthread_attr_setschedpolicy
+00061220 g DF .text 00000042 GLIBC_2.0 _IO_str_underflow
+000d36d0 g DF .text 0000003f GLIBC_2.0 rexec
+00028670 g DF .text 00000022 GLIBC_2.0 _setjmp
+0005d2d0 g DF .text 000000a2 GLIBC_2.1 fgets_unlocked
+00022930 g DF .text 00000071 GLIBC_2.3 __ctype_toupper_loc
+00071940 w DF .text 0000003e GLIBC_2.3 wcstoull_l
+00028160 g DF .text 0000000d GLIBC_2.1 __signbitf
+00053080 w DF .text 0000003a GLIBC_2.0 getline
+00073ea0 w DF .text 00000037 GLIBC_2.3 wcstod_l
+0006ecc0 w DF .text 00000038 GLIBC_2.0 wcpcpy
+000d0150 g DF .text 000000a6 GLIBC_2.0 endservent
+00000000 w D *UND* 00000000 _IO_stdin_used
+00089a28 g DF .text 00000013 GLIBC_2.0 _exit
+000e6840 g DF .text 000002c8 GLIBC_2.1 svcunix_create
+0006e400 w DF .text 00000034 GLIBC_2.0 wcscat
+00056360 g DF .text 000000e3 GLIBC_2.0 _IO_seekpos
+000f1a90 g DF .text 000003f0 (GLIBC_2.0) _IO_file_seekoff
+00054410 g DF .text 000001b8 GLIBC_2.2 fgetpos
+00078770 w DF .text 00000ee8 GLIBC_2.3 wcscoll_l
+000685d0 w DF .text 00000146 GLIBC_2.1 strverscmp
+00088240 g DF .text 000000a2 GLIBC_2.0 getpwent
+0007aea0 g DF .text 00000033 GLIBC_2.0 gmtime
+00069310 g DF .text 000000ae GLIBC_2.0 strspn
+0006ef90 g DF .text 00000155 GLIBC_2.0 wctob
+0005df90 g DF .text 000001cc GLIBC_2.1 _IO_file_xsputn
+00053ef0 g DF .text 000001ca GLIBC_2.1 _IO_fclose
+000b71e0 g DF .text 0000003a GLIBC_2.0 munlock
+00052980 g DF .text 00000077 GLIBC_2.0 tempnam
+000b6d90 g DF .text 00000168 GLIBC_2.0 daemon
+000b8ed0 g DF .text 000000ef GLIBC_2.0 vwarnx
+000c6240 g DF .text 00000033 GLIBC_2.0 pthread_mutex_init
+00015320 g DF .text 000000e7 GLIBC_2.0 __libc_start_main
+000283e0 w DF .text 0000000d GLIBC_2.1 scalblnl
+000ad0f0 g DF .text 00000078 GLIBC_PRIVATE __libc_creat
+000d0060 g DF .text 000000e2 GLIBC_2.1.2 getservent_r
+00068a10 g DF .text 000000af GLIBC_2.0 strlen
+000ba3c0 w DF .text 00000087 GLIBC_2.1 lseek64
+0006aa00 w DF .text 00000078 GLIBC_2.0 argz_append
+00028b30 g DF .text 00000034 GLIBC_2.0 sigpending
+000ac840 w DF .text 0000007c GLIBC_2.0 open
+000b4040 g DF .text 00000036 GLIBC_2.0 vhangup
+00086140 g DF .text 0000018f GLIBC_2.2 readdir64_r
+000f2b20 g DF .text 00000037 (GLIBC_2.0) getpwent_r
+00117db4 w DO .data 00000004 GLIBC_2.0 program_invocation_name
+000e6e80 g DF .text 0000003f GLIBC_2.1 xdr_uint32_t
+000abbb0 g DF .text 00000015 GLIBC_2.2 posix_spawnattr_getschedpolicy
+000ba330 w DF .text 0000008e GLIBC_2.0 clone
+000edfb0 g DF .text 00000063 GLIBC_PRIVATE __libc_dlsym
+00021ef0 g DF .text 00000068 GLIBC_2.0 toupper
+000e0640 g DF .text 000001c7 GLIBC_2.0 xdr_array
+00057c10 g DF .text 00000039 GLIBC_2.2 wprintf
+000483d0 g DF .text 00000037 GLIBC_2.0 __vfscanf
+000e4090 g DF .text 0000006c GLIBC_2.0 xdr_cryptkeyarg2
+000acd00 w DF .text 000000b3 GLIBC_2.0 __fcntl
+000b2ae0 g DF .text 00000032 GLIBC_2.2 getrlimit
+000b9f00 g DF .text 00000048 GLIBC_2.3 fsetxattr
+00029be0 g DF .text 00000028 GLIBC_2.0 atoll
+000e3410 g DF .text 00000037 GLIBC_2.1 des_setparity
+000f1390 g DF .text 00000181 (GLIBC_2.1) fgetpos64
+0007ada0 g DF .text 00000088 GLIBC_2.0 clock
+000530c0 g DF .text 00000049 GLIBC_2.0 getw
+000e3de0 g DF .text 00000068 GLIBC_2.1 xdr_getcredres
+0006d6e0 g DF .text 00000021 GLIBC_2.1.1 __strchr_c
+00078570 g DF .text 00000052 GLIBC_2.0 wcsxfrm
+0005b9b0 w DF .text 000000da GLIBC_2.0 vdprintf
+00021ec0 g DF .text 00000025 GLIBC_2.2 __assert
+0005fd30 g DF .text 0000003f GLIBC_2.0 _IO_init
+00022760 w DF .text 00000017 GLIBC_2.3 isgraph_l
+000763d0 w DF .text 00000037 GLIBC_2.1 __wcstold_l
+00117478 g DO .data 00000004 (GLIBC_2.0) __ctype_b
+000eb880 w DF .text 00000398 GLIBC_2.1 ptsname_r
+00021520 g DF .text 00000159 GLIBC_2.1 __duplocale
+00094c00 w DF .text 00000060 GLIBC_2.0 regfree
+0006ac90 w DF .text 00000044 GLIBC_2.0 argz_next
+0006e210 g DF .text 00000051 GLIBC_2.1.1 __strsep_1c
+00089980 g DF .text 00000059 GLIBC_2.0 __fork
+0002b300 g DF .text 00000044 GLIBC_2.0 div
+000eb070 w DF .text 0000010d GLIBC_2.0 updwtmp
+00022580 w DF .text 00000015 GLIBC_2.3 isblank_l
+000f3a80 g DF .text 00000042 (GLIBC_2.0) regexec
+0002b2a0 g DF .text 0000000d GLIBC_2.0 abs
+00070470 g DF .text 00000052 GLIBC_2.0 __wcstod_internal
+000682f0 g DF .text 00000167 GLIBC_2.0 strchr
+000e9a60 w DF .text 0000004c GLIBC_2.0 setutent
+000f2070 g DF .text 00000072 (GLIBC_2.0) _IO_file_attach
+000600b0 g DF .text 00000007 GLIBC_2.2 _IO_iter_end
+00078670 g DF .text 000000f5 GLIBC_2.0 wcswidth
+000cc540 g DF .text 0000004e GLIBC_2.3.4 __mempcpy_chk
+000e2480 g DF .text 00000069 GLIBC_2.1 xdr_authdes_verf
+00054b50 w DF .text 00000146 GLIBC_2.0 fputs
+0006ace0 g DF .text 00000080 GLIBC_2.0 argz_delete
+0011a8cc g DO .bss 00000004 GLIBC_2.2 svc_max_pollfd
+000ba780 w DF .text 00000036 GLIBC_2.0 adjtimex
+00089fd0 g DF .text 000002de GLIBC_2.0 execvp
+000d0ec0 g DF .text 00000334 GLIBC_2.0 ether_line
+000c5e60 g DF .text 00000033 GLIBC_2.0 pthread_attr_setschedparam
+00079fc0 w DF .text 0000006c GLIBC_2.1 wcsncasecmp
+001157a0 g DO .data.rel.ro 00000104 GLIBC_2.3.3 sys_sigabbrev
+0008a6e0 w DF .text 0000002e GLIBC_2.0 setsid
+000ee290 g DF .text 0000001f GLIBC_PRIVATE _dl_sym
+0005cb10 g DF .text 00000036 GLIBC_PRIVATE __libc_fatal
+000355d0 g DF .text 000004d7 GLIBC_2.3 realpath
+000880c0 g DF .text 00000175 GLIBC_2.0 putpwent
+000b3090 g DF .text 00000073 GLIBC_2.0 __sbrk
+000b3710 g DF .text 0000004d GLIBC_2.0 setegid
+000b7010 w DF .text 0000003c GLIBC_2.0 mprotect
+0005e390 g DF .text 00000082 GLIBC_2.1 _IO_file_attach
+000ba840 g DF .text 0000003a GLIBC_2.1 capset
+000b0c40 g DF .text 00000124 GLIBC_2.0 fts_children
+0011a8d0 g DO .bss 00000010 GLIBC_2.0 rpc_createerr
+000abc50 g DF .text 0000001d GLIBC_2.2 posix_spawnattr_setschedpolicy
+000f0940 g DF .text 0000005a (GLIBC_2.0) fopencookie
+0011a6e8 g DO .bss 00000004 GLIBC_2.1 argp_program_version_hook
+00028e30 g DF .text 00000069 GLIBC_2.0 __sigpause
+000855e0 w DF .text 00000085 GLIBC_2.0 closedir
+00058ad0 g DF .text 00000175 GLIBC_2.2 _IO_wdefault_pbackfail
+00029770 g DF .text 00000069 GLIBC_PRIVATE __libc_sigwaitinfo
+000b8eb0 g DF .text 0000001d GLIBC_2.0 warn
+000bf430 g DF .text 000003f5 GLIBC_PRIVATE _nss_files_parse_spent
+00056df0 w DF .text 000000cd GLIBC_2.2 fgetwc
+000cef80 g DF .text 000000b2 GLIBC_2.0 setnetent
+00052250 w DF .text 00000037 GLIBC_2.2 vfwscanf
+000be720 w DF .text 00000071 GLIBC_2.3 wctrans_l
+0006e0c0 g DF .text 0000005f GLIBC_2.1.1 __strncpy_byn
+0002b3a0 w DF .text 00000095 GLIBC_2.1.1 imaxdiv
+00117698 g DO .data 00000004 GLIBC_2.0 _IO_list_all
+000b9bc0 w DF .text 0000007c GLIBC_2.0 advance
+000ba880 g DF .text 0000003c GLIBC_2.0 create_module
+000703b0 w DF .text 00000058 GLIBC_2.0 wcstouq
+000ee020 g DF .text 00000054 GLIBC_PRIVATE __libc_dlopen_mode
+0006dfd0 g DF .text 00000031 GLIBC_2.1.1 __memcpy_c
+000b5f80 g DF .text 0000001d GLIBC_2.0 setusershell
+0006b5d0 g DF .text 00000047 GLIBC_2.0 envz_remove
+0005b820 w DF .text 00000181 GLIBC_2.0 vasprintf
+000b9f50 g DF .text 00000042 GLIBC_2.3 getxattr
+000deda0 g DF .text 00000025 GLIBC_2.0 svcudp_create
+000c5d60 g DF .text 00000033 GLIBC_2.0 pthread_attr_setdetachstate
+000bb160 w DF .text 00000078 GLIBC_2.0 recvmsg
+0005cfc0 g DF .text 0000003b GLIBC_2.0 fputc_unlocked
+0006a8a0 w DF .text 0000015f GLIBC_2.1.1 strchrnul
+0011a8e0 g DO .bss 00000004 GLIBC_2.2 svc_pollfd
+000de020 g DF .text 00000105 GLIBC_2.0 svc_run
+00000000 DO *UND* 0000000e GLIBC_PRIVATE _dl_out_of_memory
+00086530 g DF .text 00000024 GLIBC_2.2 alphasort64
+0005c7c0 g DF .text 0000000f GLIBC_2.2 __fwriting
+000227e0 g DF .text 00000017 GLIBC_2.1 __isupper_l
+00028b70 g DF .text 000000a2 GLIBC_PRIVATE __libc_sigsuspend
+000f3bf0 g DF .text 00000024 (GLIBC_2.2) posix_fadvise64
+0011a8f0 g DO .bss 00000004 GLIBC_2.1 __key_decryptsession_pk_LOCAL
+000acd00 w DF .text 000000b3 GLIBC_2.0 fcntl
+00000000 g DO *ABS* 00000000 GLIBC_2.1.3 GLIBC_2.1.3
+0007c870 w DF .text 00000074 GLIBC_2.0 tzset
+000cf8e0 g DF .text 00000165 GLIBC_2.1.2 getprotobyname_r
+000a4460 w DF .text 0000002e GLIBC_2.0 sched_yield
+000cfb90 g DF .text 0000016c GLIBC_2.1.2 getservbyname_r
+000bdd70 g DF .text 00000072 GLIBC_2.0 __iswctype
+0006ddc0 g DF .text 00000028 GLIBC_2.1.1 __strspn_c3
+000edba0 g DF .text 00000269 GLIBC_PRIVATE _dl_addr
+00066f00 g DF .text 00000030 GLIBC_2.2 mcheck_pedantic
+000bd060 g DF .text 00000013 GLIBC_2.0 _mcount
+00028470 w DF .text 00000084 GLIBC_2.0 ldexpl
+00056d80 g DF .text 0000006e GLIBC_2.2 fputwc_unlocked
+0008a4d0 w DF .text 0000002f GLIBC_2.0 setuid
+0008a5d0 w DF .text 00000036 GLIBC_2.0 getpgid
+000ac8c0 w DF .text 000000d4 GLIBC_2.2 __open64
+0005f1f0 g DF .text 0000042b GLIBC_2.1 _IO_file_fopen
+0002bed0 g DF .text 00000037 GLIBC_2.0 jrand48
+00060b80 g DF .text 00000135 GLIBC_2.0 _IO_un_link
+000ee3f0 g DF .text 00000036 GLIBC_2.0 __register_frame_info_table
+00086340 g DF .text 000001ed GLIBC_2.2 scandir64
+0005e420 g DF .text 000000a4 GLIBC_2.1 _IO_file_write
+000b3d50 g DF .text 000001fa GLIBC_2.0 gethostid
+000f40b0 g DF .text 00000041 (GLIBC_2.0) getnetent_r
+0005c500 g DF .text 000000e3 GLIBC_2.1 fseeko64
+000b98e0 w DF .text 00000210 GLIBC_2.0 get_nprocs_conf
+000ad360 g DF .text 00000074 GLIBC_2.0 getwd
+000a29c0 w DF .text 00000047 GLIBC_2.0 re_exec
+000d7490 g DF .text 00000011 GLIBC_2.3.3 inet6_option_space
+000da9c0 g DF .text 00000340 GLIBC_2.0 clntudp_bufcreate
+00060490 g DF .text 00000142 GLIBC_2.0 _IO_default_pbackfail
+000b24f0 g DF .text 0000020c GLIBC_2.0 tcsetattr
+00119b50 w DO .bss 00000004 (GLIBC_2.0) _h_errno
+0006d4c0 g DF .text 00000040 GLIBC_2.1.1 __mempcpy_by2
+00029440 g DF .text 0000002c GLIBC_2.0 sigisemptyset
+000ac800 w DF .text 0000003a GLIBC_2.0 mkdir
+00028d10 w DF .text 0000007a GLIBC_2.0 sigsetmask
+00065b90 w DF .text 0000008c GLIBC_2.2 posix_memalign
+000ee3b0 g DF .text 00000036 GLIBC_2.0 __register_frame_info
+000bb910 g DF .text 0000004e GLIBC_2.0 msgget
+000d9820 g DF .text 00000129 GLIBC_2.0 clntraw_create
+000be9e0 g DF .text 0000013a GLIBC_2.0 sgetspent
+00028c20 w DF .text 00000066 GLIBC_2.0 sigwait
+0006f3b0 w DF .text 000002bc GLIBC_2.0 wcrtomb
+0006dd00 g DF .text 00000058 GLIBC_2.1.1 __strcspn_c3
+000aae90 w DF .text 00000082 GLIBC_2.1 pwrite
+00027e00 w DF .text 00000073 GLIBC_2.0 frexp
+000ac9a0 w DF .text 00000071 GLIBC_2.0 close
+00041860 g DF .text 00000108 GLIBC_2.0 parse_printf_format
+000b7220 g DF .text 00000036 GLIBC_2.0 mlockall
+000784e0 w DF .text 00000037 GLIBC_2.3 wcstof_l
+0008aa40 g DF .text 00000015 GLIBC_2.0 setlogin
+0011747c g DO .data 00000004 (GLIBC_2.0) __ctype32_b
+000c5e20 g DF .text 00000033 GLIBC_2.0 pthread_attr_getschedparam
+000600c0 g DF .text 0000000b GLIBC_2.2 _IO_iter_next
+000abff0 g DF .text 00000032 GLIBC_2.2 __fxstat64
+000bbad0 g DF .text 0000004b GLIBC_2.3.3 semtimedop
+0002b570 g DF .text 000000c4 GLIBC_2.0 mbtowc
+0002c1a0 w DF .text 00000039 GLIBC_2.0 srand48_r
+00117d80 w DO .data 00000004 GLIBC_2.0 __memalign_hook
+000859d0 g DF .text 0000000b GLIBC_2.0 telldir
+00023d40 w DF .text 00000048 GLIBC_2.2 dcngettext
+000b4630 g DF .text 00000070 GLIBC_2.0 getfsspec
+0005cbf0 g DF .text 0000013b GLIBC_2.2 fmemopen
+000ab420 g DF .text 00000007 GLIBC_2.2 posix_spawnattr_destroy
+0003ad40 g DF .text 0000414a GLIBC_2.0 vfprintf
+00069c70 g DF .text 00000091 GLIBC_2.0 __stpncpy
+00117600 g DO .data 00000098 GLIBC_2.1 _IO_2_1_stderr_
+00117db4 g DO .data 00000004 GLIBC_2.0 __progname_full
+000cc590 g DF .text 000000db GLIBC_2.3.4 __memset_chk
+00028220 g DF .text 0000000e GLIBC_2.0 __finitel
+00115680 g DO .data.rel.ro 00000104 GLIBC_2.3.3 _sys_siglist
+00068fb0 g DF .text 000000b3 GLIBC_2.0 strpbrk
+000b2810 g DF .text 00000033 GLIBC_2.0 tcsetpgrp
+00000000 g DO *ABS* 00000000 GLIBC_2.3 GLIBC_2.3
+00000000 DO *UND* 00000004 GLIBC_2.1 __libc_stack_end
+0008e100 g DF .text 00000e58 GLIBC_2.2 glob64
+000cb8f0 g DF .text 0000008a GLIBC_2.0 __nss_passwd_lookup
+000dfc00 g DF .text 0000002a GLIBC_2.0 xdr_int
+000dfcd0 g DF .text 000000d6 GLIBC_2.1.1 xdr_hyper
+00028b70 w DF .text 000000a2 GLIBC_2.0 sigsuspend
+00056c80 g DF .text 000000fc GLIBC_2.2 fputwc
+00028850 g DF .text 00000046 GLIBC_2.0 raise
+000b45b0 g DF .text 00000071 GLIBC_2.0 getfsfile
+000b2900 g DF .text 00000033 GLIBC_2.0 tcflow
+000d91b0 g DF .text 00000084 GLIBC_2.0 clnt_sperrno
+000227c0 g DF .text 00000017 GLIBC_2.1 __isspace_l
+0005ff70 g DF .text 0000007c GLIBC_2.0 _IO_seekmark
+000635b0 g DF .text 000000b8 GLIBC_2.0 free
+000bded0 g DF .text 0000005d GLIBC_2.1 __towctrans
+000c9870 g DF .text 000000b0 GLIBC_PRIVATE __gai_sigqueue
+000dff40 g DF .text 00000068 GLIBC_2.0 xdr_u_short
+000f08b0 g DF .text 0000003d (GLIBC_2.0) realpath
+00028aa0 w DF .text 0000004b GLIBC_2.0 sigprocmask
+00054840 g DF .text 00000033 GLIBC_2.1 _IO_fopen
+000c7510 g DF .text 00000070 GLIBC_2.2 __res_nclose
+000e3e50 g DF .text 0000006c GLIBC_2.0 xdr_key_netstarg
+0006f0f0 w DF .text 00000019 GLIBC_2.0 mbsinit
+000bafa0 g DF .text 00000039 GLIBC_2.0 getsockname
+00056b10 w DF .text 00000030 GLIBC_2.1 fopen64
+000bddf0 w DF .text 000000d2 GLIBC_2.0 wctrans
+000b5500 w DF .text 00000050 GLIBC_2.1 ftruncate64
+
+
diff --git a/scripts/t/Dpkg_Shlibs/objdump.libc6-2.6 b/scripts/t/Dpkg_Shlibs/objdump.libc6-2.6
new file mode 100644
index 0000000..ba68d1c
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.libc6-2.6
@@ -0,0 +1,2345 @@
+
+/lib/libc.so.6: file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x000161b0
+
+Program Header:
+ PHDR off 0x00000034 vaddr 0x00000034 paddr 0x00000034 align 2**2
+ filesz 0x00000140 memsz 0x00000140 flags r-x
+ INTERP off 0x0012d550 vaddr 0x0012d550 paddr 0x0012d550 align 2**0
+ filesz 0x00000013 memsz 0x00000013 flags r--
+ LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
+ filesz 0x00140ca4 memsz 0x00140ca4 flags r-x
+ LOAD off 0x001411f0 vaddr 0x001411f0 paddr 0x001411f0 align 2**12
+ filesz 0x0000278c memsz 0x00005400 flags rw-
+ DYNAMIC off 0x00142d9c vaddr 0x00142d9c paddr 0x00142d9c align 2**2
+ filesz 0x000000f0 memsz 0x000000f0 flags rw-
+ NOTE off 0x00000174 vaddr 0x00000174 paddr 0x00000174 align 2**2
+ filesz 0x00000020 memsz 0x00000020 flags r--
+ TLS off 0x001411f0 vaddr 0x001411f0 paddr 0x001411f0 align 2**2
+ filesz 0x00000008 memsz 0x0000002c flags r--
+EH_FRAME off 0x0012d564 vaddr 0x0012d564 paddr 0x0012d564 align 2**2
+ filesz 0x00002a2c memsz 0x00002a2c flags r--
+ STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
+ filesz 0x00000000 memsz 0x00000000 flags rw-
+ RELRO off 0x001411f8 vaddr 0x001411f0 paddr 0x001411f0 align 2**0
+ filesz 0x00001c94 memsz 0x00001c80 flags r--
+
+Dynamic Section:
+ NEEDED ld-linux.so.2
+ SONAME libc.so.6
+ INIT 0x15ea0
+ FINI_ARRAY 0x1411f8
+ FINI_ARRAYSZ 0x4
+ HASH 0x13d99c
+ GNU_HASH 0x194
+ STRTAB 0xc85c
+ SYMTAB 0x3c4c
+ STRSZ 0x567a
+ SYMENT 0x10
+ PLTGOT 0x142ff4
+ PLTRELSZ 0x40
+ PLTREL 0x11
+ JMPREL 0x15d3c
+ REL 0x13374
+ RELSZ 0x29c8
+ RELENT 0x8
+ VERDEF 0x13058
+ VERDEFNUM 0x15
+ FLAGS 0x10
+ VERNEED 0x13334
+ VERNEEDNUM 0x1
+ VERSYM 0x11ed6
+ RELCOUNT 0x4db
+
+Version definitions:
+1 0x01 0x0865f4e6 libc.so.6
+2 0x00 0x0d696910 GLIBC_2.0
+3 0x00 0x0d696911 GLIBC_2.1
+ GLIBC_2.0
+4 0x00 0x09691f71 GLIBC_2.1.1
+ GLIBC_2.1
+5 0x00 0x09691f72 GLIBC_2.1.2
+ GLIBC_2.1.1
+6 0x00 0x09691f73 GLIBC_2.1.3
+ GLIBC_2.1.2
+7 0x00 0x0d696912 GLIBC_2.2
+ GLIBC_2.1.3
+8 0x00 0x09691a71 GLIBC_2.2.1
+ GLIBC_2.2
+9 0x00 0x09691a72 GLIBC_2.2.2
+ GLIBC_2.2.1
+10 0x00 0x09691a73 GLIBC_2.2.3
+ GLIBC_2.2.2
+11 0x00 0x09691a74 GLIBC_2.2.4
+ GLIBC_2.2.3
+12 0x00 0x09691a76 GLIBC_2.2.6
+ GLIBC_2.2.4
+13 0x00 0x0d696913 GLIBC_2.3
+ GLIBC_2.2.6
+14 0x00 0x09691972 GLIBC_2.3.2
+ GLIBC_2.3
+15 0x00 0x09691973 GLIBC_2.3.3
+ GLIBC_2.3.2
+16 0x00 0x09691974 GLIBC_2.3.4
+ GLIBC_2.3.3
+17 0x00 0x0d696914 GLIBC_2.4
+ GLIBC_2.3.4
+18 0x00 0x0d696915 GLIBC_2.5
+ GLIBC_2.4
+19 0x00 0x0d696916 GLIBC_2.6
+ GLIBC_2.5
+20 0x00 0x0963cf85 GLIBC_PRIVATE
+ GLIBC_2.6
+21 0x00 0x0b792650 GCC_3.0
+
+Version References:
+ required from ld-linux.so.2:
+ 0x0963cf85 0x00 24 GLIBC_PRIVATE
+ 0x0d696913 0x00 23 GLIBC_2.3
+ 0x0d696911 0x00 22 GLIBC_2.1
+
+DYNAMIC SYMBOL TABLE:
+00000000 w D *UND* 00000000 _IO_stdin_used
+00000000 w D *UND* 00000000 _dl_starting_up
+00000000 DO *UND* 00000004 GLIBC_2.1 __libc_stack_end
+00000000 DF *UND* 00000135 GLIBC_2.3 ___tls_get_addr
+00000000 DF *UND* 00000085 GLIBC_PRIVATE _dl_tls_get_addr_soft
+00000000 DO *UND* 000001c0 GLIBC_PRIVATE _rtld_global_ro
+00000000 DO *UND* 00000004 GLIBC_PRIVATE __libc_enable_secure
+00000000 DO *UND* 00000004 GLIBC_PRIVATE _dl_argv
+00000000 DO *UND* 00000588 GLIBC_PRIVATE _rtld_global
+000756d0 g DF .text 00000023 GLIBC_2.1.1 __strspn_c1
+0005bc90 g DF .text 00000101 GLIBC_2.2 putwchar
+000e8950 g DF .text 00000034 GLIBC_2.4 __gethostname_chk
+00075700 g DF .text 00000025 GLIBC_2.1.1 __strspn_c2
+000ec880 g DF .text 000000a8 GLIBC_2.0 setrpcent
+0007b760 w DF .text 00000039 GLIBC_2.1 __wcstod_l
+00075730 g DF .text 0000002a GLIBC_2.1.1 __strspn_c3
+000b7640 w DF .text 00000034 GLIBC_2.0 sched_get_priority_min
+000d32b0 g DF .text 00000034 GLIBC_2.3.2 epoll_create
+000e8990 g DF .text 00000024 GLIBC_2.4 __getdomainname_chk
+000d3590 g DF .text 0000003a GLIBC_2.0 klogctl
+00023eb0 g DF .text 00000011 GLIBC_2.1 __tolower_l
+00046630 g DF .text 00000034 GLIBC_2.0 dprintf
+000800b0 g DF .text 00000ef3 GLIBC_2.1 __wcscoll_l
+00093590 w DF .text 00000070 GLIBC_2.0 setuid
+000d5fe0 w DF .text 000000cb GLIBC_2.0 iswalpha
+000835a0 g DF .text 00000038 GLIBC_2.0 __gettimeofday
+000f0cb0 g DF .text 0000007c GLIBC_PRIVATE __internal_endnetgrent
+000cbca0 g DF .text 00000034 GLIBC_2.0 chroot
+001447c0 w DO .bss 00000004 GLIBC_2.0 daylight
+0010e2b0 g DF .text 00000063 (GLIBC_2.0) _IO_file_setbuf
+00063b10 g DF .text 00000063 GLIBC_2.1 _IO_file_setbuf
+000861f0 g DF .text 00000052 GLIBC_2.1 getdate
+000e8090 g DF .text 00000107 GLIBC_2.4 __vswprintf_chk
+0010e320 g DF .text 0000015d (GLIBC_2.0) _IO_file_fopen
+000df640 g DF .text 0000003c GLIBC_2.3.2 pthread_cond_signal
+00111240 g DF .text 0000003c (GLIBC_2.0) pthread_cond_signal
+00063d30 g DF .text 000005e0 GLIBC_2.1 _IO_file_fopen
+0002fb70 w DF .text 00000030 GLIBC_2.3 strtoull_l
+000fc6b0 g DF .text 00000068 GLIBC_2.0 xdr_short
+00059a30 g DF .text 000000e9 GLIBC_2.0 _IO_padn
+000d1740 g DF .text 00000048 GLIBC_2.0 lfind
+00071a00 w DF .text 00000151 GLIBC_2.1 strcasestr
+00092740 g DF .text 000002e3 GLIBC_PRIVATE __libc_fork
+00103570 g DF .text 000000bc GLIBC_2.1.1 xdr_int64_t
+0007b760 w DF .text 00000039 GLIBC_2.3 wcstod_l
+000d3ee0 w DF .text 00000037 GLIBC_2.0 socket
+00100360 g DF .text 00000081 GLIBC_2.1 key_encryptsession_pk
+00072090 w DF .text 00000095 GLIBC_2.0 argz_create
+000752d0 g DF .text 00000045 GLIBC_2.1.1 __strpbrk_g
+0005bf20 g DF .text 00000049 GLIBC_2.0 putchar_unlocked
+000f8960 g DF .text 000000f3 GLIBC_2.0 xdr_pmaplist
+000e3790 g DF .text 000000f7 GLIBC_2.2 __res_init
+00039340 g DF .text 00000095 GLIBC_2.0 __xpg_basename
+000e6980 g DF .text 00000033 GLIBC_2.3.4 __stpcpy_chk
+0005fc60 w DF .text 000000e7 GLIBC_2.0 getc
+0005d0a0 g DF .text 00000133 GLIBC_2.2 _IO_wdefault_xsputn
+00076770 w DF .text 000000bc GLIBC_2.0 wcpncpy
+000cc210 g DF .text 0000003d GLIBC_2.2 mkdtemp
+0002e190 w DF .text 00000039 GLIBC_2.0 srand48_r
+0002b520 g DF .text 00000078 GLIBC_2.1 sighold
+0006dc50 g DF .text 00000022 GLIBC_2.0 __default_morecore
+000b7510 g DF .text 00000038 GLIBC_2.0 __sched_getparam
+000ef5e0 g DF .text 00000076 GLIBC_2.0 iruserok
+0003bf30 g DF .text 0000009b GLIBC_2.0 cuserid
+00029440 w DF .text 00000027 GLIBC_2.0 isnan
+0002d8e0 w DF .text 00000106 GLIBC_2.0 setstate_r
+000766e0 g DF .text 00000045 GLIBC_2.0 wmemset
+00109f60 g DF .text 00000086 GCC_3.0 __register_frame_info_bases
+00000000 g DO *ABS* 00000000 GCC_3.0 GCC_3.0
+00063270 g DF .text 00000025 GLIBC_2.0 _IO_file_stat
+00072580 w DF .text 0000038f GLIBC_2.0 argz_replace
+00097320 g DF .text 0000006a GLIBC_2.1 globfree64
+000df030 w DF .text 00000037 GLIBC_2.1 argp_usage
+0012d508 g DO .rodata 00000004 (GLIBC_2.1) _sys_nerr
+0012d50c g DO .rodata 00000004 (GLIBC_2.3) _sys_nerr
+0012d500 g DO .rodata 00000004 GLIBC_2.4 _sys_nerr
+0012d504 g DO .rodata 00000004 (GLIBC_2.0) _sys_nerr
+00072210 w DF .text 00000046 GLIBC_2.0 argz_next
+00146334 g DO .bss 00000004 GLIBC_2.1 getdate_err
+00111110 g DF .text 0000005f (GLIBC_2.0) getspnam_r
+000d7eb0 g DF .text 0000017d GLIBC_2.1.2 getspnam_r
+00092740 g DF .text 000002e3 GLIBC_2.0 __fork
+000b75d0 g DF .text 0000002c GLIBC_2.0 __sched_yield
+000e3790 w DF .text 000000f7 (GLIBC_2.0) res_init
+00082a70 g DF .text 00000032 GLIBC_2.0 __gmtime_r
+00037e30 g DF .text 0000004f GLIBC_2.0 l64a
+00062130 g DF .text 00000094 GLIBC_2.1 _IO_file_attach
+0010da30 g DF .text 00000085 (GLIBC_2.0) _IO_file_attach
+00075360 g DF .text 00000046 GLIBC_2.1.1 __strstr_g
+0008b0d0 w DF .text 00002517 GLIBC_2.3 wcsftime_l
+00059890 w DF .text 00000180 GLIBC_2.0 gets
+00061d80 g DF .text 00000036 GLIBC_2.0 putc_unlocked
+000ec440 g DF .text 0000012d GLIBC_2.0 getrpcbyname
+00058280 w DF .text 000000f8 GLIBC_2.0 fflush
+000fa6e0 g DF .text 00000062 GLIBC_2.1 _authenticate
+00037d40 g DF .text 000000e4 GLIBC_2.0 a64l
+000d0a20 g DF .text 0000002d GLIBC_2.0 hcreate
+0006fa50 g DF .text 00000022 GLIBC_2.0 strcpy
+00015e80 g DF .text 00000005 GLIBC_2.0 __libc_init_first
+000fc3b0 g DF .text 00000041 GLIBC_2.0 xdr_long
+000d4800 g DF .text 00000062 GLIBC_2.0 shmget
+0002a640 w DF .text 000000a7 GLIBC_2.0 sigsuspend
+0005e700 g DF .text 00000170 GLIBC_2.2 _IO_wdo_write
+00056990 g DF .text 00000049 GLIBC_2.0 getw
+000cbe50 g DF .text 00000173 GLIBC_2.0 gethostid
+00056e70 w DF .text 0000004b GLIBC_2.0 flockfile
+00071d40 g DF .text 000000c6 GLIBC_2.1 __rawmemchr
+00081a30 w DF .text 00000073 GLIBC_2.3 wcsncasecmp_l
+00071ff0 w DF .text 00000049 GLIBC_2.0 argz_add
+000e6260 g DF .text 000002bc GLIBC_2.1 __backtrace_symbols
+00075a60 g DF .text 0000005d GLIBC_2.1.1 __strncpy_byn
+00060330 w DF .text 0000017f GLIBC_2.0 vasprintf
+00064870 g DF .text 000001d0 GLIBC_2.0 _IO_un_link
+000e8ba0 g DF .text 00000050 GLIBC_2.4 __wcstombs_chk
+000d5c60 g DF .text 00000013 GLIBC_2.0 _mcount
+00077dd0 g DF .text 0000003e GLIBC_2.0 __wcstod_internal
+000f55d0 g DF .text 000001d0 GLIBC_2.0 authunix_create
+000765d0 g DF .text 000000a0 GLIBC_2.0 wmemcmp
+00082a70 w DF .text 00000032 GLIBC_2.0 gmtime_r
+000c2cf0 w DF .text 00000038 GLIBC_2.0 fchmod
+000e6f90 g DF .text 000000d4 GLIBC_2.3.4 __printf_chk
+00060800 w DF .text 000001c5 GLIBC_2.0 obstack_vprintf
+00075200 g DF .text 00000033 GLIBC_2.1.1 __strspn_cg
+000e8640 g DF .text 00000158 GLIBC_2.4 __fgetws_chk
+00016650 g DF .text 00000038 (GLIBC_2.0) __cmpdi2
+000dfb20 g DF .text 000000eb GLIBC_2.3.2 __register_atfork
+00090090 g DF .text 000000a7 GLIBC_2.0 setgrent
+0002a790 w DF .text 00000055 GLIBC_2.0 sigwait
+000d71b0 w DF .text 0000006e GLIBC_2.3 iswctype_l
+000d6840 w DF .text 0000007b GLIBC_2.0 wctrans
+0003d040 g DF .text 000043ec GLIBC_2.0 _IO_vfprintf
+000cbc60 g DF .text 00000034 GLIBC_2.0 acct
+0002cd30 g DF .text 000000f9 GLIBC_2.0 exit
+000e8f40 g DF .text 00000007 GLIBC_2.0 htonl
+00092dc0 g DF .text 0000015d GLIBC_2.0 execl
+0009f030 w DF .text 0000001f GLIBC_2.0 re_set_syntax
+000eb4c0 g DF .text 000000b0 GLIBC_2.0 endprotoent
+000bf940 g DF .text 0000150f GLIBC_2.1 wordexp
+000eb190 g DF .text 0000017d GLIBC_2.1.2 getprotobynumber_r
+001117c0 g DF .text 0000005f (GLIBC_2.0) getprotobynumber_r
+00023830 g DF .text 00000027 GLIBC_2.2 __assert
+00029410 w DF .text 0000002d GLIBC_2.0 isinf
+00061c50 g DF .text 0000000b GLIBC_2.0 clearerr_unlocked
+00100a60 g DF .text 0000002a GLIBC_2.0 xdr_keybuf
+0009e4f0 g DF .text 000002e9 GLIBC_2.2.3 fnmatch
+0009e4f0 g DF .text 000002e9 (GLIBC_2.0) fnmatch
+00023dd0 g DF .text 00000017 GLIBC_2.1 __islower_l
+000d2f70 g DF .text 00000028 GLIBC_2.3.3 gnu_dev_major
+000e8f50 g DF .text 0000000e GLIBC_2.0 htons
+00103730 g DF .text 0000003f GLIBC_2.1 xdr_uint32_t
+0008e1a0 w DF .text 000000af GLIBC_2.0 readdir
+0002e1d0 w DF .text 0000004a GLIBC_2.0 seed48_r
+0002b5a0 g DF .text 00000078 GLIBC_2.1 sigrelse
+00093ef0 w DF .text 000001e0 GLIBC_2.0 pathconf
+000e5280 g DF .text 00000652 GLIBC_2.2.2 __nss_hostname_digits_dots
+00092c00 g DF .text 00000034 GLIBC_2.0 execv
+000465b0 g DF .text 00000034 GLIBC_2.0 sprintf
+00060070 g DF .text 000000f6 GLIBC_2.0 _IO_putc
+000d3670 g DF .text 0000003a GLIBC_2.0 nfsservctl
+00072a10 g DF .text 0000013e GLIBC_2.0 envz_merge
+00020670 g DF .text 0000065e GLIBC_2.0 setlocale
+00088f70 w DF .text 0000215c GLIBC_2.3 strftime_l
+00071c90 g DF .text 0000001d GLIBC_2.0 memfrob
+00076bd0 w DF .text 00000218 GLIBC_2.0 mbrtowc
+00106e70 w DF .text 000000c9 GLIBC_2.0 getutid_r
+0002d800 w DF .text 00000060 GLIBC_2.0 srand
+000d6be0 w DF .text 00000090 GLIBC_2.3 iswcntrl_l
+000dfd70 g DF .text 00000071 GLIBC_PRIVATE __libc_pthread_init
+000d60b0 w DF .text 000000c9 GLIBC_2.1 iswblank
+0006e920 g DF .text 00000005 GLIBC_2.0 tr_break
+000c36f0 w DF .text 00000070 GLIBC_2.0 __write
+000cba10 g DF .text 00000088 GLIBC_2.0 __select
+000d5e80 g DF .text 00000081 GLIBC_2.0 towlower
+000e8520 g DF .text 000000f8 GLIBC_2.4 __vfwprintf_chk
+0005b4f0 g DF .text 000000ad GLIBC_2.2 fgetws_unlocked
+000c48c0 w DF .text 000002c8 GLIBC_2.0 ttyname_r
+00058860 g DF .text 00000032 GLIBC_2.1 fopen
+0010cab0 g DF .text 00000097 (GLIBC_2.0) fopen
+000bb6b0 g DF .text 0000014f GLIBC_2.1 gai_strerror
+00076210 w DF .text 000000a4 GLIBC_2.0 wcsncpy
+000d7670 g DF .text 0000018e GLIBC_2.0 fgetspent
+00070630 g DF .text 00000226 GLIBC_2.0 strsignal
+00070150 g DF .text 000000f7 GLIBC_2.0 strncmp
+000eae60 g DF .text 000001d2 GLIBC_2.1.2 getnetbyname_r
+00111750 g DF .text 00000066 (GLIBC_2.0) getnetbyname_r
+000fb280 g DF .text 00000012 GLIBC_2.0 svcfd_create
+000eb3d0 g DF .text 000000e4 GLIBC_2.1.2 getprotoent_r
+000cdb40 w DF .text 00000038 GLIBC_2.0 ftruncate
+00111820 g DF .text 000000e7 (GLIBC_2.0) getprotoent_r
+00074f30 g DF .text 0000003c GLIBC_2.1.1 __strncpy_gg
+00100850 g DF .text 0000008d GLIBC_2.1 xdr_unixcred
+00025880 w DF .text 00000047 GLIBC_2.2 dcngettext
+000f91e0 g DF .text 00000087 GLIBC_2.0 xdr_rmtcallres
+0005a0a0 g DF .text 00000195 GLIBC_2.0 _IO_puts
+000e10f0 g DF .text 000001d4 GLIBC_2.0 inet_nsap_addr
+000dfff0 w DF .text 00000169 GLIBC_2.0 inet_aton
+000bb800 g DF .text 0000005b GLIBC_2.1 wordfree
+001464e0 g DO .bss 00000004 GLIBC_2.0 __rcmd_errstr
+000cebd0 g DF .text 000000e5 GLIBC_2.0 ttyslot
+000c1280 g DF .text 00000084 GLIBC_2.2 posix_spawn_file_actions_addclose
+000657c0 g DF .text 00000038 GLIBC_2.0 _IO_unsave_markers
+0008efb0 g DF .text 0000005f GLIBC_2.0 getdirentries
+00064da0 g DF .text 00000039 GLIBC_2.0 _IO_default_uflow
+000e7e00 g DF .text 00000041 GLIBC_2.4 __wcpcpy_chk
+0002fca0 g DF .text 0000003e GLIBC_2.0 __strtold_internal
+001430d0 g DO .data 00000004 GLIBC_2.0 optind
+00075490 g DF .text 00000089 GLIBC_2.1.1 __strcpy_small
+0002dda0 g DF .text 00000037 GLIBC_2.0 erand48
+00146370 g DO .bss 00000004 GLIBC_2.1 argp_program_version
+000786e0 w DF .text 00000040 GLIBC_2.3 wcstoul_l
+000d3030 w DF .text 0000003a GLIBC_2.1 modify_ldt
+0006ba10 g DF .text 000001c5 GLIBC_2.0 __libc_memalign
+000d3f60 g DF .text 00000062 GLIBC_2.0 isfdtype
+000755e0 g DF .text 0000003b GLIBC_2.1.1 __strcspn_c1
+000cc5f0 g DF .text 000000d6 GLIBC_2.0 getfsfile
+00075620 g DF .text 00000048 GLIBC_2.1.1 __strcspn_c2
+0002df50 g DF .text 0000002d GLIBC_2.0 lcong48
+00090ee0 g DF .text 000000a2 GLIBC_2.0 getpwent
+00075670 g DF .text 00000058 GLIBC_2.1.1 __strcspn_c3
+000b5920 w DF .text 0000004b GLIBC_2.0 re_match_2
+00144104 w DO .bss 00000004 GLIBC_2.0 __free_hook
+0008fc60 g DF .text 00000257 GLIBC_2.1 putgrent
+00072470 w DF .text 00000054 GLIBC_2.0 argz_stringify
+000ec0d0 g DF .text 000000e4 GLIBC_2.1.2 getservent_r
+00111a70 g DF .text 000000e7 (GLIBC_2.0) getservent_r
+0005f360 g DF .text 000000ec GLIBC_2.4 open_wmemstream
+000f4580 g DF .text 00000106 GLIBC_2.5 inet6_opt_append
+00070300 g DF .text 000001b9 GLIBC_2.0 strrchr
+000ec270 g DF .text 000000a8 GLIBC_2.0 setservent
+001084a0 w DF .text 000000f3 GLIBC_2.2.1 posix_openpt
+000f9e30 g DF .text 00000042 GLIBC_2.0 svcerr_systemerr
+00061d30 g DF .text 00000042 GLIBC_2.0 fflush_unlocked
+000e8050 g DF .text 00000039 GLIBC_2.4 __swprintf_chk
+00023df0 g DF .text 00000017 GLIBC_2.1 __isgraph_l
+000c1d20 g DF .text 0000001d GLIBC_2.2 posix_spawnattr_setschedpolicy
+0005a680 w DF .text 00000127 GLIBC_2.0 setbuffer
+00091ec0 w DF .text 000000ac GLIBC_2.0 wait
+0005bff0 g DF .text 00000036 GLIBC_2.2 vwprintf
+0006bbe0 w DF .text 0000008c GLIBC_2.2 posix_memalign
+000f3bd0 g DF .text 00000118 GLIBC_2.3.4 getipv4sourcefilter
+00074e00 g DF .text 00000030 GLIBC_2.1.1 __strcpy_g
+000e83f0 g DF .text 00000108 GLIBC_2.4 __vwprintf_chk
+000562c0 g DF .text 00000074 GLIBC_2.0 tempnam
+00023980 g DF .text 00000048 GLIBC_2.0 isalpha
+000320d0 w DF .text 00000029 GLIBC_2.3 strtof_l
+00110890 g DF .text 00000042 (GLIBC_2.0) regexec
+000d2d90 w DF .text 000000a5 GLIBC_2.0 llseek
+000b59f0 g DF .text 000000e7 GLIBC_2.3.4 regexec
+000cc080 g DF .text 00000022 GLIBC_2.0 revoke
+000b59b0 w DF .text 0000003a GLIBC_2.0 re_match
+000d0ed0 w DF .text 000003f4 GLIBC_2.0 tdelete
+000c4f70 g DF .text 00000128 GLIBC_2.4 readlinkat
+000c3fc0 w DF .text 00000034 GLIBC_2.0 pipe
+000e7cb0 g DF .text 0000004c GLIBC_2.4 __wctomb_chk
+000d2300 w DF .text 0000001a GLIBC_2.0 get_avphys_pages
+000f5180 g DF .text 00000170 GLIBC_2.0 authunix_create_default
+0005f6a0 g DF .text 0000009a GLIBC_2.0 _IO_ferror
+000ec590 g DF .text 0000012d GLIBC_2.0 getrpcbynumber
+00072040 w DF .text 00000041 GLIBC_2.0 argz_count
+0006fc90 g DF .text 00000057 GLIBC_2.0 __strdup
+00094670 g DF .text 0000041d GLIBC_2.2 __sysconf
+000e7b00 g DF .text 0000005d GLIBC_2.4 __readlink_chk
+000cb620 w DF .text 00000076 GLIBC_2.0 setregid
+000e2440 g DF .text 0000002b GLIBC_2.2 __res_ninit
+000ca740 w DF .text 000000ac GLIBC_2.0 tcdrain
+000f3cf0 g DF .text 0000014a GLIBC_2.3.4 setipv4sourcefilter
+000ca8f0 g DF .text 00000030 GLIBC_2.0 cfmakeraw
+00077e90 w DF .text 0000003f GLIBC_2.0 wcstold
+000cafc0 g DF .text 00000073 GLIBC_2.0 __sbrk
+00059d20 g DF .text 00000299 GLIBC_2.1 _IO_proc_open
+000d4720 g DF .text 0000007b GLIBC_2.0 shmat
+00055d50 g DF .text 00000197 GLIBC_2.0 perror
+0010d070 g DF .text 00000299 (GLIBC_2.0) _IO_proc_open
+000666c0 g DF .text 00000042 GLIBC_2.0 _IO_str_pbackfail
+00143338 g DO .data 00000008 GLIBC_2.0 __tzname
+00037e80 g DF .text 00000152 GLIBC_2.0 rpmatch
+000c2b50 w DF .text 00000095 GLIBC_2.1 statvfs64
+000e8920 g DF .text 00000024 GLIBC_2.4 __getlogin_r_chk
+00143344 g DO .data 00000004 GLIBC_2.0 __progname
+00046500 w DF .text 00000024 GLIBC_2.0 _IO_fprintf
+0006ad30 w DF .text 00000105 GLIBC_2.0 pvalloc
+00024420 w DF .text 00000049 GLIBC_2.0 dcgettext
+000facd0 g DF .text 000001f2 GLIBC_2.0 registerrpc
+0005e4b0 g DF .text 0000024d GLIBC_2.2 _IO_wfile_overflow
+00077c90 g DF .text 00000046 GLIBC_2.1 wcstoll
+000c1580 g DF .text 00000010 GLIBC_2.2 posix_spawnattr_setpgroup
+00144a94 w DO .bss 00000004 GLIBC_2.0 _environ
+000d0810 g DF .text 000001d1 GLIBC_2.0 qecvt_r
+0010e4f0 g DF .text 000000fe (GLIBC_2.0) _IO_do_write
+000d0140 g DF .text 000001ff GLIBC_2.0 ecvt_r
+00063120 g DF .text 0000002a GLIBC_2.1 _IO_do_write
+00064c90 g DF .text 00000078 GLIBC_2.0 _IO_switch_to_get_mode
+00075eb0 w DF .text 00000034 GLIBC_2.0 wcscat
+00108f50 g DF .text 00000023 GLIBC_2.1 getutxid
+001465ac g DO .bss 00000004 GLIBC_2.1 __key_gendes_LOCAL
+00076df0 w DF .text 00000241 GLIBC_2.0 wcrtomb
+000299f0 g DF .text 0000000d GLIBC_2.1 __signbitf
+000ca1c0 g DF .text 0000004c GLIBC_2.6 sync_file_range
+001462f0 g DO .bss 00000004 (GLIBC_2.0) _obstack
+000ea5f0 g DF .text 00000162 GLIBC_2.0 getnetbyaddr
+000d3a50 w DF .text 0000006c GLIBC_2.0 connect
+000762c0 g DF .text 00000041 GLIBC_2.0 wcspbrk
+00000008 g D .tbss 00000004 GLIBC_PRIVATE errno
+00029440 g DF .text 00000027 GLIBC_2.0 __isnan
+00075170 g DF .text 00000033 GLIBC_2.1.1 __strcspn_cg
+00072b50 g DF .text 00000096 GLIBC_2.0 envz_remove
+00029f60 w DF .text 00000064 GLIBC_2.0 _longjmp
+00025910 w DF .text 00000041 GLIBC_2.2 ngettext
+00029960 w DF .text 00000090 GLIBC_2.0 ldexpf
+0005f750 w DF .text 00000034 GLIBC_2.0 fileno_unlocked
+00146350 g DO .bss 00000004 GLIBC_2.0 error_print_progname
+00029d90 g DF .text 00000023 GLIBC_2.1 __signbitl
+00125578 g DO .rodata 00000010 GLIBC_2.1 in6addr_any
+000cd800 g DF .text 00000022 GLIBC_2.3 lutimes
+001090b0 w DF .text 00000175 GLIBC_2.2.4 dl_iterate_phdr
+00100210 g DF .text 0000005f GLIBC_2.1 key_get_conv
+000cfc20 g DF .text 00000038 GLIBC_2.0 munlock
+000910f0 g DF .text 0000012d GLIBC_2.0 getpwuid
+000711c0 w DF .text 00000091 GLIBC_2.0 stpncpy
+000cdbf0 w DF .text 00000063 GLIBC_2.1 ftruncate64
+000c95f0 g DF .text 00000040 GLIBC_2.1 sendfile
+000cf9b0 w DF .text 0000006e GLIBC_2.1 mmap64
+000e3aa0 g DF .text 00000038 GLIBC_PRIVATE __nss_disable_nscd
+0010ef60 g DF .text 000000e5 (GLIBC_2.0) getpwent_r
+00091240 g DF .text 000000e2 GLIBC_2.1.2 getpwent_r
+000f4870 g DF .text 0000006c GLIBC_2.5 inet6_rth_init
+0002b1d0 g DF .text 0000004f GLIBC_PRIVATE __libc_allocate_rtsig_private
+00029d00 w DF .text 00000086 GLIBC_2.0 ldexpl
+000f4310 g DF .text 00000075 GLIBC_2.5 inet6_opt_next
+000fedc0 g DF .text 000000bc GLIBC_2.1 ecb_crypt
+0005ba60 g DF .text 000000bb GLIBC_2.2 ungetwc
+0008e730 g DF .text 00000024 GLIBC_2.1 versionsort
+000fc670 g DF .text 0000001a GLIBC_2.1.1 xdr_longlong_t
+0007fe70 w DF .text 00000039 GLIBC_2.1 __wcstof_l
+000d0da0 w DF .text 0000005b GLIBC_2.0 tfind
+00046530 g DF .text 00000039 GLIBC_2.0 _IO_printf
+00072210 g DF .text 00000046 GLIBC_2.0 __argz_next
+00076670 w DF .text 00000034 GLIBC_2.0 wmemcpy
+000c1450 g DF .text 00000035 GLIBC_2.2 posix_spawnattr_init
+000c25d0 g DF .text 0000015d GLIBC_2.4 __fxstatat64
+0002acd0 g DF .text 0000002a GLIBC_2.0 __sigismember
+00074c90 g DF .text 0000003d GLIBC_2.1.1 __memcpy_by2
+000c42e0 g DF .text 000000c2 GLIBC_2.0 get_current_dir_name
+000d4650 g DF .text 00000075 GLIBC_2.2 semctl
+00110f20 g DF .text 0000006f (GLIBC_2.0) semctl
+00061c80 g DF .text 00000036 GLIBC_2.0 fputc_unlocked
+00077040 w DF .text 00000058 GLIBC_2.0 mbsrtowcs
+00074c50 g DF .text 00000033 GLIBC_2.1.1 __memcpy_by4
+000d1aa0 g DF .text 00000023 GLIBC_2.0 verr
+000eb040 g DF .text 0000012d GLIBC_2.0 getprotobynumber
+000c50e0 g DF .text 0000014b GLIBC_2.4 unlinkat
+00023d50 w DF .text 00000015 GLIBC_2.3 isalnum_l
+000fe140 g DF .text 00000103 GLIBC_2.0 getsecretkey
+00113170 g DF __libc_thread_freeres_fn 00000031 GLIBC_PRIVATE __libc_thread_freeres
+000fecb0 g DF .text 00000056 GLIBC_2.1 xdr_authdes_verf
+00143420 g DO .data 00000098 GLIBC_2.1 _IO_2_1_stdin_
+0002fba0 g DF .text 0000003e GLIBC_2.0 __strtof_internal
+0008e150 w DF .text 0000004e GLIBC_2.0 closedir
+0008f750 g DF .text 000000b4 GLIBC_2.0 initgroups
+000e90d0 g DF .text 00000152 GLIBC_2.0 inet_ntoa
+0007fe70 w DF .text 00000039 GLIBC_2.3 wcstof_l
+00023250 g DF .text 00000088 GLIBC_2.1 __freelocale
+0010f130 g DF .text 00001755 (GLIBC_2.1) glob64
+000981f0 g DF .text 00001755 GLIBC_2.2 glob64
+000e82d0 g DF .text 000000fb GLIBC_2.4 __fwprintf_chk
+000f9270 g DF .text 000000fd GLIBC_2.0 pmap_rmtcall
+00060070 w DF .text 000000f6 GLIBC_2.0 putc
+000926d0 w DF .text 0000006c GLIBC_2.0 nanosleep
+000c40e0 w DF .text 00000034 GLIBC_2.0 fchdir
+000fc790 g DF .text 00000037 GLIBC_2.0 xdr_char
+000d7da0 g DF .text 000000a7 GLIBC_2.0 setspent
+00058ac0 g DF .text 000000cc GLIBC_2.2 fopencookie
+0010ca50 g DF .text 0000005a (GLIBC_2.0) fopencookie
+00029410 g DF .text 0000002d GLIBC_2.0 __isinf
+000e6850 g DF .text 0000004e GLIBC_2.3.4 __mempcpy_chk
+0005ce10 g DF .text 00000165 GLIBC_2.2 _IO_wdefault_pbackfail
+000f10c0 g DF .text 000000b0 GLIBC_2.0 endaliasent
+00056ed0 w DF .text 00000069 GLIBC_2.0 ftrylockfile
+00078c50 w DF .text 00000040 GLIBC_2.3 wcstoll_l
+00023d70 w DF .text 00000017 GLIBC_2.3 isalpha_l
+00061c60 g DF .text 00000010 GLIBC_2.0 feof_unlocked
+00023d00 g DF .text 00000046 GLIBC_2.0 isblank
+000b58d0 w DF .text 0000004a GLIBC_2.0 re_search_2
+000f9d40 g DF .text 0000004e GLIBC_2.0 svc_sendreply
+00023300 w DF .text 00000084 GLIBC_2.3 uselocale
+000ce920 g DF .text 00000040 GLIBC_2.0 getusershell
+0002ac10 g DF .text 000000b9 GLIBC_2.0 siginterrupt
+0008f9c0 g DF .text 0000012d GLIBC_2.0 getgrgid
+000d3330 g DF .text 0000007c GLIBC_2.3.2 epoll_wait
+000d20a0 w DF .text 000000d7 GLIBC_2.0 error
+0005af20 g DF .text 00000111 GLIBC_2.2 fputwc
+000c1f40 g DF .text 00000041 GLIBC_2.4 mkfifoat
+00111b80 g DF .text 000000e7 (GLIBC_2.0) getrpcent_r
+000d3450 g DF .text 00000034 GLIBC_2.0 get_kernel_syms
+000ec6e0 g DF .text 000000e4 GLIBC_2.1.2 getrpcent_r
+00058fa0 w DF .text 000001d1 GLIBC_2.0 ftell
+000e7980 g DF .text 0000005d GLIBC_2.4 __read_chk
+00145800 g DO .bss 00000200 (GLIBC_2.0) _res
+000e02e0 g DF .text 00000947 GLIBC_2.0 inet_ntop
+00070250 g DF .text 000000a7 GLIBC_2.0 strncpy
+0002a060 w DF .text 000000cf GLIBC_2.0 signal
+000cb950 g DF .text 00000074 GLIBC_2.0 getdomainname
+000e87c0 g DF .text 000000a8 GLIBC_2.4 __fgetws_unlocked_chk
+000e2470 g DF .text 00000112 GLIBC_2.2 __res_nclose
+000d36b0 w DF .text 00000034 GLIBC_2.0 personality
+0005a0a0 w DF .text 00000195 GLIBC_2.0 puts
+000d7020 g DF .text 00000092 GLIBC_2.1 __iswupper_l
+000e6d70 g DF .text 000000c2 GLIBC_2.3.4 __vsprintf_chk
+0002d480 g DF .text 00000046 GLIBC_2.0 mbstowcs
+000228b0 g DF .text 000007fa GLIBC_2.1 __newlocale
+000cae30 g DF .text 0000004d GLIBC_2.0 getpriority
+00039210 g DF .text 00000130 GLIBC_2.0 getsubopt
+000ca920 g DF .text 000000a7 GLIBC_2.1 tcgetsid
+00092740 w DF .text 000002e3 GLIBC_2.0 fork
+000569e0 g DF .text 0000003f GLIBC_2.0 putw
+000d1c10 g DF .text 0000001d GLIBC_2.0 warnx
+000d2b60 g DF .text 0000003a GLIBC_2.0 ioperm
+0005a7d0 g DF .text 00000189 GLIBC_2.0 _IO_setvbuf
+000f8340 g DF .text 00000100 GLIBC_2.0 pmap_unset
+00109590 g DF .text 00000043 GLIBC_2.1 _dl_mcount_wrapper_check
+000d6590 w DF .text 000000cb GLIBC_2.0 iswspace
+00106780 g DF .text 0000001e GLIBC_2.1 isastream
+0005c100 g DF .text 0000003c GLIBC_2.2 vwscanf
+0002a4c0 w DF .text 0000009e GLIBC_2.0 sigprocmask
+000650e0 g DF .text 0000004b GLIBC_2.0 _IO_sputbackc
+0005b5a0 g DF .text 00000122 GLIBC_2.2 fputws
+0002eea0 w DF .text 00000030 GLIBC_2.3 strtoul_l
+00125588 g DO .rodata 00000010 GLIBC_2.1 in6addr_loopback
+000d2910 g DF .text 0000003a GLIBC_2.3 listxattr
+00075090 g DF .text 0000001c GLIBC_2.1.1 __strchr_c
+0002e220 w DF .text 0000006a GLIBC_2.0 lcong48_r
+0009f550 w DF .text 00000060 GLIBC_2.0 regfree
+000e8ff0 g DF .text 0000002f GLIBC_2.0 inet_netof
+000b7510 w DF .text 00000038 GLIBC_2.0 sched_getparam
+000244a0 w DF .text 00000023 GLIBC_2.0 gettext
+000921f0 w DF .text 000001cd GLIBC_2.1 waitid
+0002adb0 g DF .text 00000060 GLIBC_2.0 sigfillset
+0005c660 g DF .text 0000006c GLIBC_2.2 _IO_init_wmarker
+000cd830 w DF .text 00000157 GLIBC_2.3 futimes
+000f6860 g DF .text 000002d3 GLIBC_2.0 callrpc
+000750b0 g DF .text 0000001e GLIBC_2.1.1 __strchr_g
+000cc2f0 g DF .text 00000044 GLIBC_2.0 gtty
+00083580 g DF .text 0000001b GLIBC_2.0 time
+0006b890 g DF .text 00000180 GLIBC_2.0 __libc_malloc
+0008f900 g DF .text 000000a2 GLIBC_2.0 getgrent
+000d3130 w DF .text 00000034 GLIBC_2.1 ntp_adjtime
+000e7e50 g DF .text 0000003b GLIBC_2.4 __wcsncpy_chk
+000cb5a0 w DF .text 00000076 GLIBC_2.0 setreuid
+0002b130 g DF .text 0000005f GLIBC_2.0 sigorset
+00065420 g DF .text 00000024 GLIBC_2.0 _IO_flush_all
+0008e270 w DF .text 00000110 GLIBC_2.0 readdir_r
+0002df80 g DF .text 0000002e GLIBC_2.0 drand48_r
+0006ba10 w DF .text 000001c5 GLIBC_2.0 memalign
+00050a50 w DF .text 00000039 GLIBC_2.0 vfscanf
+0005adc0 g DF .text 0000013c GLIBC_2.2 fsetpos64
+0010d900 g DF .text 0000010e (GLIBC_2.1) fsetpos64
+000eaca0 g DF .text 000000b0 GLIBC_2.0 endnetent
+000d0aa0 g DF .text 000001cd GLIBC_2.0 hsearch_r
+000e8bf0 g DF .text 00000046 GLIBC_2.4 __stack_chk_fail
+00081910 w DF .text 00000047 GLIBC_2.1 wcscasecmp
+000cf7e0 g DF .text 0000016f GLIBC_2.0 daemon
+0005f5f0 g DF .text 0000009a GLIBC_2.0 _IO_feof
+001004f0 g DF .text 0000005a GLIBC_2.1 key_setsecret
+000c20b0 g DF .text 0000008e GLIBC_2.0 __lxstat
+000fab50 g DF .text 0000012a GLIBC_2.0 svc_run
+0005d000 g DF .text 00000093 GLIBC_2.2 _IO_wdefault_finish
+00110f90 g DF .text 00000062 (GLIBC_2.0) shmctl
+000786e0 w DF .text 00000040 GLIBC_2.1 __wcstoul_l
+000d4870 g DF .text 00000065 GLIBC_2.2 shmctl
+000d3550 g DF .text 00000038 GLIBC_2.4 inotify_rm_watch
+00103570 g DF .text 000000bc GLIBC_2.3.4 xdr_quad_t
+00058280 g DF .text 000000f8 GLIBC_2.0 _IO_fflush
+00076bd0 g DF .text 00000218 GLIBC_2.0 __mbrtowc
+000c50a0 w DF .text 00000034 GLIBC_2.0 unlink
+0005be00 g DF .text 00000101 GLIBC_2.0 putchar
+000fcf40 g DF .text 00000032 GLIBC_2.0 xdrmem_create
+000df850 g DF .text 0000003c GLIBC_2.0 pthread_mutex_lock
+00061fe0 g DF .text 000000a7 GLIBC_2.1 fgets_unlocked
+000d7820 g DF .text 000003c3 GLIBC_2.0 putspent
+000d3b80 g DF .text 00000037 GLIBC_2.0 listen
+001036f0 g DF .text 0000003f GLIBC_2.1 xdr_int32_t
+000d43c0 w DF .text 000000c5 GLIBC_2.0 msgrcv
+000ee340 g DF .text 00000060 GLIBC_2.0 __ivaliduser
+000ec380 g DF .text 000000a2 GLIBC_2.0 getrpcent
+000cba10 w DF .text 00000088 GLIBC_2.0 select
+000d3d10 w DF .text 0000006c GLIBC_2.0 __send
+000d63f0 w DF .text 000000cb GLIBC_2.0 iswprint
+000c2ec0 w DF .text 00000038 GLIBC_2.0 mkdir
+000d6a20 g DF .text 00000090 GLIBC_2.1 __iswalnum_l
+00023e30 w DF .text 00000015 GLIBC_2.3 ispunct_l
+000617c0 g DF .text 00000036 GLIBC_PRIVATE __libc_fatal
+00146374 g DO .bss 00000004 GLIBC_2.1 argp_program_version_hook
+000d47a0 g DF .text 00000060 GLIBC_2.0 shmdt
+0006cff0 g DF .text 00000487 GLIBC_2.0 realloc
+000c10c0 w DF .text 000000ef GLIBC_2.1 __pwrite64
+0002d6f0 w DF .text 0000007f GLIBC_2.0 setstate
+000c2770 w DF .text 00000038 GLIBC_2.0 fstatfs
+0012754e g DO .rodata 00000005 GLIBC_2.0 _libc_intl_domainname
+0012d518 g DO .rodata 00000004 GLIBC_2.0 h_nerr
+000f23d0 g DF .text 0000031c GLIBC_2.1 if_nameindex
+00076870 w DF .text 0000018e GLIBC_2.0 btowc
+00072470 g DF .text 00000054 GLIBC_2.0 __argz_stringify
+0005a980 g DF .text 000000ac GLIBC_2.0 _IO_ungetc
+00075a30 g DF .text 00000022 GLIBC_2.1.1 __memset_cc
+0008e3a0 g DF .text 00000068 GLIBC_2.0 rewinddir
+0005c620 g DF .text 0000003f GLIBC_2.2 _IO_adjust_wcolumn
+0002fce0 w DF .text 0000003f GLIBC_2.0 strtold
+000d6ab0 g DF .text 00000092 GLIBC_2.1 __iswalpha_l
+001007e0 g DF .text 00000068 GLIBC_2.0 xdr_key_netstres
+00111d50 g DF .text 000000e5 (GLIBC_2.0) getaliasent_r
+000f0fd0 g DF .text 000000e2 GLIBC_2.1.2 getaliasent_r
+000cbce0 w DF .text 00000065 GLIBC_2.0 fsync
+00082930 g DF .text 0000008d GLIBC_2.0 clock
+00075a30 g DF .text 00000022 GLIBC_2.1.1 __memset_cg
+00106850 g DF .text 00000063 GLIBC_2.1 putmsg
+000f9640 g DF .text 00000083 GLIBC_2.0 xdr_replymsg
+000d41c0 g DF .text 00000041 GLIBC_2.2.4 sockatmark
+000d5c80 g DF .text 00000075 GLIBC_2.0 towupper
+0002b950 g DF .text 00000267 GLIBC_2.0 abort
+0014383c g DO .data 00000004 GLIBC_2.0 stdin
+000fc720 g DF .text 00000068 GLIBC_2.0 xdr_u_short
+00065450 g DF .text 000001fd GLIBC_2.0 _IO_flush_all_linebuffered
+0002e4e0 g DF .text 00000046 GLIBC_2.0 strtoll
+00092a84 g DF .text 00000013 GLIBC_2.0 _exit
+00039d20 g DF .text 00000029 GLIBC_2.1 wcstoumax
+000fa3e0 g DF .text 00000295 GLIBC_2.2 svc_getreq_common
+0005aa40 w DF .text 000000c9 GLIBC_2.0 vsprintf
+0002b420 w DF .text 00000055 GLIBC_2.1 sigwaitinfo
+000d4e00 w DF .text 00000092 GLIBC_2.2 moncontrol
+000d3f20 w DF .text 00000037 GLIBC_2.0 socketpair
+000e12d0 g DF .text 00000136 GLIBC_PRIVATE __res_iclose
+0002d270 g DF .text 00000044 GLIBC_2.0 div
+00070d20 w DF .text 0000019b GLIBC_2.0 memchr
+00034930 w DF .text 00000029 GLIBC_2.1 __strtod_l
+000704c0 g DF .text 000000b3 GLIBC_2.0 strpbrk
+000ecc90 g DF .text 0000002d GLIBC_2.0 ether_aton
+00075c10 w DF .text 000000bb GLIBC_2.2 memrchr
+00023860 g DF .text 00000037 GLIBC_2.0 tolower
+000c3680 w DF .text 00000070 GLIBC_2.0 __read
+000d09f0 w DF .text 00000026 GLIBC_2.0 hdestroy
+0010a0c0 g DF .text 0000003a GLIBC_2.0 __register_frame_info_table
+00059fc0 g DF .text 0000008d GLIBC_2.1 popen
+0010d310 g DF .text 0000008a (GLIBC_2.0) popen
+0006ce00 w DF .text 000001e5 GLIBC_2.0 cfree
+00023c50 g DF .text 00000028 GLIBC_2.0 _tolower
+000ee780 g DF .text 000000a1 GLIBC_2.2 ruserok_af
+000d2630 w DF .text 0000006f GLIBC_2.0 step
+00024420 g DF .text 00000049 GLIBC_2.0 __dcgettext
+000d68c0 w DF .text 0000005d GLIBC_2.0 towctrans
+000d2a10 g DF .text 00000046 GLIBC_2.3 lsetxattr
+000cdda0 g DF .text 00000071 GLIBC_2.0 setttyent
+000c3060 w DF .text 000000e5 GLIBC_2.2 __open64
+00093790 g DF .text 00000013 GLIBC_2.0 __bsd_getpgrp
+000934c0 g DF .text 00000031 GLIBC_2.0 getpid
+00039d50 w DF .text 00000079 GLIBC_2.1 getcontext
+0002a560 w DF .text 00000038 GLIBC_2.0 kill
+00070860 g DF .text 000000ae GLIBC_2.0 strspn
+000df530 g DF .text 0000003c GLIBC_2.0 pthread_condattr_init
+00143340 w DO .data 00000004 GLIBC_2.0 program_invocation_name
+0002d310 w DF .text 00000095 GLIBC_2.1.1 imaxdiv
+00110de0 g DF .text 00000040 (GLIBC_2.2) posix_fallocate64
+000c9350 g DF .text 00000295 GLIBC_2.3.3 posix_fallocate64
+000fa9c0 g DF .text 0000009c GLIBC_2.0 svcraw_create
+000b7600 g DF .text 00000034 GLIBC_2.0 __sched_get_priority_max
+000722f0 w DF .text 00000042 GLIBC_2.0 argz_extract
+000243e0 w DF .text 00000015 GLIBC_2.2 bind_textdomain_codeset
+000583a0 g DF .text 000001df GLIBC_2.2 fgetpos
+0005abb0 g DF .text 000001af GLIBC_2.2 _IO_fgetpos64
+0010d4c0 g DF .text 0000013b (GLIBC_2.0) fgetpos
+0010d620 g DF .text 00000184 (GLIBC_2.1) _IO_fgetpos64
+0006fc90 w DF .text 00000057 GLIBC_2.0 strdup
+000c4070 g DF .text 00000022 GLIBC_2.1 creat64
+00061cc0 w DF .text 0000002a GLIBC_2.0 getc_unlocked
+000fac80 g DF .text 00000043 GLIBC_2.0 svc_exit
+00088ed0 g DF .text 00000045 GLIBC_2.0 strftime
+000e0c30 g DF .text 000003e5 GLIBC_2.0 inet_pton
+00074fb0 g DF .text 00000045 GLIBC_2.1.1 __strncat_g
+000613a0 g DF .text 0000000f GLIBC_2.2 __flbf
+000c3e10 g DF .text 00000130 GLIBC_2.1 lockf64
+0005c3e0 g DF .text 0000002b GLIBC_2.2 _IO_switch_to_main_wget_area
+00101ea0 g DF .text 0000023b GLIBC_2.0 xencrypt
+001068c0 g DF .text 00000046 GLIBC_2.1 putpmsg
+00143338 w DO .data 00000008 GLIBC_2.0 tzname
+00037700 g DF .text 0000007d GLIBC_PRIVATE __libc_system
+001037e0 g DF .text 00000069 GLIBC_2.1 xdr_uint16_t
+00068ec0 g DF .text 0000014b GLIBC_2.0 __libc_mallopt
+0002afc0 w DF .text 000000a2 GLIBC_2.1 sysv_signal
+0002f510 w DF .text 00000030 GLIBC_2.3 strtoll_l
+000df310 g DF .text 00000043 GLIBC_2.0 pthread_attr_getschedparam
+000c3f80 g DF .text 00000038 GLIBC_2.0 __dup2
+000df7c0 g DF .text 0000003c GLIBC_2.0 pthread_mutex_destroy
+0005b0c0 w DF .text 000000e7 GLIBC_2.2 fgetwc
+000cac60 g DF .text 00000074 GLIBC_2.0 vlimit
+000c2cb0 w DF .text 00000038 GLIBC_2.0 chmod
+000cafc0 w DF .text 00000073 GLIBC_2.0 sbrk
+00023550 g DF .text 00000150 GLIBC_2.0 __assert_fail
+001021c0 g DF .text 0000027a GLIBC_2.1 clntunix_create
+00075110 g DF .text 00000020 GLIBC_2.1.1 __strrchr_c
+00023cb0 w DF .text 0000000b GLIBC_2.1 __toascii_l
+000d5f10 w DF .text 000000c9 GLIBC_2.0 iswalnum
+00029470 w DF .text 00000011 GLIBC_2.0 finite
+000edbc0 g DF .text 0000006a GLIBC_2.0 ether_ntoa_r
+000ccec0 g DF .text 000008d5 GLIBC_2.2 __getmntent_r
+00046530 g DF .text 00000039 GLIBC_2.0 printf
+00023d50 g DF .text 00000015 GLIBC_2.1 __isalnum_l
+000d3a50 w DF .text 0000006c GLIBC_2.0 __connect
+000ea960 g DF .text 00000156 GLIBC_2.0 getnetbyname
+000cc1b0 g DF .text 0000002b GLIBC_2.0 mkstemp
+00075130 g DF .text 00000033 GLIBC_2.1.1 __strrchr_g
+000c2a10 g DF .text 00000094 GLIBC_2.1 statvfs
+000c3cc0 w DF .text 00000038 GLIBC_2.0 flock
+000d1f40 w DF .text 0000015c GLIBC_2.0 error_at_line
+00060190 g DF .text 000000f6 GLIBC_2.0 rewind
+0002d230 g DF .text 00000031 GLIBC_2.0 llabs
+00072e50 w DF .text 0000109f GLIBC_2.3 strcoll_l
+001465a0 g DO .bss 0000000c GLIBC_2.0 _null_auth
+00082af0 w DF .text 00000032 GLIBC_2.0 localtime_r
+00075f80 g DF .text 0000003e GLIBC_2.0 wcscspn
+000cace0 g DF .text 00000150 GLIBC_2.0 vtimes
+00029490 w DF .text 0000001e GLIBC_2.0 copysign
+000711c0 g DF .text 00000091 GLIBC_2.0 __stpncpy
+000f44f0 g DF .text 00000090 GLIBC_2.5 inet6_opt_finish
+000926d0 w DF .text 0000006c GLIBC_2.2.6 __nanosleep
+00029840 w DF .text 0000009a GLIBC_2.0 modff
+000d6250 w DF .text 000000cb GLIBC_2.0 iswlower
+0002fc60 w DF .text 0000003f GLIBC_2.0 strtod
+00029ee0 g DF .text 0000003e GLIBC_2.0 setjmp
+000c8e50 g DF .text 000000a4 GLIBC_2.1 __poll
+00023bb0 g DF .text 00000048 GLIBC_2.0 isspace
+000e8870 g DF .text 0000002b GLIBC_2.4 __confstr_chk
+00056240 g DF .text 00000080 GLIBC_2.0 tmpnam_r
+000d7120 g DF .text 0000008b GLIBC_2.1 __wctype_l
+0005b350 g DF .text 00000179 GLIBC_2.2 fgetws
+00108ef0 g DF .text 00000017 GLIBC_2.1 setutxent
+00023d70 g DF .text 00000017 GLIBC_2.1 __isalpha_l
+0002fbe0 w DF .text 0000003f GLIBC_2.0 strtof
+00078c50 w DF .text 00000040 GLIBC_2.1 __wcstoll_l
+000d6c70 w DF .text 00000093 GLIBC_2.3 iswdigit_l
+000d4300 g DF .text 000000b6 GLIBC_PRIVATE __libc_msgsnd
+00082a30 g DF .text 00000035 GLIBC_2.0 gmtime
+00023300 g DF .text 00000084 GLIBC_2.3 __uselocale
+000e7ef0 g DF .text 000000e5 GLIBC_2.4 __wcsncat_chk
+000710f0 g DF .text 00000010 GLIBC_2.0 ffs
+000f9700 g DF .text 00000050 GLIBC_2.0 xdr_opaque_auth
+00022890 w DF .text 0000001e GLIBC_2.0 __ctype_get_mb_cur_max
+000d6d10 g DF .text 00000092 GLIBC_2.1 __iswlower_l
+00029ae0 w DF .text 00000187 GLIBC_2.0 modfl
+00072ca0 g DF .text 0000017d GLIBC_2.0 envz_add
+00070ab0 g DF .text 00000112 GLIBC_2.0 strtok
+001085a0 w DF .text 0000003b GLIBC_2.1 getpt
+0002b480 w DF .text 000000a0 GLIBC_2.1 sigqueue
+0002e3a0 g DF .text 00000046 GLIBC_2.0 strtol
+00091330 g DF .text 000000b0 GLIBC_2.0 endpwent
+00058860 g DF .text 00000032 GLIBC_2.1 _IO_fopen
+0010cab0 g DF .text 00000097 (GLIBC_2.0) _IO_fopen
+00075320 g DF .text 00000036 GLIBC_2.1.1 __strstr_cg
+000c4b90 w DF .text 00000032 GLIBC_2.0 isatty
+000c7440 g DF .text 000000f9 GLIBC_2.0 fts_close
+000c4470 w DF .text 00000053 GLIBC_2.0 lchown
+000cce30 w DF .text 00000083 GLIBC_2.0 setmntent
+000cf950 w DF .text 0000005c GLIBC_2.0 mmap
+000f0db0 g DF .text 000000ca GLIBC_2.0 endnetgrent
+000632a0 g DF .text 0000003f GLIBC_2.0 _IO_file_read
+000f4190 g DF .text 00000143 GLIBC_2.3.4 setsourcefilter
+0010a570 g DF .text 00000052 GLIBC_2.0 __register_frame
+00090c80 w DF .text 000000d4 GLIBC_2.0 getpw
+000d8490 w DF .text 00000226 GLIBC_2.0 fgetspent_r
+000b75d0 w DF .text 0000002c GLIBC_2.0 sched_yield
+00000000 g DO *ABS* 00000000 GLIBC_PRIVATE GLIBC_PRIVATE
+0002e4e0 w DF .text 00000046 GLIBC_2.0 strtoq
+00095810 w DF .text 000000b6 GLIBC_2.0 glob_pattern_p
+00075bb0 g DF .text 00000053 GLIBC_2.1.1 __strsep_1c
+00081960 w DF .text 0000006c GLIBC_2.1 wcsncasecmp
+00090390 g DF .text 000001ec GLIBC_2.1.2 getgrnam_r
+000829e0 g DF .text 00000039 GLIBC_2.0 ctime_r
+0010ef00 g DF .text 0000005f (GLIBC_2.0) getgrnam_r
+00103570 g DF .text 000000bc GLIBC_2.3.4 xdr_u_quad_t
+0002c6b0 w DF .text 00000088 GLIBC_2.0 clearenv
+000d7120 w DF .text 0000008b GLIBC_2.3 wctype_l
+000c2ab0 g DF .text 00000098 GLIBC_2.1 fstatvfs
+0002a7f0 w DF .text 00000063 GLIBC_2.0 sigblock
+000d4250 g DF .text 00000058 GLIBC_2.1 __libc_sa_len
+0005f5f0 w DF .text 0000009a GLIBC_2.0 feof
+001465b0 g DO .bss 00000004 GLIBC_2.1 __key_encryptsession_pk_LOCAL
+000fb820 g DF .text 00000023 GLIBC_2.0 svcudp_create
+000d6920 w DF .text 00000092 GLIBC_2.3 iswxdigit_l
+000df4a0 g DF .text 00000043 GLIBC_2.0 pthread_attr_setscope
+00071e10 w DF .text 0000015f GLIBC_2.1.1 strchrnul
+000cc130 w DF .text 00000034 GLIBC_2.0 swapoff
+001433fc g DO .data 00000004 (GLIBC_2.0) __ctype_tolower
+000cf660 g DF .text 0000002c GLIBC_2.0 syslog
+0002eea0 w DF .text 00000030 GLIBC_2.1 __strtoul_l
+000c1490 g DF .text 00000007 GLIBC_2.2 posix_spawnattr_destroy
+0010d7d0 g DF .text 00000110 (GLIBC_2.0) fsetpos
+00058e40 g DF .text 0000013e GLIBC_2.2 fsetpos
+000c0fd0 w DF .text 000000ef GLIBC_2.1 pread64
+000c37e0 w DF .text 000000f7 GLIBC_2.4 eaccess
+000f3b40 g DF .text 0000001a GLIBC_2.3.3 inet6_option_alloc
+00085b80 g DF .text 00000048 GLIBC_2.0 dysize
+000c4de0 w DF .text 00000038 GLIBC_2.0 symlink
+001438c0 g DO .data 00000050 GLIBC_2.0 _IO_stdout_
+0005c440 g DF .text 00000039 GLIBC_2.2 _IO_wdefault_uflow
+000d7300 g DF .text 000000a2 GLIBC_2.0 getspent
+000df220 g DF .text 00000043 GLIBC_2.0 pthread_attr_setdetachstate
+000d27c0 g DF .text 00000040 GLIBC_2.3 fgetxattr
+0002dab0 w DF .text 00000104 GLIBC_2.0 srandom_r
+000cdb00 w DF .text 00000038 GLIBC_2.0 truncate
+0006b590 g DF .text 000002fd GLIBC_2.0 __libc_calloc
+00023b10 g DF .text 00000048 GLIBC_2.0 isprint
+000c9120 g DF .text 00000046 GLIBC_2.2 posix_fadvise
+00071410 w DF .text 00000046 GLIBC_2.0 memccpy
+00092c40 g DF .text 0000017c GLIBC_2.0 execle
+000d26a0 g DF .text 000000e8 GLIBC_2.2 getloadavg
+00088f20 g DF .text 00000045 GLIBC_2.2 wcsftime
+000ca2a0 g DF .text 0000006c GLIBC_2.0 cfsetispeed
+000e4400 g DF .text 00000228 GLIBC_2.0 __nss_configure_lookup
+0002d2c0 g DF .text 00000044 GLIBC_2.0 ldiv
+000fc3a0 g DF .text 0000000a GLIBC_2.0 xdr_void
+000edb90 g DF .text 0000002d GLIBC_2.0 ether_ntoa
+000441b0 g DF .text 000000fe GLIBC_2.0 parse_printf_format
+0005fc60 w DF .text 000000e7 GLIBC_2.0 fgetc
+000d38a0 g DF .text 00000040 GLIBC_2.5 tee
+00100770 g DF .text 0000006c GLIBC_2.0 xdr_key_netstarg
+00071ba0 g DF .text 000000e3 GLIBC_2.0 strfry
+0005aa40 g DF .text 000000c9 GLIBC_2.0 _IO_vsprintf
+000cbdf0 g DF .text 00000057 GLIBC_2.0 reboot
+00111e60 g DF .text 0000005f (GLIBC_2.0) getaliasbyname_r
+000f1490 g DF .text 0000017d GLIBC_2.1.2 getaliasbyname_r
+0002dea0 g DF .text 00000037 GLIBC_2.0 jrand48
+00111450 g DF .text 00000066 (GLIBC_2.0) gethostbyname_r
+000e9fd0 g DF .text 0000029e GLIBC_2.1.2 gethostbyname_r
+00093370 g DF .text 00000145 GLIBC_2.0 execlp
+00071b60 g DF .text 0000003f GLIBC_2.0 swab
+00056f40 g DF .text 0000002f GLIBC_2.0 _IO_funlockfile
+00056e70 g DF .text 0000004b GLIBC_2.0 _IO_flockfile
+00075860 g DF .text 00000072 GLIBC_2.1.1 __strsep_2c
+0008e420 g DF .text 0000006c GLIBC_2.0 seekdir
+00023ce0 w DF .text 00000015 GLIBC_2.3 isblank_l
+00023cc0 w DF .text 00000011 GLIBC_2.1 __isascii_l
+0008eea0 g DF .text 00000024 GLIBC_2.2 alphasort64
+000f8740 g DF .text 000001a6 GLIBC_2.0 pmap_getport
+0010ed30 g DF .text 00000024 (GLIBC_2.1) alphasort64
+00039e40 w DF .text 00000065 GLIBC_2.1 makecontext
+000cbd80 g DF .text 00000065 GLIBC_2.0 fdatasync
+00101320 g DF .text 000001bd GLIBC_2.1 authdes_getucred
+000cdb80 g DF .text 00000063 GLIBC_2.1 truncate64
+000d6db0 g DF .text 00000092 GLIBC_2.1 __iswgraph_l
+00023e30 g DF .text 00000015 GLIBC_2.1 __ispunct_l
+00039cc0 g DF .text 00000029 GLIBC_2.1 strtoumax
+000d9740 w DF .text 0000018d GLIBC_2.1 argp_failure
+00071260 g DF .text 00000062 GLIBC_2.0 __strcasecmp
+00050a50 g DF .text 00000039 GLIBC_2.0 __vfscanf
+000585a0 w DF .text 00000171 GLIBC_2.0 fgets
+000d67d0 g DF .text 0000006e GLIBC_2.0 __iswctype
+00111640 g DF .text 000000e5 (GLIBC_2.0) getnetent_r
+000eabb0 g DF .text 000000ed GLIBC_2.1.2 getnetent_r
+000c1540 g DF .text 0000001c GLIBC_2.2 posix_spawnattr_setflags
+00110920 g DF .text 00000032 (GLIBC_2.3.3) sched_setaffinity
+000b7750 g DF .text 00000144 GLIBC_2.3.4 sched_setaffinity
+00060590 w DF .text 0000003c GLIBC_2.0 vscanf
+00090fa0 g DF .text 0000012d GLIBC_2.0 getpwnam
+000f3b60 g DF .text 0000006b GLIBC_2.3.3 inet6_option_append
+0006b590 w DF .text 000002fd GLIBC_2.0 calloc
+0002e530 g DF .text 00000045 (GLIBC_2.0) __strtouq_internal
+00093500 w DF .text 00000008 GLIBC_2.0 getppid
+001275a5 g DO .rodata 00000012 GLIBC_2.0 _nl_default_dirname
+001067a0 g DF .text 00000060 GLIBC_2.1 getmsg
+0005c7a0 g DF .text 00000038 GLIBC_2.2 _IO_unsave_wmarkers
+00109230 g DF .text 00000353 GLIBC_PRIVATE _dl_addr
+000cfaa0 w DF .text 00000070 GLIBC_2.0 msync
+00065070 g DF .text 00000042 GLIBC_2.0 _IO_init
+000297a0 g DF .text 0000000f GLIBC_2.1 __signbit
+000c96c0 g DF .text 00000022 GLIBC_2.6 futimens
+00056ce0 g DF .text 0000018f GLIBC_2.4 renameat
+00082800 w DF .text 0000012d GLIBC_2.0 asctime_r
+00023250 w DF .text 00000088 GLIBC_2.3 freelocale
+0006ff50 g DF .text 000000af GLIBC_2.0 strlen
+0002d770 w DF .text 00000086 GLIBC_2.0 initstate
+000e7fe0 g DF .text 0000002b GLIBC_2.4 __wmemset_chk
+0005a980 w DF .text 000000ac GLIBC_2.0 ungetc
+00075ef0 g DF .text 00000021 GLIBC_2.0 wcschr
+000238e0 g DF .text 00000048 GLIBC_2.0 isxdigit
+000ed480 g DF .text 00000705 GLIBC_2.0 ether_line
+00064310 g DF .text 00000047 GLIBC_2.1 _IO_file_init
+0005cd20 g DF .text 000000e7 GLIBC_2.2 __wuflow
+000c3d00 g DF .text 00000108 GLIBC_2.0 lockf
+001433f4 g DO .data 00000004 (GLIBC_2.0) __ctype_b
+0010e480 g DF .text 0000006f (GLIBC_2.0) _IO_file_init
+000fed10 g DF .text 000000ae GLIBC_2.1 xdr_authdes_cred
+000d67d0 w DF .text 0000006e GLIBC_2.0 iswctype
+000d03a0 g DF .text 00000063 GLIBC_2.0 qecvt
+00075a00 g DF .text 00000022 GLIBC_2.1.1 __memset_gg
+0010d410 g DF .text 000000a2 (GLIBC_2.0) tmpfile
+000f0d30 g DF .text 00000071 GLIBC_PRIVATE __internal_setnetgrent
+00076b80 g DF .text 00000048 GLIBC_2.0 __mbrlen
+00056020 g DF .text 000000a2 GLIBC_2.1 tmpfile
+00103850 g DF .text 00000068 GLIBC_2.1 xdr_int8_t
+000d69c0 g DF .text 0000005d GLIBC_2.1 __towupper_l
+000d5660 w DF .text 000004ec GLIBC_2.2.3 sprofil
+000d36f0 g DF .text 00000038 GLIBC_2.2.1 pivot_root
+00072910 g DF .text 0000007a GLIBC_2.0 envz_entry
+000f57a0 g DF .text 000000be GLIBC_2.0 xdr_authunix_parms
+000fa0b0 g DF .text 0000009e GLIBC_2.0 xprt_unregister
+001434c0 g DO .data 00000098 GLIBC_2.1 _IO_2_1_stdout_
+000228b0 w DF .text 000007fa GLIBC_2.3 newlocale
+000ef700 g DF .text 000005f9 GLIBC_2.2 rexec_af
+000d12d0 w DF .text 000002bf GLIBC_2.0 tsearch
+000f1340 g DF .text 0000012d GLIBC_2.0 getaliasbyname
+000f9f10 g DF .text 0000004e GLIBC_2.0 svcerr_progvers
+00023e50 w DF .text 00000017 GLIBC_2.3 isspace_l
+00072340 w DF .text 00000124 GLIBC_2.0 argz_insert
+00075970 g DF .text 00000031 GLIBC_2.1.1 __memcpy_c
+0002a130 w DF .text 0000008a GLIBC_2.0 gsignal
+000f4450 g DF .text 00000048 GLIBC_2.5 inet6_opt_get_val
+001113e0 g DF .text 00000063 (GLIBC_2.0) gethostbyname2_r
+0002cff0 g DF .text 00000057 GLIBC_2.1.3 __cxa_atexit
+000e9d20 g DF .text 000002ac GLIBC_2.1.2 gethostbyname2_r
+000c11b0 g DF .text 00000035 GLIBC_2.2 posix_spawn_file_actions_init
+000685d0 w DF .text 00000277 GLIBC_2.0 malloc_stats
+000d3730 w DF .text 00000046 GLIBC_2.0 prctl
+00061350 g DF .text 0000000f GLIBC_2.2 __fwriting
+000cecf0 g DF .text 00000023 GLIBC_2.0 setlogmask
+000758e0 g DF .text 00000086 GLIBC_2.1.1 __strsep_3c
+000d72a0 g DF .text 0000005d GLIBC_2.1 __towctrans_l
+000fc890 g DF .text 0000001a GLIBC_2.0 xdr_enum
+001419b0 g DO .data.rel.ro 00000014 GLIBC_2.0 h_errlist
+00061ed0 g DF .text 0000005b GLIBC_2.1 fread_unlocked
+00074cd0 g DF .text 00000033 GLIBC_2.1.1 __memcpy_g
+000d38e0 g DF .text 00000034 GLIBC_2.4 unshare
+000caf70 w DF .text 00000044 GLIBC_2.0 brk
+000d3d10 w DF .text 0000006c GLIBC_2.0 send
+00023e10 w DF .text 00000017 GLIBC_2.3 isprint_l
+00085b00 w DF .text 0000003a GLIBC_2.0 setitimer
+000d68c0 g DF .text 0000005d GLIBC_2.1 __towctrans
+001416a0 g DO .data.rel.ro 00000080 (GLIBC_2.0) sys_sigabbrev
+00039dd0 w DF .text 00000066 GLIBC_2.0 setcontext
+001416a0 g DO .data.rel.ro 00000100 (GLIBC_2.1) sys_sigabbrev
+001416a0 g DO .data.rel.ro 00000104 GLIBC_2.3.3 sys_sigabbrev
+000f3830 g DF .text 000000ad GLIBC_2.3.3 inet6_option_next
+0002ad60 g DF .text 0000004d GLIBC_2.0 sigemptyset
+000d7020 w DF .text 00000092 GLIBC_2.3 iswupper_l
+00109e30 g DF .text 0000001f GLIBC_PRIVATE _dl_sym
+000cefd0 g DF .text 00000085 GLIBC_2.0 openlog
+000b9d90 g DF .text 0000077f GLIBC_2.0 getaddrinfo
+00065650 g DF .text 0000006a GLIBC_2.0 _IO_init_marker
+00061cf0 g DF .text 0000003d GLIBC_2.0 getchar_unlocked
+000e3890 g DF .text 0000011b GLIBC_PRIVATE __res_maybe_init
+000d24e0 g DF .text 000000cc GLIBC_2.0 dirname
+00017b50 g DF .text 00000016 GLIBC_PRIVATE __gconv_get_alias_db
+00070f70 g DF .text 00000056 GLIBC_2.0 memset
+00022600 g DF .text 000001a2 GLIBC_2.2 localeconv
+00022600 g DF .text 000001a2 (GLIBC_2.0) localeconv
+000ca210 g DF .text 00000010 GLIBC_2.0 cfgetospeed
+00074d30 g DF .text 0000002f GLIBC_2.1.1 __memset_ccn_by2
+000cb490 w DF .text 00000103 GLIBC_2.0 writev
+00066370 g DF .text 000000e2 GLIBC_2.0 _IO_default_xsgetn
+00023930 g DF .text 00000046 GLIBC_2.0 isalnum
+00074d10 g DF .text 0000001d GLIBC_2.1.1 __memset_ccn_by4
+00106a10 w DF .text 00000051 GLIBC_2.0 setutent
+000f9370 g DF .text 00000125 GLIBC_2.0 _seterr_reply
+0005c500 g DF .text 00000079 GLIBC_2.2 _IO_switch_to_wget_mode
+000f4820 g DF .text 00000047 GLIBC_2.5 inet6_rth_add
+00061cc0 w DF .text 0000002a GLIBC_2.1 fgetc_unlocked
+0005bfb0 g DF .text 0000003b GLIBC_2.2 swprintf
+000d1ad0 g DF .text 0000001d GLIBC_2.0 warn
+0005fd70 g DF .text 000000f2 GLIBC_2.0 getchar
+00106d90 w DF .text 00000068 GLIBC_2.0 getutid
+0001f6a0 g DF .text 00000016 GLIBC_PRIVATE __gconv_get_cache
+000958d0 g DF .text 00001859 GLIBC_2.0 glob
+00070910 g DF .text 00000192 GLIBC_2.0 strstr
+000d46d0 g DF .text 00000049 GLIBC_2.3.3 semtimedop
+0002ccf0 g DF .text 00000035 GLIBC_2.0 __secure_getenv
+00077aa0 w DF .text 00000075 GLIBC_2.1 wcsnlen
+00077ed0 g DF .text 0000003e GLIBC_2.0 __wcstof_internal
+0006fa80 g DF .text 000000ae GLIBC_2.0 strcspn
+000ca870 g DF .text 00000075 GLIBC_2.0 tcsendbreak
+0008e4a0 g DF .text 0000000b GLIBC_2.0 telldir
+00023a70 g DF .text 00000048 GLIBC_2.0 islower
+000c9670 g DF .text 00000044 GLIBC_2.6 utimensat
+000cfd80 g DF .text 000000c4 GLIBC_2.0 fcvt
+000320d0 w DF .text 00000029 GLIBC_2.1 __strtof_l
+00016520 g DF .text 0000001d GLIBC_2.0 __errno_location
+000c5230 w DF .text 00000034 GLIBC_2.0 rmdir
+0005a680 g DF .text 00000127 GLIBC_2.0 _IO_setbuffer
+000658a0 g DF .text 00000008 GLIBC_2.2 _IO_iter_file
+000d3a10 g DF .text 00000037 GLIBC_2.0 bind
+0002f510 w DF .text 00000030 GLIBC_2.1 __strtoll_l
+000ca390 g DF .text 00000243 GLIBC_2.0 tcsetattr
+0005fb40 g DF .text 000000fa GLIBC_2.0 fseek
+000fce60 g DF .text 0000003e GLIBC_2.0 xdr_float
+000b5b70 g DF .text 000003bc GLIBC_2.0 confstr
+000c40a0 w DF .text 00000034 GLIBC_2.0 chdir
+000c3060 w DF .text 000000e5 GLIBC_2.1 open64
+000f46c0 g DF .text 00000019 GLIBC_2.5 inet6_rth_segments
+000c3680 w DF .text 00000070 GLIBC_2.0 read
+0006e930 g DF .text 00000094 GLIBC_2.0 muntrace
+0005b200 g DF .text 000000f2 GLIBC_2.2 getwchar
+00070ec0 g DF .text 0000001e GLIBC_2.0 memcmp
+000f18f0 g DF .text 00000913 GLIBC_2.1 getnameinfo
+000cb800 w DF .text 00000026 GLIBC_2.0 getpagesize
+000fe3e0 g DF .text 000000b9 GLIBC_2.1 xdr_sizeof
+00016690 g DF .text 000001fe (GLIBC_2.0) __moddi3
+00024470 w DF .text 00000022 GLIBC_2.0 dgettext
+00074de0 g DF .text 00000018 GLIBC_2.1.1 __strlen_g
+00058fa0 g DF .text 000001d1 GLIBC_2.0 _IO_ftell
+0005bb30 g DF .text 000000f6 GLIBC_2.2 putwc
+000f8180 g DF .text 000000e9 GLIBC_2.0 getrpcport
+000658b0 g DF .text 0000004d GLIBC_2.2 _IO_list_lock
+000465b0 g DF .text 00000034 GLIBC_2.0 _IO_sprintf
+000e79e0 g DF .text 00000042 GLIBC_2.4 __pread_chk
+000cfbe0 g DF .text 00000038 GLIBC_2.0 mlock
+0008ffe0 g DF .text 000000b0 GLIBC_2.0 endgrent
+0006fcf0 w DF .text 00000064 GLIBC_2.0 strndup
+000d3490 g DF .text 00000046 GLIBC_2.0 init_module
+000cf630 g DF .text 0000002b GLIBC_2.4 __syslog_chk
+000826e0 g DF .text 0000011b GLIBC_2.0 asctime
+000f5d10 g DF .text 00000084 GLIBC_2.0 clnt_sperrno
+000fd990 g DF .text 0000016a GLIBC_2.0 xdrrec_skiprecord
+00077400 w DF .text 00000362 GLIBC_2.0 mbsnrtowcs
+00072e50 g DF .text 0000109f GLIBC_2.1 __strcoll_l
+000e39f0 g DF .text 000000ae GLIBC_PRIVATE __gai_sigqueue
+000238a0 g DF .text 00000037 GLIBC_2.0 toupper
+000eb570 g DF .text 000000a8 GLIBC_2.0 setprotoent
+000934c0 g DF .text 00000031 GLIBC_2.0 __getpid
+0002d4d0 g DF .text 000000b9 GLIBC_2.0 mbtowc
+0010a030 g DF .text 00000084 GCC_3.0 __register_frame_info_table_bases
+00100b60 g DF .text 000000f9 GLIBC_2.1 netname2user
+00023c80 g DF .text 00000028 GLIBC_2.0 _toupper
+000d3b40 w DF .text 00000037 GLIBC_2.0 getsockopt
+000fb520 g DF .text 00000245 GLIBC_2.0 svctcp_create
+0005cf80 g DF .text 00000080 GLIBC_2.2 _IO_wsetb
+000593f0 w DF .text 00000278 GLIBC_2.0 getdelim
+0008f8c0 g DF .text 0000003f GLIBC_2.0 setgroups
+000f5fe0 g DF .text 0000009a GLIBC_2.0 clnt_perrno
+000d2aa0 g DF .text 00000046 GLIBC_2.3 setxattr
+0010b930 g DF .text 00000096 GCC_3.0 _Unwind_Find_FDE
+0002dfb0 w DF .text 000000a0 GLIBC_2.0 erand48_r
+0002dde0 g DF .text 00000034 GLIBC_2.0 lrand48
+00064d10 g DF .text 0000007a GLIBC_2.0 _IO_doallocbuf
+000c4650 g DF .text 0000026a GLIBC_2.0 ttyname
+00144aa4 w DO .bss 00000004 GLIBC_2.0 ___brk_addr
+001089b0 g DF .text 000000d5 GLIBC_2.1 grantpt
+000df190 g DF .text 0000003c GLIBC_2.1 pthread_attr_init
+00070fd0 g DF .text 00000044 GLIBC_2.1 mempcpy
+000df150 g DF .text 0000003c (GLIBC_2.0) pthread_attr_init
+000dfe90 g DF .text 00000155 GLIBC_2.0 herror
+000b7340 g DF .text 00000049 GLIBC_2.0 getopt
+00077c40 g DF .text 00000046 GLIBC_2.0 wcstoul
+000e78d0 g DF .text 000000a8 GLIBC_2.4 __fgets_unlocked_chk
+001081b0 w DF .text 000000f9 GLIBC_2.0 utmpname
+00093b00 g DF .text 00000149 GLIBC_2.0 getlogin_r
+00023db0 w DF .text 00000017 GLIBC_2.3 isdigit_l
+00046dd0 w DF .text 00003e13 GLIBC_2.2 vfwprintf
+000cce30 g DF .text 00000083 GLIBC_2.2 __setmntent
+0005a370 g DF .text 00000100 GLIBC_2.0 _IO_seekoff
+000ca7f0 g DF .text 00000032 GLIBC_2.0 tcflow
+000d0cc0 g DF .text 000000d4 GLIBC_2.0 hcreate_r
+00077d30 w DF .text 00000046 GLIBC_2.0 wcstouq
+0005c480 g DF .text 0000007e GLIBC_2.2 _IO_wdoallocbuf
+000efd00 g DF .text 0000003e GLIBC_2.0 rexec
+000d4490 g DF .text 00000061 GLIBC_2.0 msgget
+0005c0c0 g DF .text 00000034 GLIBC_2.2 fwscanf
+00103770 g DF .text 00000069 GLIBC_2.1 xdr_int16_t
+000e7bf0 g DF .text 00000034 GLIBC_2.4 __getcwd_chk
+000c2d60 g DF .text 0000015a GLIBC_2.4 fchmodat
+00072990 g DF .text 0000007a GLIBC_2.0 envz_strip
+001461a8 g DO .bss 00000004 GLIBC_PRIVATE _dl_open_hook
+000c3f80 w DF .text 00000038 GLIBC_2.0 dup2
+0005f550 g DF .text 00000085 GLIBC_2.0 clearerr
+00144a94 w DO .bss 00000004 GLIBC_2.0 environ
+000eea20 g DF .text 00000b7b GLIBC_2.2 rcmd_af
+000f9c50 g DF .text 00000039 GLIBC_2.2.3 __rpc_thread_svc_max_pollfd
+00092670 w DF .text 00000055 GLIBC_2.0 pause
+0002c740 w DF .text 000000fe GLIBC_2.0 unsetenv
+0002dd00 g DF .text 00000052 GLIBC_2.0 rand_r
+0010c980 g DF .text 0000003d (GLIBC_2.0) atexit
+00066d30 g DF .text 0000003f GLIBC_2.0 _IO_str_init_static
+00029470 g DF .text 00000011 GLIBC_2.0 __finite
+00083540 w DF .text 0000003c GLIBC_2.0 timelocal
+000724d0 w DF .text 000000a5 GLIBC_2.0 argz_add_sep
+000fdd10 g DF .text 0000006b GLIBC_2.0 xdr_pointer
+00076a00 g DF .text 0000015e GLIBC_2.0 wctob
+00029f60 w DF .text 00000064 GLIBC_2.0 longjmp
+000c2180 g DF .text 0000003f (GLIBC_2.1) __fxstat64
+00086250 g DF .text 0000004a GLIBC_2.0 strptime
+00062f30 g DF .text 000001e4 GLIBC_2.1 _IO_file_xsputn
+000c2180 g DF .text 0000003f GLIBC_2.2 __fxstat64
+0010dac0 g DF .text 000002a5 (GLIBC_2.0) _IO_file_xsputn
+000f6080 g DF .text 00000395 GLIBC_2.0 clnt_sperror
+000e7140 g DF .text 000000f2 GLIBC_2.3.4 __vprintf_chk
+000d3130 g DF .text 00000034 GLIBC_2.0 __adjtimex
+000d3ea0 w DF .text 00000037 GLIBC_2.0 shutdown
+00106910 g DF .text 00000022 GLIBC_2.1 fattach
+00029f20 g DF .text 00000036 GLIBC_2.0 _setjmp
+00060650 w DF .text 000000f7 GLIBC_2.0 vsnprintf
+000c8e50 w DF .text 000000a4 GLIBC_2.0 poll
+0006bcb0 w DF .text 0000018c GLIBC_2.0 malloc_get_state
+00106800 g DF .text 00000046 GLIBC_2.1 getpmsg
+00059690 g DF .text 00000047 GLIBC_2.0 _IO_getline
+00108ea0 g DF .text 00000045 GLIBC_2.1 ptsname
+00092b00 g DF .text 000000f5 GLIBC_2.0 fexecve
+000afff0 w DF .text 0000013a GLIBC_2.0 re_comp
+000f6420 g DF .text 00000044 GLIBC_2.0 clnt_perror
+000d0340 g DF .text 0000005e GLIBC_2.0 qgcvt
+000f9d90 g DF .text 00000042 GLIBC_2.0 svcerr_noproc
+00077b50 g DF .text 00000045 GLIBC_2.0 __wcstol_internal
+000656f0 g DF .text 00000011 GLIBC_2.0 _IO_marker_difference
+000e7080 g DF .text 000000a8 GLIBC_2.3.4 __fprintf_chk
+000713a0 g DF .text 00000069 GLIBC_2.1 __strncasecmp_l
+0002ae10 g DF .text 0000006a GLIBC_2.0 sigaddset
+00055d10 g DF .text 00000034 GLIBC_2.0 _IO_sscanf
+000829c0 g DF .text 0000001b GLIBC_2.0 ctime
+0010bc30 g DF .text 0000007b GLIBC_2.0 __frame_state_for
+000d6660 w DF .text 000000cb GLIBC_2.0 iswupper
+000f9ec0 g DF .text 00000042 GLIBC_2.0 svcerr_noprog
+00065880 g DF .text 00000007 GLIBC_2.2 _IO_iter_end
+000e7d50 g DF .text 0000003e GLIBC_2.4 __wmemcpy_chk
+0008fb10 g DF .text 0000012d GLIBC_2.0 getgrnam
+000d3130 w DF .text 00000034 GLIBC_2.0 adjtimex
+000df890 g DF .text 0000003c GLIBC_2.0 pthread_mutex_unlock
+000cb910 g DF .text 00000038 GLIBC_2.0 sethostname
+00065980 g DF .text 00000070 GLIBC_2.0 _IO_setb
+000c0fd0 w DF .text 000000ef GLIBC_2.1 __pread64
+0006dc80 g DF .text 000000f8 GLIBC_2.0 mcheck
+00023ce0 g DF .text 00000015 GLIBC_2.1 __isblank_l
+000fdd80 g DF .text 000000df GLIBC_2.0 xdr_reference
+0010f0d0 g DF .text 0000005f (GLIBC_2.0) getpwuid_r
+000916e0 g DF .text 000001ec GLIBC_2.1.2 getpwuid_r
+000ec7d0 g DF .text 000000b0 GLIBC_2.0 endrpcent
+00100ac0 g DF .text 00000091 GLIBC_2.1 netname2host
+000e9230 g DF .text 00000282 GLIBC_2.0 inet_network
+0002c610 g DF .text 00000091 GLIBC_2.0 putenv
+0007ffb0 g DF .text 00000100 GLIBC_2.0 wcswidth
+00023ef0 w DF .text 0000002c GLIBC_2.3 isctype
+000f8440 g DF .text 0000013a GLIBC_2.0 pmap_set
+00111170 g DF .text 0000003c (GLIBC_2.0) pthread_cond_broadcast
+000c4410 w DF .text 00000053 GLIBC_2.0 fchown
+000df570 g DF .text 0000003c GLIBC_2.3.2 pthread_cond_broadcast
+00028ab0 g DF .text 00000172 GLIBC_2.0 catopen
+000791a0 w DF .text 00000040 GLIBC_2.1 __wcstoull_l
+00000000 g DO *ABS* 00000000 GLIBC_2.0 GLIBC_2.0
+000fc980 g DF .text 00000029 GLIBC_2.0 xdr_netobj
+000d42b0 g DF .text 00000047 GLIBC_2.0 ftok
+00064a40 g DF .text 000001b2 GLIBC_2.0 _IO_link_in
+00000000 g DO *ABS* 00000000 GLIBC_2.1 GLIBC_2.1
+00044110 w DF .text 00000097 GLIBC_2.0 register_printf_function
+00029e40 g DF .text 00000035 GLIBC_2.0 __sigsetjmp
+00000000 g DO *ABS* 00000000 GLIBC_2.2 GLIBC_2.2
+000710f0 g DF .text 00000010 GLIBC_2.0 __ffs
+00143840 g DO .data 00000004 GLIBC_2.0 stdout
+000cde20 g DF .text 0000078d GLIBC_2.0 getttyent
+000e8f90 g DF .text 0000005c GLIBC_2.0 inet_makeaddr
+00000000 g DO *ABS* 00000000 GLIBC_2.3 GLIBC_2.3
+00144aa4 g DO .bss 00000004 GLIBC_2.0 __curbrk
+00000000 g DO *ABS* 00000000 GLIBC_2.4 GLIBC_2.4
+00000000 g DO *ABS* 00000000 GLIBC_2.5 GLIBC_2.5
+000e94e0 g DF .text 00000169 GLIBC_2.0 gethostbyaddr
+0010d310 g DF .text 0000008a (GLIBC_2.0) _IO_popen
+00000000 g DO *ABS* 00000000 GLIBC_2.6 GLIBC_2.6
+000d2320 w DF .text 0000001a GLIBC_2.0 get_phys_pages
+00059fc0 g DF .text 0000008d GLIBC_2.1 _IO_popen
+000dd1e0 w DF .text 0000001d GLIBC_2.1 argp_help
+0005f790 g DF .text 000000f6 GLIBC_2.0 fputc
+00143400 g DO .data 00000004 (GLIBC_2.0) __ctype_toupper
+001114c0 g DF .text 000000e5 (GLIBC_2.0) gethostent_r
+00065740 g DF .text 00000079 GLIBC_2.0 _IO_seekmark
+000ea340 g DF .text 000000ed GLIBC_2.1.2 gethostent_r
+000d70c0 g DF .text 0000005d GLIBC_2.1 __towlower_l
+00029690 w DF .text 00000072 GLIBC_2.0 frexp
+00055ef0 g DF .text 0000012e GLIBC_2.0 psignal
+000d1be0 g DF .text 00000023 GLIBC_2.0 verrx
+00093c70 g DF .text 00000022 GLIBC_2.0 setlogin
+000f05f0 g DF .text 000001b3 GLIBC_PRIVATE __internal_getnetgrent_r
+00061040 g DF .text 000000f8 GLIBC_2.1 fseeko64
+00142a00 g DO .data.rel.ro 00000054 GLIBC_2.0 _IO_file_jumps
+0010ed60 g DF .text 00000024 (GLIBC_2.1) versionsort64
+0008eed0 g DF .text 00000024 GLIBC_2.2 versionsort64
+000d2840 g DF .text 00000038 GLIBC_2.3 fremovexattr
+000e7d00 g DF .text 00000042 GLIBC_2.4 __wcscpy_chk
+0006ae90 g DF .text 000000fc GLIBC_2.0 __libc_valloc
+00065130 g DF .text 0000004b GLIBC_2.0 _IO_sungetc
+000d3bc0 w DF .text 0000006c GLIBC_2.0 recv
+000f8050 g DF .text 0000002d GLIBC_2.0 _rpc_dtablesize
+000d3230 g DF .text 0000003a GLIBC_2.0 create_module
+000937d0 g DF .text 00000034 GLIBC_2.0 getsid
+000cc170 g DF .text 0000003d GLIBC_2.0 mktemp
+000e0160 g DF .text 00000172 GLIBC_2.0 inet_addr
+000cab50 w DF .text 00000038 GLIBC_2.0 getrusage
+00061dc0 g DF .text 000000ec GLIBC_2.0 _IO_peekc_locked
+000656c0 g DF .text 00000028 GLIBC_2.0 _IO_remove_marker
+000e8b50 g DF .text 00000050 GLIBC_2.4 __mbstowcs_chk
+00143328 w DO .data 00000004 GLIBC_2.0 __malloc_hook
+00023e50 g DF .text 00000017 GLIBC_2.1 __isspace_l
+000c8740 g DF .text 0000070d GLIBC_2.0 fts_read
+000d6d10 w DF .text 00000092 GLIBC_2.3 iswlower_l
+000d6320 w DF .text 000000cb GLIBC_2.0 iswgraph
+000cc6d0 g DF .text 000000d5 GLIBC_2.0 getfsspec
+0002e490 g DF .text 00000045 GLIBC_2.0 __strtoll_internal
+000cc250 g DF .text 00000051 GLIBC_2.0 ualarm
+00058b90 w DF .text 00000149 GLIBC_2.0 fputs
+000d3780 g DF .text 00000046 GLIBC_2.0 query_module
+000c1250 g DF .text 00000028 GLIBC_2.2 posix_spawn_file_actions_destroy
+00070bd0 w DF .text 00000104 GLIBC_2.0 strtok_r
+000ea430 g DF .text 000000b0 GLIBC_2.0 endhostent
+00023e10 g DF .text 00000017 GLIBC_2.1 __isprint_l
+000df680 g DF .text 00000043 GLIBC_2.3.2 pthread_cond_wait
+00111280 g DF .text 00000043 (GLIBC_2.0) pthread_cond_wait
+00072260 g DF .text 00000088 GLIBC_2.0 argz_delete
+0005c8c0 g DF .text 00000053 GLIBC_2.2 __woverflow
+000fc420 g DF .text 00000065 GLIBC_2.0 xdr_u_long
+000e7dc0 g DF .text 0000003e GLIBC_2.4 __wmempcpy_chk
+00094a90 w DF .text 000001f5 GLIBC_2.0 fpathconf
+00023d90 w DF .text 00000015 GLIBC_2.3 iscntrl_l
+000a2230 w DF .text 000000a7 GLIBC_2.0 regerror
+00070000 g DF .text 0000009d GLIBC_2.0 strnlen
+0002de20 g DF .text 00000037 GLIBC_2.0 nrand48
+00111000 g DF .text 000000e5 (GLIBC_2.0) getspent_r
+00076830 w DF .text 00000034 GLIBC_2.2 wmempcpy
+000d7c00 g DF .text 000000e2 GLIBC_2.1.2 getspent_r
+0014636c g DO .bss 00000004 GLIBC_2.1 argp_program_bug_address
+000c3760 w DF .text 0000003a GLIBC_2.0 lseek
+00093990 w DF .text 00000085 GLIBC_2.0 setresgid
+0002abd0 w DF .text 00000038 GLIBC_2.0 sigaltstack
+00075040 g DF .text 00000042 GLIBC_2.1.1 __strncmp_g
+000fca80 g DF .text 00000123 GLIBC_2.0 xdr_string
+00085c10 g DF .text 00000072 GLIBC_2.0 ftime
+00071460 g DF .text 00000046 GLIBC_2.0 memcpy
+0005b0c0 w DF .text 000000e7 GLIBC_2.2 getwc
+00076b80 w DF .text 00000048 GLIBC_2.0 mbrlen
+000ce660 g DF .text 00000052 GLIBC_2.0 endusershell
+000c4250 g DF .text 00000089 GLIBC_2.0 getwd
+000b7640 g DF .text 00000034 GLIBC_2.0 __sched_get_priority_min
+00060df0 g DF .text 00000228 GLIBC_2.1 freopen64
+0010cd10 g DF .text 00000183 (GLIBC_2.0) fclose
+00057d70 g DF .text 000001e8 GLIBC_2.1 fclose
+00085c90 w DF .text 00000558 GLIBC_2.1 getdate_r
+000c1d40 g DF .text 00000015 GLIBC_2.2 posix_spawnattr_setschedparam
+0005c710 g DF .text 00000082 GLIBC_2.2 _IO_seekwmark
+00065180 g DF .text 0000003c GLIBC_2.0 _IO_adjust_column
+000c37e0 w DF .text 000000f7 GLIBC_2.0 euidaccess
+0002a8d0 g DF .text 0000012e GLIBC_2.0 __sigpause
+000c4e20 g DF .text 0000010c GLIBC_2.4 symlinkat
+0002dce0 g DF .text 00000017 GLIBC_2.0 rand
+000cbaa0 w DF .text 000001c0 GLIBC_2.0 pselect
+000df950 g DF .text 00000043 GLIBC_2.0 pthread_setcanceltype
+000ca700 g DF .text 00000032 GLIBC_2.0 tcsetpgrp
+00075f20 g DF .text 0000002e GLIBC_2.0 wcscmp
+000e67a0 g DF .text 000000a3 GLIBC_2.3.4 __memmove_chk
+000c71c0 g DF .text 00000052 GLIBC_2.3.3 nftw64
+000cfa60 w DF .text 0000003a GLIBC_2.0 mprotect
+00110d80 g DF .text 0000002b (GLIBC_2.1) nftw64
+000e7ba0 g DF .text 00000043 GLIBC_2.4 __getwd_chk
+000759b0 g DF .text 00000045 GLIBC_2.1.1 __strcat_c
+000e3ae0 g DF .text 00000355 GLIBC_PRIVATE __nss_lookup_function
+000710f0 w DF .text 00000010 GLIBC_2.1 ffsl
+000cc890 g DF .text 000000aa GLIBC_2.0 getmntent
+00109f30 g DF .text 0000001d GLIBC_PRIVATE __libc_dl_error_tsd
+000819d0 g DF .text 00000055 GLIBC_2.1 __wcscasecmp_l
+0002e350 g DF .text 00000045 GLIBC_2.0 __strtol_internal
+000e6e80 g DF .text 0000010c GLIBC_2.3.4 __vsnprintf_chk
+00074f70 g DF .text 00000036 GLIBC_2.1.1 __strcat_g
+0008b0d0 g DF .text 00002517 GLIBC_2.3 __wcsftime_l
+00057c30 g DF .text 0000013c GLIBC_2.0 _IO_file_doallocate
+0002e440 g DF .text 00000046 GLIBC_2.0 strtoul
+000618a0 g DF .text 00000144 GLIBC_2.2 fmemopen
+000df770 g DF .text 0000004a GLIBC_2.0 pthread_setschedparam
+000d0c70 g DF .text 0000004f GLIBC_2.0 hdestroy_r
+000d7cf0 g DF .text 000000b0 GLIBC_2.0 endspent
+000cfca0 g DF .text 0000002c GLIBC_2.0 munlockall
+0002aa20 w DF .text 0000001b GLIBC_2.0 sigpause
+000fc490 g DF .text 0000001a GLIBC_2.0 xdr_u_int
+000416a0 g DF .text 00000036 GLIBC_2.0 vprintf
+00109040 g DF .text 00000032 GLIBC_2.1.1 getutmpx
+00109040 g DF .text 00000032 GLIBC_2.1.1 getutmp
+000d3e60 g DF .text 00000037 GLIBC_2.0 setsockopt
+0006b890 g DF .text 00000180 GLIBC_2.0 malloc
+00065ae0 g DF .text 0000010e GLIBC_2.0 _IO_default_xsputn
+000cfb90 w DF .text 00000046 GLIBC_2.3.3 remap_file_pages
+00029f60 w DF .text 00000064 GLIBC_2.0 siglongjmp
+001465b8 g DO .bss 0000000c GLIBC_2.0 svcauthdes_stats
+000ce990 g DF .text 00000240 GLIBC_2.0 getpass
+0002e580 w DF .text 00000046 GLIBC_2.0 strtouq
+00143404 g DO .data 00000004 (GLIBC_2.2) __ctype32_tolower
+00100a90 g DF .text 00000022 GLIBC_2.0 xdr_keystatus
+000d3920 g DF .text 00000034 GLIBC_2.0 uselib
+0002b070 g DF .text 00000052 GLIBC_2.0 sigisemptyset
+00075240 g DF .text 00000044 GLIBC_2.1.1 __strspn_g
+0002a1c0 g DF .text 00000044 GLIBC_2.0 killpg
+00037fe0 g DF .text 00000048 GLIBC_2.0 strfmon
+000230e0 w DF .text 0000014b GLIBC_2.3 duplocale
+0006f690 g DF .text 000001aa GLIBC_2.0 strcat
+000fc400 g DF .text 0000001a GLIBC_2.0 xdr_int
+000c2ca0 w DF .text 00000010 GLIBC_2.0 umask
+00071260 w DF .text 00000062 GLIBC_2.0 strcasecmp
+0008ef00 w DF .text 000000a2 GLIBC_2.4 fdopendir
+00061160 g DF .text 00000179 GLIBC_2.1 ftello64
+000df3b0 g DF .text 00000043 GLIBC_2.0 pthread_attr_getschedpolicy
+0010c9c0 g DF .text 0000003f (GLIBC_2.0) realpath
+00037800 g DF .text 0000050e GLIBC_2.3 realpath
+00085bd0 g DF .text 0000003e GLIBC_2.0 timegm
+00060c10 g DF .text 000001bb GLIBC_2.1 ftello
+000294b0 w DF .text 000001cf GLIBC_2.0 modf
+00109870 g DF .text 0000008b GLIBC_PRIVATE __libc_dlclose
+00068850 g DF .text 0000018a GLIBC_2.0 __libc_mallinfo
+0002a130 g DF .text 0000008a GLIBC_2.0 raise
+000cb750 g DF .text 000000a7 GLIBC_2.0 setegid
+000670f0 w DF .text 00000034 GLIBC_2.0 malloc_usable_size
+00023db0 g DF .text 00000017 GLIBC_2.1 __isdigit_l
+000d2f50 g DF .text 00000013 GLIBC_2.0 setfsgid
+0005c840 g DF .text 0000007e GLIBC_2.2 _IO_wdefault_doallocate
+0004ae40 g DF .text 00005c04 GLIBC_2.0 _IO_vfscanf
+00056a20 g DF .text 0000005c GLIBC_2.0 remove
+000b7550 w DF .text 0000003a GLIBC_2.0 sched_setscheduler
+0007dce0 w DF .text 00000039 GLIBC_2.3 wcstold_l
+00093740 w DF .text 00000038 GLIBC_2.0 setpgid
+000d3ac0 w DF .text 00000037 GLIBC_2.0 getpeername
+000819d0 w DF .text 00000055 GLIBC_2.3 wcscasecmp_l
+00074da0 g DF .text 00000038 GLIBC_2.1.1 __memset_gcn_by2
+000e7750 g DF .text 00000158 GLIBC_2.4 __fgets_chk
+0006fb30 g DF .text 00000154 GLIBC_2.1.1 __strverscmp
+000e39d0 g DF .text 00000019 GLIBC_2.2 __res_state
+000f8580 g DF .text 00000115 GLIBC_2.0 pmap_getmaps
+000298f0 w DF .text 0000006a GLIBC_2.0 frexpf
+00141360 g DO .data.rel.ro 000001f8 (GLIBC_2.3) sys_errlist
+0006fcf0 g DF .text 00000064 GLIBC_2.2 __strndup
+00141360 g DO .data.rel.ro 000001ec (GLIBC_2.0) sys_errlist
+00141360 g DO .data.rel.ro 00000210 GLIBC_2.4 sys_errlist
+00074d60 g DF .text 00000035 GLIBC_2.1.1 __memset_gcn_by4
+00141360 g DO .data.rel.ro 000001f4 (GLIBC_2.1) sys_errlist
+001462ec g DO .bss 00000004 GLIBC_2.0 mallwatch
+00065450 w DF .text 000001fd GLIBC_2.2 _flushlbf
+00076b60 w DF .text 00000019 GLIBC_2.0 mbsinit
+000d69c0 w DF .text 0000005d GLIBC_2.3 towupper_l
+000e6b90 g DF .text 000000bc GLIBC_2.3.4 __strncpy_chk
+00093530 w DF .text 0000000c GLIBC_2.0 getgid
+0010a520 g DF .text 00000043 GLIBC_2.0 __register_frame_table
+000b0260 w DF .text 0000007c GLIBC_2.0 re_compile_pattern
+000465f0 w DF .text 00000034 GLIBC_2.0 asprintf
+00084630 w DF .text 00000079 GLIBC_2.0 tzset
+000c0f10 g DF .text 000000bc GLIBC_PRIVATE __libc_pwrite
+001430cc g DO .data 00000004 GLIBC_2.0 re_max_failures
+000c21c0 g DF .text 0000003f (GLIBC_2.1) __lxstat64
+00143920 g DO .data 00000050 GLIBC_2.0 _IO_stderr_
+000c21c0 g DF .text 0000003f GLIBC_2.2 __lxstat64
+00029c80 w DF .text 00000071 GLIBC_2.0 frexpl
+000fd820 g DF .text 00000170 GLIBC_2.0 xdrrec_eof
+00023c00 g DF .text 00000048 GLIBC_2.0 isupper
+000cf600 g DF .text 00000029 GLIBC_2.0 vsyslog
+00016a10 g DF .text 0000019e (GLIBC_2.0) __umoddi3
+000fb9e0 g DF .text 000002ee GLIBC_2.0 svcudp_bufcreate
+0006fe20 g DF .text 00000121 GLIBC_2.0 __strerror_r
+00029800 w DF .text 00000011 GLIBC_2.0 finitef
+000c28e0 w DF .text 0000012b GLIBC_2.1 fstatfs64
+00106e00 w DF .text 00000068 GLIBC_2.0 getutline
+000e5970 g DF .text 0000008a GLIBC_PRIVATE __nss_services_lookup
+00066100 g DF .text 00000138 GLIBC_2.0 __uflow
+00070fd0 g DF .text 00000044 GLIBC_2.0 __mempcpy
+0002ea30 w DF .text 00000030 GLIBC_2.3 strtol_l
+000297e0 g DF .text 00000018 GLIBC_2.0 __isnanf
+00022820 g DF .text 00000067 GLIBC_2.2 __nl_langinfo_l
+000fa150 g DF .text 00000087 GLIBC_2.2 svc_getreq_poll
+00029ab0 w DF .text 0000000e GLIBC_2.0 finitel
+000c1d90 g DF .text 00000081 GLIBC_2.6 __sched_cpucount
+000df2c0 g DF .text 00000043 GLIBC_2.0 pthread_attr_setinheritsched
+00000000 g DO *ABS* 00000000 GLIBC_2.1.1 GLIBC_2.1.1
+00146510 g DO .bss 00000004 GLIBC_2.2 svc_pollfd
+00000000 g DO *ABS* 00000000 GLIBC_2.1.2 GLIBC_2.1.2
+00060650 w DF .text 000000f7 GLIBC_2.0 __vsnprintf
+000227b0 g DF .text 00000070 GLIBC_2.0 nl_langinfo
+00000000 g DO *ABS* 00000000 GLIBC_2.1.3 GLIBC_2.1.3
+000cc460 g DF .text 00000089 GLIBC_2.0 setfsent
+000cc940 w DF .text 00000092 GLIBC_2.0 hasmntopt
+00029a60 g DF .text 00000046 GLIBC_2.0 __isnanl
+0002b1b0 g DF .text 00000016 GLIBC_2.1 __libc_current_sigrtmax
+0008e0b0 w DF .text 00000092 GLIBC_2.0 opendir
+000ea770 g DF .text 000001e1 GLIBC_2.1.2 getnetbyaddr_r
+001115d0 g DF .text 00000063 (GLIBC_2.0) getnetbyaddr_r
+00076080 g DF .text 000000a1 GLIBC_2.0 wcsncat
+00029680 w DF .text 0000000d GLIBC_2.1 scalbln
+000ea270 g DF .text 000000ab GLIBC_2.0 gethostent
+000e8ab0 g DF .text 00000042 GLIBC_2.4 __mbsrtowcs_chk
+000585a0 g DF .text 00000171 GLIBC_2.0 _IO_fgets
+00146500 g DO .bss 00000010 GLIBC_2.0 rpc_createerr
+000710c0 w DF .text 0000002e GLIBC_2.0 bzero
+000f8a60 g DF .text 00000685 GLIBC_2.0 clnt_broadcast
+0002ad00 g DF .text 00000024 GLIBC_2.0 __sigaddset
+000297b0 g DF .text 00000024 GLIBC_2.0 __isinff
+0006e220 g DF .text 000000bd GLIBC_2.2 mcheck_check_all
+00143164 g DO .data 00000004 GLIBC_2.1 argp_err_exit_status
+000d73c0 g DF .text 0000012d GLIBC_2.0 getspnam
+000df4f0 g DF .text 0000003c GLIBC_2.0 pthread_condattr_destroy
+000c2730 g DF .text 00000038 GLIBC_2.2 __statfs
+00144a94 g DO .bss 00000004 GLIBC_2.0 __environ
+000e7e90 g DF .text 00000056 GLIBC_2.4 __wcscat_chk
+000c2140 g DF .text 0000003f GLIBC_2.2 __xstat64
+00090850 w DF .text 0000024e GLIBC_2.0 fgetgrent_r
+000c2140 g DF .text 0000003f (GLIBC_2.1) __xstat64
+000f37d0 g DF .text 00000011 GLIBC_2.3.3 inet6_option_space
+000d2cd0 w DF .text 00000090 GLIBC_2.0 clone
+000d6ef0 g DF .text 00000090 GLIBC_2.1 __iswpunct_l
+0002c520 g DF .text 000000ef GLIBC_2.0 getenv
+00023fa0 g DF .text 0000003c GLIBC_2.3 __ctype_b_loc
+00029a00 g DF .text 00000055 GLIBC_2.0 __isinfl
+001108e0 g DF .text 00000032 (GLIBC_2.3.3) sched_getaffinity
+000b76c0 g DF .text 00000089 GLIBC_2.3.4 sched_getaffinity
+0002aa00 w DF .text 0000001b GLIBC_2.2 __xpg_sigpause
+000d5230 w DF .text 000001cd GLIBC_2.0 profil
+00055d10 g DF .text 00000034 GLIBC_2.0 sscanf
+0010a100 g DF .text 00000023 GLIBC_2.0 __deregister_frame_info
+00093900 w DF .text 00000085 GLIBC_2.0 setresuid
+0002e130 w DF .text 00000052 GLIBC_2.0 jrand48_r
+000d3c30 w DF .text 0000006c GLIBC_2.0 recvfrom
+00074e70 g DF .text 00000040 GLIBC_2.1.1 __mempcpy_by2
+000d5c40 g DF .text 00000019 GLIBC_2.0 __profile_frequency
+00077770 w DF .text 0000032f GLIBC_2.0 wcsnrtombs
+00074e30 g DF .text 00000033 GLIBC_2.1.1 __mempcpy_by4
+00146520 g DO .bss 00000080 GLIBC_2.0 svc_fdset
+000ef660 g DF .text 0000009c GLIBC_2.0 ruserok
+0006f550 g DF .text 0000002c GLIBC_2.0 _obstack_allocated_p
+000c7250 g DF .text 0000003b GLIBC_2.0 fts_set
+000fc690 g DF .text 0000001a GLIBC_2.1.1 xdr_u_longlong_t
+000caec0 g DF .text 000000ab GLIBC_2.0 nice
+000b0130 w DF .text 00000126 GLIBC_2.0 regcomp
+00101c60 g DF .text 0000023b GLIBC_2.1 xdecrypt
+000c2ff0 w DF .text 00000070 GLIBC_2.0 __open
+00085ac0 w DF .text 00000038 GLIBC_2.0 getitimer
+00023ac0 g DF .text 00000048 GLIBC_2.0 isgraph
+00146344 g DO .bss 00000004 GLIBC_2.0 optarg
+00028a30 g DF .text 00000080 GLIBC_2.0 catclose
+000f7630 g DF .text 000002db GLIBC_2.0 clntudp_bufcreate
+000eb950 g DF .text 0000013d GLIBC_2.0 getservbyname
+00061330 g DF .text 0000001a GLIBC_2.2 __freading
+0007ff30 g DF .text 0000007b GLIBC_2.0 wcwidth
+00143844 g DO .data 00000004 GLIBC_2.0 stderr
+000d4500 g DF .text 00000065 GLIBC_2.2 msgctl
+00110eb0 g DF .text 00000062 (GLIBC_2.0) msgctl
+000e8f60 g DF .text 0000002d GLIBC_2.0 inet_lnaof
+0002ae80 g DF .text 0000006a GLIBC_2.0 sigdelset
+00016110 w DF .text 00000016 GLIBC_2.1 gnu_get_libc_release
+000cb070 w DF .text 0000003a GLIBC_2.0 ioctl
+000c44d0 g DF .text 00000178 GLIBC_2.4 fchownat
+000923c0 g DF .text 00000034 GLIBC_2.0 alarm
+00143560 g DO .data 00000098 GLIBC_2.1 _IO_2_1_stderr_
+0005c580 g DF .text 00000049 GLIBC_2.2 _IO_sputbackwc
+0006ad30 g DF .text 00000105 GLIBC_2.0 __libc_pvalloc
+00037700 w DF .text 0000007d GLIBC_2.0 system
+00100700 g DF .text 00000068 GLIBC_2.1 xdr_getcredres
+000782f0 w DF .text 00000040 GLIBC_2.1 __wcstol_l
+00055c30 w DF .text 00000039 GLIBC_2.2 vfwscanf
+000d3520 g DF .text 0000002c GLIBC_2.4 inotify_init
+000cdc60 g DF .text 00000044 GLIBC_2.0 chflags
+000d1c60 g DF .text 00000026 GLIBC_2.0 err
+000ebab0 g DF .text 000001fb GLIBC_2.1.2 getservbyname_r
+00111990 g DF .text 00000066 (GLIBC_2.0) getservbyname_r
+000fc810 g DF .text 00000079 GLIBC_2.0 xdr_bool
+00071100 g DF .text 00000064 GLIBC_2.1 ffsll
+00023ef0 g DF .text 0000002c GLIBC_2.3 __isctype
+000caae0 g DF .text 0000006a GLIBC_2.1 setrlimit64
+00093670 w DF .text 00000088 GLIBC_2.0 group_member
+000c1e60 g DF .text 00000056 GLIBC_2.6 sched_getcpu
+000583a0 g DF .text 000001df GLIBC_2.2 _IO_fgetpos
+00065a80 g DF .text 00000052 GLIBC_2.0 _IO_free_backup_area
+000cfa20 w DF .text 00000038 GLIBC_2.0 munmap
+0010d4c0 g DF .text 0000013b (GLIBC_2.0) _IO_fgetpos
+000c14e0 g DF .text 00000037 GLIBC_2.2 posix_spawnattr_setsigdefault
+0006f2e0 g DF .text 000000cc GLIBC_2.0 _obstack_begin_1
+000918d0 g DF .text 00000319 GLIBC_PRIVATE _nss_files_parse_pwent
+000e88a0 g DF .text 0000003b GLIBC_2.4 __getgroups_chk
+00091fe0 w DF .text 00000029 GLIBC_2.0 wait3
+00092010 w DF .text 00000040 GLIBC_2.0 wait4
+0006f3b0 g DF .text 00000195 GLIBC_2.0 _obstack_newchunk
+00074ef0 g DF .text 00000034 GLIBC_2.1.1 __stpcpy_g
+000d25b0 w DF .text 0000007c GLIBC_2.0 advance
+000f42e0 g DF .text 0000002a GLIBC_2.5 inet6_opt_init
+00143024 g DO .data 00000002 GLIBC_2.0 __fpu_control
+00109ff0 g DF .text 0000003a GLIBC_2.0 __register_frame_info
+000e9980 g DF .text 000001a5 GLIBC_2.0 gethostbyname
+000c3760 w DF .text 0000003a GLIBC_2.0 __lseek
+000e6e40 g DF .text 00000039 GLIBC_2.3.4 __snprintf_chk
+001430d8 g DO .data 00000004 GLIBC_2.0 optopt
+000c13b0 g DF .text 00000097 GLIBC_2.2 posix_spawn_file_actions_adddup2
+000782f0 w DF .text 00000040 GLIBC_2.3 wcstol_l
+00146354 g DO .bss 00000004 GLIBC_2.0 error_message_count
+00023d90 g DF .text 00000015 GLIBC_2.1 __iscntrl_l
+000c2f00 g DF .text 000000ed GLIBC_2.4 mkdirat
+000cb6a0 g DF .text 000000a7 GLIBC_2.0 seteuid
+00075f50 g DF .text 0000002c GLIBC_2.0 wcscpy
+0002e0f0 g DF .text 00000037 GLIBC_2.0 mrand48_r
+000d2f30 g DF .text 00000013 GLIBC_2.0 setfsuid
+000c3f40 w DF .text 00000034 GLIBC_2.0 dup
+000e68a0 g DF .text 000000d9 GLIBC_2.3.4 __memset_chk
+00143860 g DO .data 00000050 GLIBC_2.0 _IO_stdin_
+000df9a0 g DF .text 00000046 GLIBC_2.0 pthread_exit
+000fc7d0 g DF .text 00000037 GLIBC_2.0 xdr_u_char
+0005b310 g DF .text 0000003d GLIBC_2.2 getwchar_unlocked
+00146340 g DO .bss 00000004 GLIBC_2.0 re_syntax_options
+00108fb0 g DF .text 00000023 GLIBC_2.1 pututxline
+000d4300 w DF .text 000000b6 GLIBC_2.0 msgsnd
+00093a20 g DF .text 000000dd GLIBC_2.0 getlogin
+000cdcb0 g DF .text 00000044 GLIBC_2.0 fchflags
+0002b0d0 g DF .text 0000005f GLIBC_2.0 sigandset
+000298e0 w DF .text 0000000d GLIBC_2.0 scalbnf
+000b7680 w DF .text 00000038 GLIBC_2.0 sched_rr_get_interval
+00064360 g DF .text 00000091 GLIBC_2.1 _IO_file_finish
+000d2c50 g DF .text 00000075 GLIBC_2.2 __sysctl
+000fcea0 g DF .text 000000a0 GLIBC_2.0 xdr_double
+00093550 w DF .text 0000003f GLIBC_2.0 getgroups
+00029c70 w DF .text 0000000d GLIBC_2.0 scalbnl
+000cb210 w DF .text 00000103 GLIBC_2.0 readv
+00093510 w DF .text 0000000c GLIBC_2.0 getuid
+000ef5a0 g DF .text 0000003f GLIBC_2.0 rcmd
+000c4f30 w DF .text 0000003a GLIBC_2.0 readlink
+000d1790 g DF .text 0000008b GLIBC_2.0 lsearch
+000ee6b0 g DF .text 000000ca GLIBC_2.2 iruserok_af
+00055c90 g DF .text 00000024 GLIBC_2.0 fscanf
+000eccc0 g DF .text 00000656 GLIBC_2.0 ether_aton_r
+00041ac0 g DF .text 0000264a GLIBC_2.0 __printf_fp
+000d3620 w DF .text 00000046 GLIBC_2.0 mremap
+000d2ec0 w DF .text 0000006a GLIBC_2.3 readahead
+00100c60 g DF .text 000001a0 GLIBC_2.1 host2netname
+000d2a60 g DF .text 00000038 GLIBC_2.3 removexattr
+0005c410 g DF .text 0000002d GLIBC_2.2 _IO_switch_to_wbackup_area
+000f88f0 g DF .text 0000006f GLIBC_2.0 xdr_pmap
+00000000 g DO *ABS* 00000000 GLIBC_2.2.1 GLIBC_2.2.1
+00074eb0 g DF .text 00000033 GLIBC_2.1.1 __mempcpy_byn
+000eb310 g DF .text 000000a2 GLIBC_2.0 getprotoent
+00092aa0 w DF .text 00000053 GLIBC_2.0 execve
+0005e350 g DF .text 0000015f GLIBC_2.2 _IO_wfile_sync
+00000000 g DO *ABS* 00000000 GLIBC_2.2.2 GLIBC_2.2.2
+000fc8b0 g DF .text 000000cd GLIBC_2.0 xdr_opaque
+00093540 w DF .text 0000000c GLIBC_2.0 getegid
+00000000 g DO *ABS* 00000000 GLIBC_2.2.3 GLIBC_2.2.3
+00000000 g DO *ABS* 00000000 GLIBC_2.2.4 GLIBC_2.2.4
+000caa10 g DF .text 0000003f GLIBC_2.2 setrlimit
+000d30f0 g DF .text 00000038 (GLIBC_2.0) setrlimit
+000b7480 g DF .text 00000047 GLIBC_2.0 getopt_long
+00063c10 g DF .text 0000011b GLIBC_2.0 _IO_file_open
+00000000 g DO *ABS* 00000000 GLIBC_2.2.6 GLIBC_2.2.6
+000835e0 w DF .text 00000038 GLIBC_2.0 settimeofday
+0005fe80 g DF .text 000000cb GLIBC_2.0 open_memstream
+000cb040 g DF .text 00000022 GLIBC_2.0 sstk
+00109e50 g DF .text 000000d7 GLIBC_PRIVATE _dl_vsym
+000613b0 g DF .text 00000076 GLIBC_2.2 __fpurge
+00108fe0 g DF .text 00000023 GLIBC_2.1 utmpxname
+00093700 w DF .text 00000034 GLIBC_2.0 getpgid
+0002b1b0 g DF .text 00000016 GLIBC_PRIVATE __libc_current_sigrtmax_private
+00037150 w DF .text 00000029 GLIBC_2.3 strtold_l
+000e6aa0 g DF .text 000000e7 GLIBC_2.3.4 __strncat_chk
+000c1d60 g DF .text 00000024 GLIBC_2.2 posix_madvise
+000c1560 g DF .text 00000012 GLIBC_2.2 posix_spawnattr_getpgroup
+000d1af0 g DF .text 000000e3 GLIBC_2.0 vwarnx
+000753b0 g DF .text 000000d3 GLIBC_2.1.1 __mempcpy_small
+0010d620 g DF .text 00000184 (GLIBC_2.1) fgetpos64
+0005abb0 g DF .text 000001af GLIBC_2.2 fgetpos64
+0006f840 w DF .text 00000167 GLIBC_2.0 index
+001464e4 g DO .bss 00000004 GLIBC_2.0 rexecoptions
+000df1d0 g DF .text 00000043 GLIBC_2.0 pthread_attr_getdetachstate
+0005daf0 g DF .text 0000019f GLIBC_2.2 _IO_wfile_xsputn
+00092f20 g DF .text 00000441 GLIBC_2.0 execvp
+000cfb50 g DF .text 0000003a GLIBC_2.2 mincore
+00068850 w DF .text 0000018a GLIBC_2.0 mallinfo
+000689e0 w DF .text 00000077 GLIBC_2.0 malloc_trim
+000665f0 g DF .text 00000042 GLIBC_2.0 _IO_str_underflow
+000f2710 g DF .text 00000023 GLIBC_2.3 freeifaddrs
+000fb8b0 g DF .text 00000126 GLIBC_2.0 svcudp_enablecache
+000230e0 g DF .text 0000014b GLIBC_2.1 __duplocale
+00081a30 g DF .text 00000073 GLIBC_2.1 __wcsncasecmp_l
+000c4c10 g DF .text 000001c1 GLIBC_2.4 linkat
+00065d90 g DF .text 00000129 GLIBC_2.0 _IO_default_pbackfail
+000f4690 g DF .text 00000024 GLIBC_2.5 inet6_rth_space
+0005c7e0 g DF .text 00000058 GLIBC_2.2 _IO_free_wbackup_area
+000df6d0 g DF .text 0000004a GLIBC_2.3.2 pthread_cond_timedwait
+001112d0 g DF .text 0000004a (GLIBC_2.0) pthread_cond_timedwait
+000914f0 g DF .text 000001ec GLIBC_2.1.2 getpwnam_r
+0010d7d0 g DF .text 00000110 (GLIBC_2.0) _IO_fsetpos
+0010f070 g DF .text 0000005f (GLIBC_2.0) getpwnam_r
+00058e40 g DF .text 0000013e GLIBC_2.2 _IO_fsetpos
+0014332c w DO .data 00000004 GLIBC_2.0 __realloc_hook
+0005f8b0 g DF .text 0000026b GLIBC_2.0 freopen
+000e6520 w DF .text 00000217 GLIBC_2.1 backtrace_symbols_fd
+000712d0 w DF .text 0000007a GLIBC_2.0 strncasecmp
+000c2200 g DF .text 00000096 GLIBC_2.0 __xmknod
+0005dc90 g DF .text 000006b2 GLIBC_2.2 _IO_wfile_seekoff
+000e7a80 g DF .text 00000032 GLIBC_2.4 __recv_chk
+000cc390 g DF .text 0000008b GLIBC_2.0 ptrace
+000f4710 g DF .text 00000106 GLIBC_2.5 inet6_rth_reverse
+000cdd30 g DF .text 0000001a GLIBC_2.0 remque
+000f2b40 g DF .text 00000c87 GLIBC_2.3 getifaddrs
+000d70c0 w DF .text 0000005d GLIBC_2.3 towlower_l
+0005bc50 g DF .text 00000038 GLIBC_2.2 putwc_unlocked
+00045bc0 g DF .text 0000002b GLIBC_2.1 printf_size_info
+00000020 g D .tbss 00000004 GLIBC_PRIVATE h_errno
+00029680 w DF .text 0000000d GLIBC_2.0 scalbn
+0007dce0 w DF .text 00000039 GLIBC_2.1 __wcstold_l
+000f22d0 g DF .text 000000a4 GLIBC_2.1 if_nametoindex
+000298e0 w DF .text 0000000d GLIBC_2.1 scalblnf
+00077ce0 g DF .text 00000045 GLIBC_2.0 __wcstoll_internal
+00146480 g DO .bss 00000030 GLIBC_2.2 _res_hconf
+000c4000 w DF .text 0000006c GLIBC_2.0 creat
+000c2020 g DF .text 0000008e GLIBC_2.0 __fxstat
+0010e860 g DF .text 000000d8 (GLIBC_2.0) _IO_file_close_it
+00064400 g DF .text 0000019d GLIBC_2.1 _IO_file_close_it
+00029c70 w DF .text 0000000d GLIBC_2.1 scalblnl
+000631f0 g DF .text 00000016 GLIBC_2.0 _IO_file_close
+000700a0 g DF .text 000000aa GLIBC_2.0 strncat
+001002d0 g DF .text 00000081 GLIBC_2.1 key_decryptsession_pk
+0014316c g DO .data 00000004 GLIBC_2.0 __check_rhosts_file
+000c9630 g DF .text 00000040 GLIBC_2.3 sendfile64
+000d3d80 w DF .text 0000006c GLIBC_2.0 sendmsg
+000e6520 g DF .text 00000217 GLIBC_2.1 __backtrace_symbols_fd
+00039cf0 g DF .text 00000029 GLIBC_2.1 wcstoimax
+0002e580 g DF .text 00000046 GLIBC_2.0 strtoull
+00071970 g DF .text 00000090 GLIBC_2.1.1 __strsep_g
+0005cb30 g DF .text 000000e7 GLIBC_2.2 __wunderflow
+00016bb0 g DF .text 00000133 (GLIBC_2.0) __udivdi3
+00057d70 g DF .text 000001e8 GLIBC_2.1 _IO_fclose
+0010cd10 g DF .text 00000183 (GLIBC_2.0) _IO_fclose
+00061380 g DF .text 00000013 GLIBC_2.2 __fwritable
+000e7c30 g DF .text 00000038 GLIBC_2.4 __realpath_chk
+0002afc0 g DF .text 000000a2 GLIBC_2.0 __sysv_signal
+000cab90 w DF .text 000000cb GLIBC_2.0 ulimit
+000609d0 w DF .text 00000034 GLIBC_2.0 obstack_printf
+0005e870 g DF .text 00000475 GLIBC_2.2 _IO_wfile_underflow
+0005b050 g DF .text 0000006d GLIBC_2.2 fputwc_unlocked
+000c1c40 g DF .text 00000039 GLIBC_2.2 posix_spawnattr_getsigmask
+000e5bb0 g DF .text 0000008c GLIBC_2.0 __nss_passwd_lookup
+0002dd60 g DF .text 00000034 GLIBC_2.0 drand48
+000fc380 g DF .text 0000001f GLIBC_2.0 xdr_free
+0005f750 g DF .text 00000034 GLIBC_2.0 fileno
+0010d3e0 g DF .text 00000023 (GLIBC_2.0) pclose
+000710c0 g DF .text 0000002e GLIBC_2.0 __bzero
+000ea4e0 g DF .text 000000a8 GLIBC_2.0 sethostent
+00023e90 g DF .text 00000017 GLIBC_2.1 __isxdigit_l
+00060040 g DF .text 00000023 GLIBC_2.1 pclose
+000f46e0 g DF .text 00000026 GLIBC_2.5 inet6_rth_getaddr
+000b5970 w DF .text 00000039 GLIBC_2.0 re_search
+00093740 g DF .text 00000038 GLIBC_2.0 __setpgid
+000cb870 w DF .text 00000098 GLIBC_2.0 gethostname
+00024470 g DF .text 00000022 GLIBC_2.0 __dgettext
+000df0c0 g DF .text 00000046 GLIBC_2.0 pthread_equal
+000d8400 w DF .text 0000008f GLIBC_2.0 sgetspent_r
+000c2bf0 w DF .text 000000a3 GLIBC_2.1 fstatvfs64
+000cc2b0 g DF .text 0000003e GLIBC_2.0 usleep
+000df800 g DF .text 00000043 GLIBC_2.0 pthread_mutex_init
+000d2cd0 g DF .text 00000090 GLIBC_2.0 __clone
+000cd7c0 w DF .text 0000003f GLIBC_2.0 utimes
+00143408 g DO .data 00000004 (GLIBC_2.2) __ctype32_toupper
+0002b690 g DF .text 000001fd GLIBC_2.1 sigset
+000d4210 g DF .text 0000003e GLIBC_2.0 __cmsg_nxthdr
+0006f580 g DF .text 00000021 GLIBC_2.0 _obstack_memory_used
+000d2180 g DF .text 00000086 GLIBC_2.0 ustat
+000c43b0 g DF .text 00000053 GLIBC_2.1 chown
+00110960 g DF .text 00000031 (GLIBC_2.0) chown
+0006cff0 g DF .text 00000487 GLIBC_2.0 __libc_realloc
+000d3810 g DF .text 0000004c GLIBC_2.5 splice
+000c1590 g DF .text 00000050 GLIBC_2.2 posix_spawn
+000d6b50 g DF .text 00000090 GLIBC_2.1 __iswblank_l
+0005c5d0 g DF .text 0000004b GLIBC_2.2 _IO_sungetwc
+00121960 g DO .rodata 00000024 GLIBC_PRIVATE _itoa_lower_digits
+000c4120 w DF .text 00000130 GLIBC_2.0 getcwd
+000fccb0 g DF .text 0000004f GLIBC_2.0 xdr_vector
+000593f0 w DF .text 00000278 GLIBC_2.0 __getdelim
+00039eb0 w DF .text 000000a4 GLIBC_2.1 swapcontext
+000f9d10 g DF .text 00000030 GLIBC_2.2.3 __rpc_thread_svc_fdset
+00143340 g DO .data 00000004 GLIBC_2.0 __progname_full
+000d2950 g DF .text 00000040 GLIBC_2.3 lgetxattr
+001038c0 g DF .text 00000068 GLIBC_2.1 xdr_uint8_t
+00029800 g DF .text 00000011 GLIBC_2.0 __finitef
+00146358 g DO .bss 00000004 GLIBC_2.0 error_one_per_line
+00080fb0 w DF .text 00000955 GLIBC_2.3 wcsxfrm_l
+000fe9e0 g DF .text 0000022e GLIBC_2.1 authdes_pk_create
+000f2230 g DF .text 0000009b GLIBC_2.1 if_indextoname
+000d3960 g DF .text 00000040 GLIBC_2.5 vmsplice
+0005c370 g DF .text 00000024 GLIBC_2.2 swscanf
+000f9de0 g DF .text 00000042 GLIBC_2.0 svcerr_decode
+00059270 w DF .text 0000015f GLIBC_2.0 fwrite
+00109010 g DF .text 0000002a GLIBC_2.1 updwtmpx
+00016130 w DF .text 00000016 GLIBC_2.1 gnu_get_libc_version
+00029ab0 g DF .text 0000000e GLIBC_2.0 __finitel
+000ffcc0 g DF .text 00000089 GLIBC_2.1 des_setparity
+00029820 w DF .text 0000001e GLIBC_2.0 copysignf
+000e6740 g DF .text 00000005 GLIBC_2.2 __cyg_profile_func_enter
+00058d00 w DF .text 00000118 GLIBC_2.0 fread
+000f4000 g DF .text 00000184 GLIBC_2.3.4 getsourcefilter
+000297e0 w DF .text 00000018 GLIBC_2.0 isnanf
+000d04e0 g DF .text 0000032a GLIBC_2.0 qfcvt_r
+0002e050 g DF .text 00000037 GLIBC_2.0 lrand48_r
+000cfe50 g DF .text 000002e1 GLIBC_2.0 fcvt_r
+000835a0 w DF .text 00000038 GLIBC_2.0 gettimeofday
+000d6a20 w DF .text 00000090 GLIBC_2.3 iswalnum_l
+00017100 g DF .text 0000003a GLIBC_2.1 iconv_close
+00083620 w DF .text 0000011c GLIBC_2.0 adjtime
+000f07b0 w DF .text 00000095 GLIBC_2.0 getnetgrent_r
+0002a360 w DF .text 00000157 GLIBC_2.0 sigaction
+0005c6d0 g DF .text 0000003d GLIBC_2.2 _IO_wmarker_delta
+00056a80 g DF .text 00000038 GLIBC_2.0 rename
+00029ac0 w DF .text 0000001e GLIBC_2.0 copysignl
+0002df10 g DF .text 00000039 GLIBC_2.0 seed48
+000cdd50 g DF .text 00000042 GLIBC_2.0 endttyent
+00029a60 w DF .text 00000046 GLIBC_2.0 isnanl
+000659f0 g DF .text 0000008d GLIBC_2.0 _IO_default_finish
+001010f0 g DF .text 00000227 GLIBC_2.1 rtime
+000cc7b0 g DF .text 000000a9 GLIBC_2.0 getfsent
+000d32f0 g DF .text 00000040 GLIBC_2.3.2 epoll_ctl
+000d6920 g DF .text 00000092 GLIBC_2.1 __iswxdigit_l
+00058b90 g DF .text 00000149 GLIBC_2.0 _IO_fputs
+00000000 g DO *ABS* 00000000 GLIBC_2.3.2 GLIBC_2.3.2
+000cfb10 g DF .text 0000003a GLIBC_2.0 madvise
+00090580 g DF .text 000002c2 GLIBC_PRIVATE _nss_files_parse_grent
+00100f00 g DF .text 00000063 GLIBC_2.1 getnetname
+00101bf0 g DF .text 00000061 GLIBC_2.1 passwd2des
+00000000 g DO *ABS* 00000000 GLIBC_2.3.3 GLIBC_2.3.3
+001095e0 g DF .text 00000033 GLIBC_2.1 _dl_mcount_wrapper
+0002ad30 g DF .text 00000024 GLIBC_2.0 __sigdelset
+00000000 g DO *ABS* 00000000 GLIBC_2.3.4 GLIBC_2.3.4
+0008e510 g DF .text 000001e4 GLIBC_2.0 scandir
+00075520 g DF .text 000000b2 GLIBC_2.1.1 __stpcpy_small
+000ead50 g DF .text 000000a8 GLIBC_2.0 setnetent
+000cc1e0 g DF .text 0000002b GLIBC_2.2 mkstemp64
+0002b190 g DF .text 00000016 GLIBC_PRIVATE __libc_current_sigrtmin_private
+000d2fa0 g DF .text 00000019 GLIBC_2.3.3 gnu_dev_minor
+000297b0 w DF .text 00000024 GLIBC_2.0 isinff
+000938a0 w DF .text 00000053 GLIBC_2.0 getresgid
+00029f60 g DF .text 00000064 GLIBC_PRIVATE __libc_siglongjmp
+000c2730 w DF .text 00000038 GLIBC_2.0 statfs
+00093520 w DF .text 0000000c GLIBC_2.0 geteuid
+000b74d0 w DF .text 00000038 GLIBC_2.0 sched_setparam
+000e6750 g DF .text 00000050 GLIBC_2.3.4 __memcpy_chk
+000ed320 g DF .text 00000153 GLIBC_2.0 ether_hostton
+000d6ab0 w DF .text 00000092 GLIBC_2.3 iswalpha_l
+000d37d0 g DF .text 00000040 GLIBC_2.0 quotactl
+0002d800 w DF .text 00000060 GLIBC_2.0 srandom
+000d6f80 g DF .text 00000092 GLIBC_2.1 __iswspace_l
+000ecb10 g DF .text 0000017d GLIBC_2.1.2 getrpcbynumber_r
+00111cf0 g DF .text 0000005f (GLIBC_2.0) getrpcbynumber_r
+00029a00 w DF .text 00000055 GLIBC_2.0 isinfl
+0002b890 g DF .text 00000023 GLIBC_2.0 atof
+000ce5b0 g DF .text 000000a7 GLIBC_2.0 getttynam
+0009f160 w DF .text 0000004b GLIBC_2.0 re_set_registers
+00028c30 g DF .text 000007d2 GLIBC_PRIVATE __open_catalog
+0002aef0 g DF .text 0000006e GLIBC_2.0 sigismember
+000df360 g DF .text 00000043 GLIBC_2.0 pthread_attr_setschedparam
+00071020 g DF .text 0000009f GLIBC_2.0 bcopy
+000602f0 g DF .text 0000003b GLIBC_2.0 setlinebuf
+000e6c50 g DF .text 000000cd GLIBC_2.4 __stpncpy_chk
+00076430 w DF .text 0000011e GLIBC_2.1 wcswcs
+0002b8c0 g DF .text 0000002b GLIBC_2.0 atoi
+000d6e50 g DF .text 00000092 GLIBC_2.1 __iswprint_l
+00075800 g DF .text 0000005e GLIBC_2.1.1 __strtok_r_1c
+000fc4b0 g DF .text 000000cb GLIBC_2.1.1 xdr_hyper
+0008f010 g DF .text 00000074 GLIBC_2.2 getdirentries64
+00085b40 g DF .text 00000034 GLIBC_2.0 stime
+00027430 w DF .text 0000011d GLIBC_2.0 textdomain
+000b7600 w DF .text 00000034 GLIBC_2.0 sched_get_priority_max
+0002b8f0 g DF .text 0000002b GLIBC_2.0 atol
+000ca830 g DF .text 00000032 GLIBC_2.0 tcflush
+000c1ca0 g DF .text 00000039 GLIBC_2.2 posix_spawnattr_getschedparam
+000f4390 g DF .text 000000b4 GLIBC_2.5 inet6_opt_find
+00077d30 g DF .text 00000046 GLIBC_2.1 wcstoull
+000edc30 g DF .text 00000155 GLIBC_2.0 ether_ntohost
+00141580 g DO .data.rel.ro 00000100 (GLIBC_2.1) sys_siglist
+00141580 g DO .data.rel.ro 00000080 (GLIBC_2.0) sys_siglist
+000cfc60 g DF .text 00000034 GLIBC_2.0 mlockall
+00141580 g DO .data.rel.ro 00000104 GLIBC_2.3.3 sys_siglist
+000cc340 g DF .text 00000044 GLIBC_2.0 stty
+000d5d00 w DF .text 000000cb GLIBC_2.0 iswxdigit
+000c7220 g DF .text 00000026 GLIBC_2.1 ftw64
+00091f70 w DF .text 00000070 GLIBC_2.0 waitpid
+000e8a10 g DF .text 00000049 GLIBC_2.4 __mbsnrtowcs_chk
+00061430 g DF .text 0000002a GLIBC_2.2 __fpending
+000c3610 w DF .text 00000065 GLIBC_2.0 close
+00108a90 g DF .text 0000006b GLIBC_2.1 unlockpt
+000fc9b0 g DF .text 00000090 GLIBC_2.0 xdr_union
+000e6100 w DF .text 00000160 GLIBC_2.1 backtrace
+0006fb30 w DF .text 00000154 GLIBC_2.1 strverscmp
+000c1c80 g DF .text 00000015 GLIBC_2.2 posix_spawnattr_getschedpolicy
+00028980 g DF .text 000000ab GLIBC_2.0 catgets
+0002d310 g DF .text 00000095 GLIBC_2.0 lldiv
+00106b50 w DF .text 0000005e GLIBC_2.0 endutent
+000df900 w DF .text 00000043 GLIBC_2.0 pthread_setcancelstate
+00056180 g DF .text 000000b8 GLIBC_2.0 tmpnam
+000e1020 g DF .text 000000cf GLIBC_2.0 inet_nsap_ntoa
+00075d80 g DF .text 00000126 GLIBC_2.6 strerror_l
+000c2ff0 w DF .text 00000070 GLIBC_2.0 open
+000d0ea0 w DF .text 00000022 GLIBC_2.0 twalk
+0002dee0 g DF .text 0000002d GLIBC_2.0 srand48
+00023ed0 w DF .text 00000011 GLIBC_2.3 toupper_l
+00102d10 g DF .text 00000012 GLIBC_2.1 svcunixfd_create
+000d2ba0 g DF .text 00000034 GLIBC_2.0 iopl
+000c6200 g DF .text 00000026 GLIBC_2.0 ftw
+00077d80 g DF .text 00000045 GLIBC_2.0 __wcstoull_internal
+000d7510 g DF .text 00000141 GLIBC_2.0 sgetspent
+0006fe20 w DF .text 00000121 GLIBC_2.0 strerror_r
+00065860 g DF .text 00000016 GLIBC_2.2 _IO_iter_begin
+000df720 g DF .text 0000004a GLIBC_2.0 pthread_getschedparam
+000258d0 w DF .text 00000040 GLIBC_2.2 dngettext
+000f9cd0 g DF .text 00000039 GLIBC_2.2.3 __rpc_thread_createerr
+000cc0b0 g DF .text 00000034 GLIBC_2.0 vhangup
+00082ab0 g DF .text 00000035 GLIBC_2.0 localtime
+00100650 g DF .text 0000008f GLIBC_2.1 key_secretkey_is_set
+00082a20 g DF .text 0000000d GLIBC_2.0 difftime
+000cc0f0 w DF .text 00000038 GLIBC_2.0 swapon
+00108f30 g DF .text 00000017 GLIBC_2.1 endutxent
+000d2d90 w DF .text 000000a5 GLIBC_2.1 lseek64
+000e8a60 g DF .text 00000049 GLIBC_2.4 __wcsnrtombs_chk
+00061c70 g DF .text 00000010 GLIBC_2.0 ferror_unlocked
+000d2e40 w DF .text 00000034 GLIBC_2.0 umount
+00092a84 w DF .text 00000013 GLIBC_2.1.1 _Exit
+000d31f0 g DF .text 00000038 GLIBC_2.1 capset
+0006f840 g DF .text 00000167 GLIBC_2.0 strchr
+000d7220 w DF .text 00000073 GLIBC_2.3 wctrans_l
+000d2800 g DF .text 0000003a GLIBC_2.3 flistxattr
+000f5da0 g DF .text 000001fd GLIBC_2.0 clnt_spcreateerror
+0006f610 g DF .text 00000078 GLIBC_2.0 obstack_free
+000df450 g DF .text 00000043 GLIBC_2.0 pthread_attr_getscope
+000f1280 g DF .text 000000a2 GLIBC_2.0 getaliasent
+00141360 g DO .data.rel.ro 000001f8 (GLIBC_2.3) _sys_errlist
+00141360 g DO .data.rel.ro 00000210 GLIBC_2.4 _sys_errlist
+00141360 g DO .data.rel.ro 000001f4 (GLIBC_2.1) _sys_errlist
+00141360 g DO .data.rel.ro 000001ec (GLIBC_2.0) _sys_errlist
+0002b620 g DF .text 00000070 GLIBC_2.1 sigignore
+0002af60 w DF .text 00000022 GLIBC_2.0 sigreturn
+000ee830 g DF .text 000001c7 GLIBC_2.2 rresvport_af
+000d4ef0 g DF .text 000001a0 GLIBC_2.0 __monstartup
+000d5dd0 w DF .text 000000a4 GLIBC_2.0 iswdigit
+000fa3a0 g DF .text 00000037 GLIBC_2.0 svcerr_weakauth
+00060ad0 w DF .text 00000017 GLIBC_2.0 fcloseall
+000e81a0 g DF .text 0000010b GLIBC_2.4 __wprintf_chk
+000d6180 w DF .text 000000c9 GLIBC_2.0 iswcntrl
+000cce00 w DF .text 0000002c GLIBC_2.0 endmntent
+00056f40 w DF .text 0000002f GLIBC_2.0 funlockfile
+001447c4 g DO .bss 00000004 GLIBC_2.0 __timezone
+00046500 g DF .text 00000024 GLIBC_2.0 fprintf
+000d3b00 g DF .text 00000037 GLIBC_2.0 getsockname
+000c1ec0 g DF .text 00000038 GLIBC_2.0 utime
+0010eb40 g DF .text 000001e4 (GLIBC_2.1) scandir64
+0008ecb0 g DF .text 000001e4 GLIBC_2.2 scandir64
+000d0a50 g DF .text 00000045 GLIBC_2.0 hsearch
+000dd100 w DF .text 000000dd GLIBC_2.1 argp_error
+00146234 g DO .bss 00000004 GLIBC_2.0 _nl_domain_bindings
+00075760 g DF .text 00000041 GLIBC_2.1.1 __strpbrk_c2
+0002d1f0 g DF .text 00000011 GLIBC_2.0 abs
+000d3df0 w DF .text 0000006c GLIBC_2.0 sendto
+000757b0 g DF .text 0000004c GLIBC_2.1.1 __strpbrk_c3
+000cc9e0 w DF .text 0000041f GLIBC_2.0 addmntent
+000d6ef0 w DF .text 00000090 GLIBC_2.3 iswpunct_l
+00037150 w DF .text 00000029 GLIBC_2.1 __strtold_l
+001082d0 w DF .text 0000010f GLIBC_2.0 updwtmp
+000e46e0 g DF .text 00000372 GLIBC_2.0 __nss_database_lookup
+0005c3a0 g DF .text 00000033 GLIBC_2.2 _IO_least_wmarker
+00070300 w DF .text 000001b9 GLIBC_2.0 rindex
+00092a30 w DF .text 00000051 GLIBC_2.0 vfork
+0010ed90 g DF .text 000000e5 (GLIBC_2.0) getgrent_r
+000fa1e0 g DF .text 000000fe GLIBC_2.0 xprt_register
+000393e0 g DF .text 000000f0 GLIBC_2.1 addseverity
+0008fef0 g DF .text 000000e2 GLIBC_2.1.2 getgrent_r
+000e7250 g DF .text 000000bc GLIBC_2.3.4 __vfprintf_chk
+00083540 g DF .text 0000003c GLIBC_2.0 mktime
+00100550 g DF .text 00000100 GLIBC_2.1 key_gendes
+0002d3b0 g DF .text 000000c5 GLIBC_2.0 mblen
+000d16e0 w DF .text 0000005c GLIBC_2.1 tdestroy
+000d2c50 w DF .text 00000075 GLIBC_2.0 sysctl
+000f5a20 g DF .text 000002e2 GLIBC_2.0 clnt_create
+0008e700 g DF .text 00000024 GLIBC_2.0 alphasort
+001447c4 w DO .bss 00000004 GLIBC_2.0 timezone
+000f90f0 g DF .text 000000ec GLIBC_2.0 xdr_rmtcall_args
+00070bd0 g DF .text 00000104 GLIBC_2.0 __strtok_r
+00068ec0 w DF .text 0000014b GLIBC_2.0 mallopt
+000fde60 g DF .text 00000035 GLIBC_2.0 xdrstdio_create
+00039c90 g DF .text 00000029 GLIBC_2.1 strtoimax
+00056950 w DF .text 00000039 GLIBC_2.0 getline
+00144100 w DO .bss 00000004 GLIBC_2.0 __malloc_initialize_hook
+000d6c70 g DF .text 00000093 GLIBC_2.1 __iswdigit_l
+00071170 g DF .text 00000041 GLIBC_2.0 __stpcpy
+00016f70 g DF .text 00000187 GLIBC_2.1 iconv
+000f8080 g DF .text 000000f5 GLIBC_2.0 get_myaddress
+000ec990 g DF .text 0000017d GLIBC_2.1.2 getrpcbyname_r
+00111c90 g DF .text 0000005f (GLIBC_2.0) getrpcbyname_r
+00143344 w DO .data 00000004 GLIBC_2.0 program_invocation_short_name
+000d3170 g DF .text 00000038 GLIBC_2.0 bdflush
+0002d230 w DF .text 00000031 GLIBC_2.1.1 imaxabs
+00016540 g DF .text 0000002a (GLIBC_2.0) __floatdidf
+000a2f60 w DF .text 00000093 GLIBC_2.0 re_compile_fastmap
+000d29d0 g DF .text 00000038 GLIBC_2.3 lremovexattr
+0010cb50 g DF .text 000001b6 (GLIBC_2.0) fdopen
+00057fa0 g DF .text 000002da GLIBC_2.1 fdopen
+000668e0 g DF .text 000001b9 GLIBC_2.0 _IO_str_seekoff
+000ce900 g DF .text 0000001d GLIBC_2.0 setusershell
+00142740 g DO .data.rel.ro 00000054 GLIBC_2.2 _IO_wfile_jumps
+0008ea50 g DF .text 000000b0 GLIBC_2.2 readdir64
+0010e940 g DF .text 000000af (GLIBC_2.1) readdir64
+000f9750 g DF .text 00000406 GLIBC_2.0 xdr_callmsg
+000f9e80 g DF .text 00000036 GLIBC_2.0 svcerr_auth
+0002c3e0 g DF .text 0000013e GLIBC_2.0 qsort
+00037d10 w DF .text 0000002b GLIBC_2.0 canonicalize_file_name
+00093700 g DF .text 00000034 GLIBC_2.0 __getpgid
+00016cf0 g DF .text 0000027d GLIBC_2.1 iconv_open
+00064de0 g DF .text 0000002a GLIBC_2.0 _IO_sgetn
+0002fc20 g DF .text 0000003e GLIBC_2.0 __strtod_internal
+0005adc0 g DF .text 0000013c GLIBC_2.2 _IO_fsetpos64
+0010d900 g DF .text 0000010e (GLIBC_2.1) _IO_fsetpos64
+000391c0 w DF .text 00000042 GLIBC_2.3 strfmon_l
+0002de60 g DF .text 00000034 GLIBC_2.0 mrand48
+000c1520 g DF .text 00000013 GLIBC_2.2 posix_spawnattr_getflags
+000d39a0 w DF .text 0000006c GLIBC_2.0 accept
+0002d590 g DF .text 00000046 GLIBC_2.0 wcstombs
+0006ce00 g DF .text 000001e5 GLIBC_2.0 __libc_free
+000e9b50 g DF .text 000001ab GLIBC_2.0 gethostbyname2
+000fee80 g DF .text 00000197 GLIBC_2.1 cbc_crypt
+000e5a00 g DF .text 0000008c GLIBC_2.0 __nss_hosts_lookup
+0002fb70 w DF .text 00000030 GLIBC_2.1 __strtoull_l
+00100a20 g DF .text 0000003a GLIBC_2.1 xdr_netnamestr
+00066aa0 g DF .text 00000189 GLIBC_2.0 _IO_str_overflow
+00144108 w DO .bss 00000004 GLIBC_2.0 __after_morecore_hook
+000de250 w DF .text 00000d40 GLIBC_2.1 argp_parse
+0005a520 g DF .text 00000141 GLIBC_2.0 _IO_seekpos
+00072bf0 g DF .text 000000a2 GLIBC_2.0 envz_get
+00071a00 g DF .text 00000151 GLIBC_2.1 __strcasestr
+00093840 w DF .text 00000053 GLIBC_2.0 getresuid
+000c1ce0 g DF .text 0000003a GLIBC_2.2 posix_spawnattr_setsigmask
+000dfdf0 g DF .text 00000096 GLIBC_2.0 hstrerror
+000cf060 g DF .text 0000059d GLIBC_2.4 __vsyslog_chk
+000d34e0 g DF .text 0000003a GLIBC_2.4 inotify_add_watch
+0010cec0 g DF .text 000001a5 (GLIBC_2.0) _IO_proc_close
+000ca5e0 w DF .text 000000d6 GLIBC_2.0 tcgetattr
+00023cb0 g DF .text 0000000b GLIBC_2.0 toascii
+00059b70 g DF .text 000001a5 GLIBC_2.1 _IO_proc_close
+000c27b0 w DF .text 0000012b GLIBC_2.1 statfs64
+000f5040 g DF .text 00000081 GLIBC_2.0 authnone_create
+00075000 g DF .text 0000003f GLIBC_2.1.1 __strcmp_gg
+00023e70 w DF .text 00000017 GLIBC_2.3 isupper_l
+000cbfd0 g DF .text 000000a5 GLIBC_2.0 sethostid
+00108f80 g DF .text 00000023 GLIBC_2.1 getutxline
+000560d0 g DF .text 000000a2 GLIBC_2.1 tmpfile64
+00092400 w DF .text 0000026a GLIBC_2.0 sleep
+00091e80 w DF .text 00000034 GLIBC_2.0 times
+00063840 g DF .text 000000dd GLIBC_2.1 _IO_file_sync
+0010e5f0 g DF .text 00000097 (GLIBC_2.0) _IO_file_sync
+0007fef0 g DF .text 0000003e GLIBC_2.0 wcsxfrm
+000751b0 g DF .text 00000046 GLIBC_2.1.1 __strcspn_g
+00073ef0 w DF .text 00000d51 GLIBC_2.3 strxfrm_l
+0002b1d0 g DF .text 0000004f GLIBC_2.1 __libc_allocate_rtsig
+000e89c0 g DF .text 00000049 GLIBC_2.4 __wcrtomb_chk
+00023f60 g DF .text 0000003c GLIBC_2.3 __ctype_toupper_loc
+000d2be0 g DF .text 00000038 GLIBC_2.3.4 vm86
+000d3070 g DF .text 00000034 (GLIBC_2.0) vm86
+000cdd00 g DF .text 0000002f GLIBC_2.0 insque
+000f6500 g DF .text 00000126 GLIBC_2.0 clntraw_create
+000d33b0 g DF .text 00000094 GLIBC_2.6 epoll_pwait
+000cb800 g DF .text 00000026 GLIBC_2.0 __getpagesize
+000e6a20 g DF .text 00000078 GLIBC_2.3.4 __strcpy_chk
+0006ae90 w DF .text 000000fc GLIBC_2.0 valloc
+00023f20 g DF .text 0000003c GLIBC_2.3 __ctype_tolower_loc
+00108f10 g DF .text 00000017 GLIBC_2.1 getutxent
+00065900 g DF .text 00000045 GLIBC_2.2 _IO_list_unlock
+00143334 g DO .data 00000004 GLIBC_2.0 obstack_alloc_failed_handler
+0005b6f0 g DF .text 0000007c GLIBC_2.2 fputws_unlocked
+000fcd00 g DF .text 0000015c GLIBC_2.0 xdr_array
+000d2990 g DF .text 0000003a GLIBC_2.3 llistxattr
+0002d070 g DF .text 00000175 GLIBC_2.1.3 __cxa_finalize
+0002b190 g DF .text 00000016 GLIBC_2.1 __libc_current_sigrtmin
+000d2e80 w DF .text 00000038 GLIBC_2.1 umount2
+000cf790 g DF .text 0000004b GLIBC_2.0 syscall
+0002a5a0 g DF .text 00000041 GLIBC_2.0 sigpending
+0002bbf0 g DF .text 0000006c GLIBC_2.0 bsearch
+00075290 g DF .text 00000032 GLIBC_2.1.1 __strpbrk_cg
+000b78d0 g DF .text 00000044 GLIBC_2.0 freeaddrinfo
+000713a0 w DF .text 00000069 GLIBC_2.3 strncasecmp_l
+000236a0 g DF .text 00000181 GLIBC_2.0 __assert_perror_fail
+000d2340 w DF .text 000001a0 GLIBC_2.0 get_nprocs
+00111930 g DF .text 0000005f (GLIBC_2.0) getprotobyname_r
+00075cd0 g DF .text 000000b0 GLIBC_2.3.4 __xpg_strerror_r
+0005a7d0 w DF .text 00000189 GLIBC_2.0 setvbuf
+000eb7d0 g DF .text 0000017d GLIBC_2.1.2 getprotobyname_r
+00080fb0 g DF .text 00000955 GLIBC_2.1 __wcsxfrm_l
+0005ab10 w DF .text 0000009b GLIBC_2.0 vsscanf
+00111370 g DF .text 0000006c (GLIBC_2.0) gethostbyaddr_r
+000e9670 g DF .text 0000030c GLIBC_2.1.2 gethostbyaddr_r
+00016890 g DF .text 00000179 (GLIBC_2.0) __divdi3
+00090ad0 g DF .text 0000018e GLIBC_2.0 fgetpwent
+000f1170 g DF .text 000000a7 GLIBC_2.0 setaliasent
+0002a640 g DF .text 000000a7 GLIBC_2.1.3 __sigsuspend
+000f9530 g DF .text 0000007f GLIBC_2.0 xdr_rejected_reply
+000d31b0 g DF .text 00000038 GLIBC_2.1 capget
+0010ea10 g DF .text 00000110 (GLIBC_2.1) readdir64_r
+0008eb20 g DF .text 00000110 GLIBC_2.2 readdir64_r
+000b7550 g DF .text 0000003a GLIBC_2.0 __sched_setscheduler
+000fe250 g DF .text 000000fc GLIBC_2.0 getpublickey
+000f9c90 g DF .text 00000039 GLIBC_2.2.3 __rpc_thread_svc_pollfd
+000c7540 g DF .text 00000551 GLIBC_2.0 fts_open
+000fa030 g DF .text 0000007e GLIBC_2.0 svc_unregister
+00106ae0 w DF .text 00000062 GLIBC_2.0 pututline
+00093810 w DF .text 0000002c GLIBC_2.0 setsid
+00000004 g D .tdata 00000004 GLIBC_PRIVATE __resp
+00106970 w DF .text 0000005e GLIBC_2.0 getutent
+000c14a0 g DF .text 00000037 GLIBC_2.2 posix_spawnattr_getsigdefault
+000d6db0 w DF .text 00000092 GLIBC_2.3 iswgraph_l
+00045bf0 g DF .text 00000902 GLIBC_2.1 printf_size
+000df110 g DF .text 0000003c GLIBC_2.0 pthread_attr_destroy
+0007feb0 w DF .text 00000037 GLIBC_2.0 wcscoll
+00077bf0 g DF .text 00000045 GLIBC_2.0 __wcstoul_internal
+0010a5d0 g DF .text 00000031 GLIBC_2.0 __deregister_frame
+0002a360 w DF .text 00000157 GLIBC_2.0 __sigaction
+00103630 g DF .text 000000bb GLIBC_2.1.1 xdr_uint64_t
+00103130 g DF .text 00000274 GLIBC_2.1 svcunix_create
+0002e090 w DF .text 00000058 GLIBC_2.0 nrand48_r
+000ca310 g DF .text 00000076 GLIBC_2.0 cfsetspeed
+000d8030 g DF .text 000003cc GLIBC_PRIVATE _nss_files_parse_spent
+00112c00 g DF __libc_freeres_fn 0000007b GLIBC_2.1 __libc_freeres
+000c3c00 w DF .text 000000b7 GLIBC_2.0 fcntl
+000e8010 g DF .text 0000003b GLIBC_2.4 __wcpncpy_chk
+000d6730 w DF .text 0000009e GLIBC_2.0 wctype
+00076340 g DF .text 0000004f GLIBC_2.0 wcsspn
+00110e20 g DF .text 0000008e (GLIBC_2.1) getrlimit64
+000caa50 g DF .text 0000008e GLIBC_2.2 getrlimit64
+000f37f0 g DF .text 00000039 GLIBC_2.3.3 inet6_option_init
+000d71b0 g DF .text 0000006e GLIBC_2.1 __iswctype_l
+000cfd20 g DF .text 00000055 GLIBC_2.0 ecvt
+000e7d90 g DF .text 0000002e GLIBC_2.4 __wmemmove_chk
+000e6d20 g DF .text 00000032 GLIBC_2.3.4 __sprintf_chk
+000eea00 g DF .text 0000001b GLIBC_2.0 rresvport
+000f5860 g DF .text 000001b4 GLIBC_2.0 bindresvport
+000ca240 g DF .text 00000051 GLIBC_2.0 cfsetospeed
+000465f0 g DF .text 00000034 GLIBC_2.1 __asprintf
+00071350 g DF .text 0000004f GLIBC_2.1 __strcasecmp_l
+0005f250 g DF .text 000000f7 GLIBC_2.2 fwide
+0010eea0 g DF .text 0000005f (GLIBC_2.0) getgrgid_r
+000901a0 g DF .text 000001ec GLIBC_2.1.2 getgrgid_r
+000df5f0 g DF .text 00000043 GLIBC_2.3.2 pthread_cond_init
+001111f0 g DF .text 00000043 (GLIBC_2.0) pthread_cond_init
+000937b0 g DF .text 0000001c GLIBC_2.0 setpgrp
+00075fc0 g DF .text 0000005b GLIBC_2.0 wcsdup
+000ca220 g DF .text 00000018 GLIBC_2.0 cfgetispeed
+0002b920 g DF .text 0000002b GLIBC_2.0 atoll
+0002a060 w DF .text 000000cf GLIBC_2.0 bsd_signal
+00108b00 w DF .text 0000039c GLIBC_2.1 ptsname_r
+0002ea30 w DF .text 00000030 GLIBC_2.1 __strtol_l
+000d2880 g DF .text 00000046 GLIBC_2.3 fsetxattr
+000e94c0 g DF .text 0000001d GLIBC_2.0 __h_errno_location
+000fd360 g DF .text 00000162 GLIBC_2.0 xdrrec_create
+0010dde0 g DF .text 000003de (GLIBC_2.0) _IO_file_seekoff
+00056ed0 g DF .text 00000069 GLIBC_2.0 _IO_ftrylockfile
+000632e0 g DF .text 0000055b GLIBC_2.1 _IO_file_seekoff
+000c3610 w DF .text 00000065 GLIBC_2.0 __close
+00065890 g DF .text 0000000b GLIBC_2.2 _IO_iter_next
+000ccec0 w DF .text 000008d5 GLIBC_2.0 getmntent_r
+000750d0 g DF .text 0000001b GLIBC_2.1.1 __strchrnul_c
+0002d210 g DF .text 00000011 GLIBC_2.0 labs
+001430c8 g DO .data 00000004 GLIBC_2.0 obstack_exit_failure
+000c4bd0 w DF .text 00000038 GLIBC_2.0 link
+00088f70 g DF .text 0000215c GLIBC_2.3 __strftime_l
+001008e0 g DF .text 00000068 GLIBC_2.0 xdr_cryptkeyres
+000cd990 g DF .text 00000167 GLIBC_2.4 futimesat
+0005cc20 g DF .text 000000f1 GLIBC_2.2 _IO_wdefault_xsgetn
+000f0910 g DF .text 00000399 GLIBC_2.0 innetgr
+001435f8 g DO .data 00000004 GLIBC_2.0 _IO_list_all
+000c33c0 w DF .text 00000089 GLIBC_2.4 openat
+0005c1c0 w DF .text 000000f7 GLIBC_2.2 vswprintf
+000d6be0 g DF .text 00000090 GLIBC_2.1 __iswcntrl_l
+000604b0 w DF .text 000000dd GLIBC_2.0 vdprintf
+000e7a30 g DF .text 00000049 GLIBC_2.4 __pread64_chk
+000750f0 g DF .text 0000001d GLIBC_2.1.1 __strchrnul_g
+000f7430 g DF .text 00000046 GLIBC_2.0 clntudp_create
+000eb680 g DF .text 0000012d GLIBC_2.0 getprotobyname
+0010a610 g DF .text 000000ea GCC_3.0 __deregister_frame_info_bases
+000596e0 g DF .text 000001a4 GLIBC_2.1 _IO_getline_info
+00023eb0 w DF .text 00000011 GLIBC_2.3 tolower_l
+00061460 g DF .text 00000038 GLIBC_2.2 __fsetlocking
+00088e80 w DF .text 00000044 GLIBC_2.3.2 strptime_l
+00072130 w DF .text 000000d8 GLIBC_2.0 argz_create_sep
+001433f8 g DO .data 00000004 (GLIBC_2.0) __ctype32_b
+000c1f90 g DF .text 0000008e GLIBC_2.0 __xstat
+000800b0 w DF .text 00000ef3 GLIBC_2.3 wcscoll_l
+000e6100 g DF .text 00000160 GLIBC_2.1 __backtrace
+000d30b0 g DF .text 00000038 (GLIBC_2.0) getrlimit
+000ca9d0 g DF .text 0000003f GLIBC_2.2 getrlimit
+0002a860 w DF .text 00000063 GLIBC_2.0 sigsetmask
+00100470 g DF .text 00000073 GLIBC_2.1 key_encryptsession
+00023a20 g DF .text 00000048 GLIBC_2.0 isdigit
+00055cc0 g DF .text 00000041 GLIBC_2.0 scanf
+000d28d0 g DF .text 00000040 GLIBC_2.3 getxattr
+000c2d30 g DF .text 00000022 GLIBC_2.3.2 lchmod
+000239d0 g DF .text 00000046 GLIBC_2.0 iscntrl
+000d43c0 g DF .text 000000c5 GLIBC_PRIVATE __libc_msgrcv
+000cb830 w DF .text 00000039 GLIBC_2.0 getdtablesize
+000d35d0 w DF .text 00000046 GLIBC_2.0 mount
+0012d500 g DO .rodata 00000004 GLIBC_2.4 sys_nerr
+0012d50c g DO .rodata 00000004 (GLIBC_2.3) sys_nerr
+0012d508 g DO .rodata 00000004 (GLIBC_2.1) sys_nerr
+0012d504 g DO .rodata 00000004 (GLIBC_2.0) sys_nerr
+00023ed0 g DF .text 00000011 GLIBC_2.1 __toupper_l
+0002d9f0 w DF .text 000000b7 GLIBC_2.0 random_r
+000d64c0 w DF .text 000000c9 GLIBC_2.0 iswpunct
+000d1c30 g DF .text 00000026 GLIBC_2.0 errx
+00071350 w DF .text 0000004f GLIBC_2.3 strcasecmp_l
+00076550 g DF .text 00000073 GLIBC_2.0 wmemchr
+00091e40 w DF .text 00000034 GLIBC_2.0 uname
+00070ee0 g DF .text 0000008f GLIBC_2.0 memmove
+00100270 g DF .text 0000005a GLIBC_2.1 key_setnet
+00063150 g DF .text 00000097 GLIBC_2.1 _IO_file_write
+0010dd70 g DF .text 0000006d (GLIBC_2.0) _IO_file_write
+00146514 g DO .bss 00000004 GLIBC_2.2 svc_max_pollfd
+00077e10 w DF .text 0000003f GLIBC_2.0 wcstod
+00146238 g DO .bss 00000004 GLIBC_2.0 _nl_msg_cat_cntr
+000e7500 g DF .text 00000046 GLIBC_2.3.4 __chk_fail
+000f9fa0 g DF .text 00000082 GLIBC_2.0 svc_getreqset
+000d5c60 w DF .text 00000013 GLIBC_2.0 mcount
+0006df50 g DF .text 00000099 GLIBC_2.0 mprobe
+000c15e0 g DF .text 00000050 GLIBC_2.2 posix_spawnp
+00077f10 w DF .text 0000003f GLIBC_2.0 wcstof
+0010e690 g DF .text 00000153 (GLIBC_2.0) _IO_file_overflow
+000e8b00 g DF .text 00000042 GLIBC_2.4 __wcsrtombs_chk
+000e6260 w DF .text 000002bc GLIBC_2.1 backtrace_symbols
+00063920 g DF .text 000001ef GLIBC_2.1 _IO_file_overflow
+00065950 g DF .text 0000002e GLIBC_2.2 _IO_list_resetlock
+000d3030 g DF .text 0000003a GLIBC_PRIVATE __modify_ldt
+000d4ea0 g DF .text 00000044 GLIBC_2.0 _mcleanup
+000d7220 g DF .text 00000073 GLIBC_2.2 __wctrans_l
+00023e90 w DF .text 00000017 GLIBC_2.3 isxdigit_l
+0002b2f0 w DF .text 00000061 GLIBC_2.1 sigtimedwait
+00059270 g DF .text 0000015f GLIBC_2.0 _IO_fwrite
+000effc0 g DF .text 00000426 GLIBC_2.0 ruserpass
+00076390 g DF .text 0000009b GLIBC_2.0 wcstok
+000df8d0 g DF .text 00000030 GLIBC_2.0 pthread_self
+000fa2e0 g DF .text 000000b9 GLIBC_2.0 svc_register
+00091f70 g DF .text 00000070 GLIBC_2.0 __waitpid
+00077ba0 g DF .text 00000046 GLIBC_2.0 wcstol
+0005ad80 w DF .text 00000032 GLIBC_2.1 fopen64
+000df400 g DF .text 00000043 GLIBC_2.0 pthread_attr_setschedpolicy
+0005c2c0 g DF .text 000000a6 GLIBC_2.2 vswscanf
+00016570 g DF .text 00000031 (GLIBC_2.0) __fixunsxfdi
+000ec1c0 g DF .text 000000b0 GLIBC_2.0 endservent
+000e5b20 g DF .text 0000008c GLIBC_2.0 __nss_group_lookup
+000c0e50 w DF .text 000000bc GLIBC_2.1 pread
+00016610 g DF .text 00000038 (GLIBC_2.0) __ucmpdi2
+0003bf00 g DF .text 00000030 GLIBC_2.0 ctermid
+00077b20 w DF .text 00000024 GLIBC_2.2 wcschrnul
+00109740 g DF .text 00000099 GLIBC_PRIVATE __libc_dlsym
+000c0f10 w DF .text 000000bc GLIBC_2.1 pwrite
+000cce00 g DF .text 0000002c GLIBC_2.2 __endmntent
+00077c90 w DF .text 00000046 GLIBC_2.0 wcstoq
+0002ab50 g DF .text 0000007c GLIBC_2.0 sigstack
+00092a30 g DF .text 00000051 GLIBC_2.1.2 __vfork
+00071970 w DF .text 00000090 GLIBC_2.0 strsep
+00061360 g DF .text 00000013 GLIBC_2.2 __freadable
+000d6b50 w DF .text 00000090 GLIBC_2.3 iswblank_l
+0006f210 g DF .text 000000c9 GLIBC_2.0 _obstack_begin
+000f0f10 g DF .text 000000be GLIBC_2.0 getnetgrent
+000645a0 g DF .text 00000210 GLIBC_2.1 _IO_file_underflow
+0010e1c0 g DF .text 000000e8 (GLIBC_2.0) _IO_file_underflow
+00100e00 g DF .text 000000fb GLIBC_2.1 user2netname
+000e4630 g DF .text 000000b0 GLIBC_2.0 __nss_next
+000770a0 w DF .text 0000035f GLIBC_2.0 wcsrtombs
+00143970 g DO .data 00000004 GLIBC_2.0 __morecore
+00024400 w DF .text 00000015 GLIBC_2.0 bindtextdomain
+000c37a0 w DF .text 00000038 GLIBC_2.0 access
+000b7590 g DF .text 00000034 GLIBC_2.0 __sched_getscheduler
+000397c0 g DF .text 00000495 GLIBC_2.1 fmtmsg
+000d0410 g DF .text 000000c4 GLIBC_2.0 qfcvt
+0002e490 g DF .text 00000045 (GLIBC_2.0) __strtoq_internal
+0008df80 g DF .text 00000056 GLIBC_2.1 ntp_gettime
+0006de70 g DF .text 000000e0 GLIBC_2.2 mcheck_pedantic
+0006e9d0 g DF .text 000001e5 GLIBC_2.0 mtrace
+0005fc60 g DF .text 000000e7 GLIBC_2.0 _IO_getc
+000c23f0 g DF .text 000001dc GLIBC_2.4 __fxstatat
+00071cb0 g DF .text 00000084 GLIBC_2.0 memmem
+0014635c g DO .bss 00000004 GLIBC_2.0 loc1
+00061300 g DF .text 0000002a GLIBC_2.2 __fbufsize
+00065710 g DF .text 0000002f GLIBC_2.0 _IO_marker_delta
+00146360 g DO .bss 00000004 GLIBC_2.0 loc2
+00071d40 w DF .text 000000c6 GLIBC_2.1 rawmemchr
+000cbd50 g DF .text 0000002c GLIBC_2.0 sync
+000d3860 g DF .text 00000034 GLIBC_2.0 sysinfo
+0008f810 g DF .text 000000ae GLIBC_2.2.4 getgrouplist
+00070ec0 w DF .text 0000001e GLIBC_2.0 bcmp
+0005b1d0 w DF .text 0000002a GLIBC_2.2 getwc_unlocked
+0002aa40 w DF .text 00000104 GLIBC_2.0 sigvec
+001430d4 g DO .data 00000004 GLIBC_2.0 opterr
+00071f70 w DF .text 00000074 GLIBC_2.0 argz_append
+000f9f60 g DF .text 00000036 GLIBC_2.0 svc_getreq
+00093600 w DF .text 00000070 GLIBC_2.0 setgid
+00068a60 w DF .text 0000045a GLIBC_2.0 malloc_set_state
+000e69c0 g DF .text 00000057 GLIBC_2.3.4 __strcat_chk
+00072040 g DF .text 00000041 GLIBC_2.0 __argz_count
+0005c030 g DF .text 00000039 GLIBC_2.2 wprintf
+000d86f0 w DF .text 00000079 GLIBC_2.0 ulckpwdf
+000c85f0 g DF .text 00000146 GLIBC_2.0 fts_children
+00111a00 g DF .text 00000066 (GLIBC_2.0) getservbyport_r
+000ebe10 g DF .text 000001fb GLIBC_2.1.2 getservbyport_r
+000c1f00 g DF .text 0000003a GLIBC_2.0 mkfifo
+00070ce0 g DF .text 0000003e GLIBC_2.0 strxfrm
+000c3580 w DF .text 00000089 GLIBC_2.4 openat64
+000b7590 w DF .text 00000034 GLIBC_2.0 sched_getscheduler
+0002ce30 w DF .text 00000051 GLIBC_2.0 on_exit
+000c38e0 g DF .text 000002bb GLIBC_2.4 faccessat
+001465b4 g DO .bss 00000004 GLIBC_2.1 __key_decryptsession_pk_LOCAL
+000e1410 g DF .text 0000000f GLIBC_2.0 __res_randomid
+000602b0 g DF .text 00000032 GLIBC_2.0 setbuf
+00059890 g DF .text 00000180 GLIBC_2.0 _IO_gets
+00061f30 g DF .text 000000a7 GLIBC_2.1 fwrite_unlocked
+0006f9b0 g DF .text 00000054 GLIBC_2.0 strcmp
+00029f60 g DF .text 00000064 GLIBC_PRIVATE __libc_longjmp
+0002e530 g DF .text 00000045 GLIBC_2.0 __strtoull_internal
+000d6f80 w DF .text 00000092 GLIBC_2.3 iswspace_l
+000d3ca0 w DF .text 0000006c GLIBC_2.0 recvmsg
+00023dd0 w DF .text 00000017 GLIBC_2.3 islower_l
+00066240 g DF .text 00000128 GLIBC_2.0 __underflow
+000c10c0 w DF .text 000000ef GLIBC_2.1 pwrite64
+0006fd60 g DF .text 000000b6 GLIBC_2.0 strerror
+000391c0 g DF .text 00000042 GLIBC_2.1 __strfmon_l
+000fca40 g DF .text 0000003a GLIBC_2.0 xdr_wrapstring
+000ca6c0 g DF .text 00000038 GLIBC_2.0 tcgetpgrp
+00015f50 g DF .text 000001b6 GLIBC_2.0 __libc_start_main
+0008ea40 g DF .text 0000000a GLIBC_2.0 dirfd
+0005b1d0 w DF .text 0000002a GLIBC_2.2 fgetwc_unlocked
+00110d50 g DF .text 0000002b (GLIBC_2.1) nftw
+000f96d0 g DF .text 00000022 GLIBC_2.0 xdr_des_block
+000c61a0 g DF .text 00000052 GLIBC_2.3.3 nftw
+000f94a0 g DF .text 0000008c GLIBC_2.0 xdr_callhdr
+000d6e50 w DF .text 00000092 GLIBC_2.3 iswprint_l
+001009b0 g DF .text 0000006c GLIBC_2.0 xdr_cryptkeyarg2
+000913e0 g DF .text 000000a7 GLIBC_2.0 setpwent
+000d4570 g DF .text 00000062 GLIBC_2.0 semop
+000cc420 g DF .text 00000034 GLIBC_2.0 endfsent
+00023e70 g DF .text 00000017 GLIBC_2.1 __isupper_l
+0005c070 g DF .text 00000041 GLIBC_2.2 wscanf
+0005f6a0 w DF .text 0000009a GLIBC_2.0 ferror
+00106a70 w DF .text 00000069 GLIBC_2.0 getutent_r
+000fec10 g DF .text 0000009b GLIBC_2.1 authdes_create
+000c8f00 g DF .text 00000220 GLIBC_2.4 ppoll
+00071170 w DF .text 00000041 GLIBC_2.0 stpcpy
+000df5b0 g DF .text 0000003c GLIBC_2.3.2 pthread_cond_destroy
+00091bf0 w DF .text 00000221 GLIBC_2.0 fgetpwent_r
+00073ef0 g DF .text 00000d51 GLIBC_2.1 __strxfrm_l
+00106940 g DF .text 00000022 GLIBC_2.1 fdetach
+00029710 w DF .text 00000085 GLIBC_2.0 ldexp
+001111b0 g DF .text 0000003c (GLIBC_2.0) pthread_cond_destroy
+000cfcd0 g DF .text 00000050 GLIBC_2.0 gcvt
+00091ec0 w DF .text 000000ac GLIBC_2.0 __wait
+0005bf70 w DF .text 00000034 GLIBC_2.2 fwprintf
+000fcbb0 g DF .text 000000fe GLIBC_2.0 xdr_bytes
+0002cbe0 w DF .text 00000074 GLIBC_2.0 setenv
+00022820 w DF .text 00000067 GLIBC_2.3 nl_langinfo_l
+000cae80 g DF .text 0000003a GLIBC_2.0 setpriority
+000c1310 g DF .text 00000094 GLIBC_2.2 posix_spawn_file_actions_addopen
+00017b30 g DF .text 00000016 GLIBC_PRIVATE __gconv_get_modules_db
+00066080 g DF .text 0000007e GLIBC_2.0 _IO_default_doallocate
+001097e0 g DF .text 00000088 GLIBC_PRIVATE __libc_dlopen_mode
+00058d00 g DF .text 00000118 GLIBC_2.0 _IO_fread
+0008f090 g DF .text 00000192 GLIBC_2.0 fgetgrent
+000e7ac0 g DF .text 00000040 GLIBC_2.4 __recvfrom_chk
+000cb9d0 g DF .text 00000038 GLIBC_2.0 setdomainname
+000c36f0 w DF .text 00000070 GLIBC_2.0 write
+000ebcb0 g DF .text 0000013d GLIBC_2.0 getservbyport
+000f2380 g DF .text 00000048 GLIBC_2.1 if_freenameindex
+00034930 w DF .text 00000029 GLIBC_2.3 strtod_l
+000eaae0 g DF .text 000000ab GLIBC_2.0 getnetent
+00106f60 w DF .text 00000068 GLIBC_2.0 getutline_r
+00076020 w DF .text 00000054 GLIBC_2.0 wcslen
+000c91a0 g DF .text 000001ae GLIBC_2.2 posix_fallocate
+000c3fc0 g DF .text 00000034 GLIBC_2.0 __pipe
+000d8770 w DF .text 0000038b GLIBC_2.0 lckpwdf
+000fdb00 g DF .text 000000aa GLIBC_2.0 xdrrec_endofrecord
+00060af0 g DF .text 000000fa GLIBC_2.1 fseeko
+000d72a0 w DF .text 0000005d GLIBC_2.3 towctrans_l
+0006fa10 g DF .text 00000037 GLIBC_2.0 strcoll
+000f44a0 g DF .text 00000048 GLIBC_2.5 inet6_opt_set_val
+0002a060 w DF .text 000000cf GLIBC_2.0 ssignal
+0003d040 g DF .text 000043ec GLIBC_2.0 vfprintf
+0002d680 w DF .text 00000067 GLIBC_2.0 random
+00094d50 g DF .text 0000006a GLIBC_2.0 globfree
+000d3270 g DF .text 0000003a GLIBC_2.0 delete_module
+00077e50 g DF .text 0000003e GLIBC_2.0 __wcstold_internal
+000dd050 w DF .text 000000af GLIBC_2.1 argp_state_help
+00141580 g DO .data.rel.ro 00000100 (GLIBC_2.1) _sys_siglist
+00141580 g DO .data.rel.ro 00000104 GLIBC_2.3.3 _sys_siglist
+00072e20 g DF .text 0000002b GLIBC_2.0 basename
+00141580 g DO .data.rel.ro 00000080 (GLIBC_2.0) _sys_siglist
+000e8f40 w DF .text 00000007 GLIBC_2.0 ntohl
+00093780 g DF .text 00000008 GLIBC_2.0 getpgrp
+000b7430 g DF .text 00000047 GLIBC_2.0 getopt_long_only
+000cf690 g DF .text 000000a2 GLIBC_2.0 closelog
+00076130 g DF .text 000000d2 GLIBC_2.0 wcsncmp
+000b5ae0 w DF .text 0000004d GLIBC_2.0 re_exec
+00023cc0 g DF .text 00000011 GLIBC_2.0 isascii
+000d2340 w DF .text 000001a0 GLIBC_2.0 get_nprocs_conf
+000f5fa0 g DF .text 0000003d GLIBC_2.0 clnt_pcreateerror
+000e7c70 g DF .text 0000003b GLIBC_2.4 __ptsname_r_chk
+000d4ef0 w DF .text 000001a0 GLIBC_2.0 monstartup
+000c3c00 w DF .text 000000b7 GLIBC_2.0 __fcntl
+000e8f50 w DF .text 0000000e GLIBC_2.0 ntohs
+00046570 w DF .text 0000003b GLIBC_2.0 snprintf
+00066460 g DF .text 00000066 GLIBC_2.0 __overflow
+0002e3f0 g DF .text 00000045 GLIBC_2.0 __strtoul_internal
+000766b0 w DF .text 00000024 GLIBC_2.0 wmemmove
+000c9170 g DF .text 00000030 GLIBC_2.3.3 posix_fadvise64
+00110db0 g DF .text 00000024 (GLIBC_2.2) posix_fadvise64
+00100950 g DF .text 00000057 GLIBC_2.0 xdr_cryptkeyarg
+00094670 w DF .text 0000041d GLIBC_2.0 sysconf
+000e7330 g DF .text 000001ab GLIBC_2.3.4 __gets_chk
+0006f610 g DF .text 00000078 GLIBC_2.0 _obstack_free
+000d2fc0 g DF .text 00000068 GLIBC_2.3.3 gnu_dev_makedev
+000fc580 g DF .text 000000ea GLIBC_2.1.1 xdr_u_hyper
+000f0850 g DF .text 000000bb GLIBC_2.0 setnetgrent
+000c22a0 g DF .text 0000014d GLIBC_2.4 __xmknodat
+000165e0 g DF .text 00000023 (GLIBC_2.0) __fixunsdfdi
+0010cb50 g DF .text 000001b6 (GLIBC_2.0) _IO_fdopen
+00057fa0 g DF .text 000002da GLIBC_2.1 _IO_fdopen
+000f38e0 g DF .text 000000d6 GLIBC_2.3.3 inet6_option_find
+000791a0 w DF .text 00000040 GLIBC_2.3 wcstoull_l
+000f6d20 g DF .text 000002a9 GLIBC_2.0 clnttcp_create
+00023df0 w DF .text 00000017 GLIBC_2.3 isgraph_l
+000ec010 g DF .text 000000a2 GLIBC_2.0 getservent
+000e88e0 g DF .text 0000003b GLIBC_2.4 __ttyname_r_chk
+0002d5e0 g DF .text 00000093 GLIBC_2.0 wctomb
+00146364 g DO .bss 00000004 GLIBC_2.0 locs
+00062090 g DF .text 00000099 GLIBC_2.1 fputs_unlocked
+0002af90 g DF .text 00000024 GLIBC_2.0 siggetmask
+00143330 w DO .data 00000004 GLIBC_2.0 __memalign_hook
+00090d60 g DF .text 00000177 GLIBC_2.0 putpwent
+0005bdb0 g DF .text 0000004f GLIBC_2.2 putwchar_unlocked
+00075ac0 g DF .text 00000073 GLIBC_2.1.1 __strncpy_by2
+000d45e0 g DF .text 00000062 GLIBC_2.0 semget
+00066ce0 g DF .text 0000004c GLIBC_2.0 _IO_str_init_readonly
+00075b40 g DF .text 0000006b GLIBC_2.1.1 __strncpy_by4
+0002dbc0 w DF .text 00000116 GLIBC_2.0 initstate_r
+000f95b0 g DF .text 0000008f GLIBC_2.0 xdr_accepted_reply
+0005ab10 w DF .text 0000009b GLIBC_2.0 __vsscanf
+0006ce00 g DF .text 000001e5 GLIBC_2.0 free
+00076430 g DF .text 0000011e GLIBC_2.0 wcsstr
+00076310 g DF .text 00000028 GLIBC_2.0 wcsrchr
+00023b60 g DF .text 00000046 GLIBC_2.0 ispunct
+00062390 g DF .text 0000003b GLIBC_2.0 _IO_file_seek
+001447c0 g DO .bss 00000004 GLIBC_2.0 __daylight
+000e6740 g DF .text 00000005 GLIBC_2.2 __cyg_profile_func_exit
+000df270 g DF .text 00000043 GLIBC_2.0 pthread_attr_getinheritsched
+000e7b60 g DF .text 00000032 GLIBC_2.5 __readlinkat_chk
+001003f0 g DF .text 00000073 GLIBC_2.1 key_decryptsession
+000d1960 g DF .text 00000137 GLIBC_2.0 vwarn
+00076730 w DF .text 00000038 GLIBC_2.0 wcpcpy
+
+
diff --git a/scripts/t/Dpkg_Shlibs/objdump.ls b/scripts/t/Dpkg_Shlibs/objdump.ls
new file mode 100644
index 0000000..30ae8be
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.ls
@@ -0,0 +1,536 @@
+
+/bin/ls: file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x00003e16
+
+Program Header:
+ PHDR off 0x00000034 vaddr 0x00000034 paddr 0x00000034 align 2**2
+ filesz 0x00000120 memsz 0x00000120 flags r-x
+ INTERP off 0x00000154 vaddr 0x00000154 paddr 0x00000154 align 2**0
+ filesz 0x00000013 memsz 0x00000013 flags r--
+ LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
+ filesz 0x00021f10 memsz 0x00021f10 flags r-x
+ LOAD off 0x000229b8 vaddr 0x000239b8 paddr 0x000239b8 align 2**12
+ filesz 0x0000098c memsz 0x00001b1c flags rw-
+ DYNAMIC off 0x00022eac vaddr 0x00023eac paddr 0x00023eac align 2**2
+ filesz 0x000000f8 memsz 0x000000f8 flags rw-
+ NOTE off 0x00000168 vaddr 0x00000168 paddr 0x00000168 align 2**2
+ filesz 0x00000044 memsz 0x00000044 flags r--
+EH_FRAME off 0x0001b5b8 vaddr 0x0001b5b8 paddr 0x0001b5b8 align 2**2
+ filesz 0x000008cc memsz 0x000008cc flags r--
+ STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
+ filesz 0x00000000 memsz 0x00000000 flags rw-
+ RELRO off 0x000229b8 vaddr 0x000239b8 paddr 0x000239b8 align 2**0
+ filesz 0x00000648 memsz 0x00000648 flags r--
+
+Dynamic Section:
+ NEEDED libselinux.so.1
+ NEEDED libc.so.6
+ INIT 0x00001ce8
+ FINI 0x00016524
+ INIT_ARRAY 0x000239b8
+ INIT_ARRAYSZ 0x00000004
+ FINI_ARRAY 0x000239bc
+ FINI_ARRAYSZ 0x00000004
+ GNU_HASH 0x000001ac
+ STRTAB 0x00000adc
+ SYMTAB 0x0000020c
+ STRSZ 0x00000638
+ SYMENT 0x00000010
+ DEBUG 0x00000000
+ PLTGOT 0x00024000
+ PLTRELSZ 0x00000388
+ PLTREL 0x00000011
+ JMPREL 0x00001960
+ REL 0x000012d0
+ RELSZ 0x00000690
+ RELENT 0x00000008
+ FLAGS_1 0x08000000
+ VERNEED 0x00001230
+ VERNEEDNUM 0x00000001
+ VERSYM 0x00001114
+ RELCOUNT 0x000000c6
+
+Version References:
+ required from libc.so.6:
+ 0x0d696912 0x00 10 GLIBC_2.2
+ 0x09691f73 0x00 09 GLIBC_2.1.3
+ 0x09691a73 0x00 08 GLIBC_2.2.3
+ 0x0d696914 0x00 07 GLIBC_2.4
+ 0x06969197 0x00 06 GLIBC_2.17
+ 0x0d696911 0x00 05 GLIBC_2.1
+ 0x09691974 0x00 04 GLIBC_2.3.4
+ 0x0d696910 0x00 03 GLIBC_2.0
+ 0x0d696913 0x00 02 GLIBC_2.3
+
+DYNAMIC SYMBOL TABLE:
+00000000 DF *UND* 00000000 GLIBC_2.3 __ctype_toupper_loc
+00000000 DF *UND* 00000000 GLIBC_2.0 unsetenv
+00000000 DF *UND* 00000000 GLIBC_2.0 getpwnam
+00000000 DF *UND* 00000000 GLIBC_2.0 raise
+00000000 DF *UND* 00000000 GLIBC_2.3.4 __snprintf_chk
+00000000 DO *UND* 00000000 GLIBC_2.0 __progname
+00000000 DF *UND* 00000000 GLIBC_2.0 strcmp
+00000000 DF *UND* 00000000 GLIBC_2.1 open64
+00000000 w D *UND* 00000000 _ITM_deregisterTMCloneTable
+00000000 DF *UND* 00000000 GLIBC_2.0 getpwuid
+00000000 DF *UND* 00000000 GLIBC_2.0 fflush
+00000000 DO *UND* 00000000 GLIBC_2.0 stderr
+00000000 DF *UND* 00000000 GLIBC_2.0 _exit
+00000000 DF *UND* 00000000 GLIBC_2.0 sigprocmask
+00000000 DF *UND* 00000000 GLIBC_2.0 dirfd
+00000000 DF *UND* 00000000 GLIBC_2.0 wcwidth
+00000000 DF *UND* 00000000 GLIBC_2.0 memmove
+00000000 DF *UND* 00000000 GLIBC_2.0 _setjmp
+00000000 DF *UND* 00000000 GLIBC_2.0 free
+00000000 DF *UND* 00000000 GLIBC_2.0 memcpy
+00000000 DF *UND* 00000000 GLIBC_2.0 mbsinit
+00000000 DF *UND* 00000000 GLIBC_2.17 clock_gettime
+00000000 DF *UND* 00000000 GLIBC_2.0 __strtoull_internal
+00000000 DF *UND* 00000000 GLIBC_2.1 fclose
+00000000 DF *UND* 00000000 GLIBC_2.1 fseeko64
+00000000 DF *UND* 00000000 GLIBC_2.0 signal
+00000000 DF *UND* 00000000 GLIBC_2.0 memcmp
+00000000 DF *UND* 00000000 GLIBC_2.0 gettimeofday
+00000000 DO *UND* 00000000 GLIBC_2.0 __progname_full
+00000000 DO *UND* 00000000 GLIBC_2.0 optind
+00000000 DF *UND* 00000000 GLIBC_2.0 dcgettext
+00000000 DF *UND* 00000000 GLIBC_2.0 mktime
+00000000 DF *UND* 00000000 GLIBC_2.4 __stack_chk_fail
+00000000 DF *UND* 00000000 GLIBC_2.0 localtime_r
+00000000 DF *UND* 00000000 GLIBC_2.0 sigismember
+00000000 DF *UND* 00000000 fgetfilecon
+00000000 DF *UND* 00000000 GLIBC_2.0 fflush_unlocked
+00000000 DF *UND* 00000000 GLIBC_2.0 iswcntrl
+00000000 DF *UND* 00000000 GLIBC_2.0 textdomain
+00000000 DF *UND* 00000000 GLIBC_2.0 readlink
+00000000 DF *UND* 00000000 GLIBC_2.2.3 fnmatch
+00000000 DF *UND* 00000000 GLIBC_2.0 iswprint
+00000000 DF *UND* 00000000 GLIBC_2.0 ioctl
+00000000 w DF *UND* 00000000 GLIBC_2.1.3 __cxa_finalize
+00000000 DF *UND* 00000000 GLIBC_2.0 fwrite
+00000000 DF *UND* 00000000 GLIBC_2.2 __fxstat64
+00000000 DF *UND* 00000000 GLIBC_2.0 tzset
+00000000 DF *UND* 00000000 GLIBC_2.0 __ctype_get_mb_cur_max
+00000000 DF *UND* 00000000 GLIBC_2.0 strcpy
+00000000 DF *UND* 00000000 GLIBC_2.2 __fpending
+00000000 DF *UND* 00000000 GLIBC_2.0 wcstombs
+00000000 DF *UND* 00000000 GLIBC_2.0 mbrtowc
+00000000 DF *UND* 00000000 GLIBC_2.0 gethostname
+00000000 DF *UND* 00000000 GLIBC_2.1.3 __cxa_atexit
+00000000 DF *UND* 00000000 GLIBC_2.0 error
+00000000 DF *UND* 00000000 GLIBC_2.0 strcoll
+00000000 DF *UND* 00000000 GLIBC_2.0 getenv
+00000000 DF *UND* 00000000 GLIBC_2.0 realloc
+00000000 DF *UND* 00000000 lgetfilecon
+00000000 DF *UND* 00000000 GLIBC_2.0 malloc
+00000000 DF *UND* 00000000 GLIBC_2.0 timegm
+00000000 DF *UND* 00000000 GLIBC_2.2 __freading
+00000000 DF *UND* 00000000 GLIBC_2.3.4 __memcpy_chk
+00000000 w D *UND* 00000000 __gmon_start__
+00000000 DF *UND* 00000000 GLIBC_2.0 exit
+00000000 DF *UND* 00000000 GLIBC_2.1 fdopen
+00000000 DF *UND* 00000000 GLIBC_2.1 fputs_unlocked
+00000000 DF *UND* 00000000 GLIBC_2.0 strftime
+00000000 DF *UND* 00000000 GLIBC_2.0 getopt_long
+00000000 DF *UND* 00000000 getfilecon
+00000000 DF *UND* 00000000 GLIBC_2.0 strtoul
+00000000 DF *UND* 00000000 GLIBC_2.0 strchr
+00000000 DF *UND* 00000000 GLIBC_2.0 getcwd
+00000000 DF *UND* 00000000 GLIBC_2.0 fscanf
+00000000 DF *UND* 00000000 GLIBC_2.0 strlen
+00000000 DF *UND* 00000000 GLIBC_2.0 setenv
+00000000 DF *UND* 00000000 GLIBC_2.0 __libc_start_main
+00000000 DF *UND* 00000000 GLIBC_2.0 sigaddset
+00000000 DF *UND* 00000000 GLIBC_2.0 memset
+00000000 DF *UND* 00000000 GLIBC_2.0 ungetc
+00000000 DF *UND* 00000000 GLIBC_2.0 snprintf
+00000000 DF *UND* 00000000 GLIBC_2.0 __errno_location
+00000000 DF *UND* 00000000 GLIBC_2.0 tcgetpgrp
+00000000 DF *UND* 00000000 GLIBC_2.0 fileno
+00000000 DF *UND* 00000000 GLIBC_2.0 stpncpy
+00000000 DO *UND* 00000000 GLIBC_2.0 stdout
+00000000 DF *UND* 00000000 GLIBC_2.1 fwrite_unlocked
+00000000 DF *UND* 00000000 GLIBC_2.3.4 __printf_chk
+00000000 DF *UND* 00000000 GLIBC_2.1 mempcpy
+00000000 DF *UND* 00000000 GLIBC_2.0 wcswidth
+00000000 DF *UND* 00000000 GLIBC_2.0 sigemptyset
+00000000 DF *UND* 00000000 GLIBC_2.0 __uflow
+00000000 DO *UND* 00000000 GLIBC_2.0 program_invocation_name
+00000000 DF *UND* 00000000 GLIBC_2.1 __rawmemchr
+00000000 DF *UND* 00000000 GLIBC_2.0 nl_langinfo
+00000000 DF *UND* 00000000 GLIBC_2.0 setlocale
+00000000 DF *UND* 00000000 GLIBC_2.0 strrchr
+00000000 DF *UND* 00000000 GLIBC_2.0 __overflow
+00000000 DF *UND* 00000000 GLIBC_2.0 mbstowcs
+00000000 DF *UND* 00000000 GLIBC_2.0 gmtime_r
+00000000 DF *UND* 00000000 GLIBC_2.2 localeconv
+00000000 DF *UND* 00000000 GLIBC_2.3 getxattr
+00000000 DF *UND* 00000000 freecon
+00000000 DF *UND* 00000000 GLIBC_2.1 lseek64
+00000000 DF *UND* 00000000 GLIBC_2.2 readdir64
+00000000 DO *UND* 00000000 GLIBC_2.0 program_invocation_short_name
+00000000 DF *UND* 00000000 GLIBC_2.3.4 __fprintf_chk
+00000000 DF *UND* 00000000 GLIBC_2.0 sigaction
+00000000 DF *UND* 00000000 GLIBC_2.0 bindtextdomain
+00000000 w D *UND* 00000000 _ITM_registerTMCloneTable
+00000000 DF *UND* 00000000 GLIBC_2.0 strncmp
+00000000 DF *UND* 00000000 GLIBC_2.0 isatty
+00000000 DF *UND* 00000000 GLIBC_2.0 abort
+00000000 DF *UND* 00000000 GLIBC_2.2 __xstat64
+00000000 DO *UND* 00000000 GLIBC_2.0 optarg
+00000000 DF *UND* 00000000 GLIBC_2.2 __lxstat64
+00000000 DF *UND* 00000000 GLIBC_2.0 getgrnam
+00000000 DF *UND* 00000000 GLIBC_2.0 close
+00000000 DF *UND* 00000000 GLIBC_2.0 closedir
+00000000 DF *UND* 00000000 GLIBC_2.0 strspn
+00000000 DF *UND* 00000000 GLIBC_2.0 opendir
+00000000 DF *UND* 00000000 GLIBC_2.0 getgrgid
+00000000 DF *UND* 00000000 GLIBC_2.3 __ctype_tolower_loc
+00000000 DF *UND* 00000000 GLIBC_2.0 __assert_fail
+00000000 DF *UND* 00000000 GLIBC_2.3 __ctype_b_loc
+00000000 DF *UND* 00000000 GLIBC_2.0 calloc
+00000000 DF *UND* 00000000 GLIBC_2.3.4 __sprintf_chk
+00024340 g DO .data 00000004 Base obstack_alloc_failed_handler
+00014ed0 g DF .text 000000fb Base _obstack_newchunk
+00024344 g D .data 00000000 Base _edata
+00014ea0 g DF .text 0000002a Base _obstack_begin_1
+00014fd0 g DF .text 00000030 Base _obstack_allocated_p
+000254d4 g D .bss 00000000 Base _end
+00014e70 g DF .text 00000023 Base _obstack_begin
+00016544 g DO .rodata 00000004 Base _IO_stdin_used
+00015080 g DF .text 00000022 Base _obstack_memory_used
+00024344 g D .bss 00000000 Base __bss_start
+00001ce8 g DF .init 00000000 Base _init
+00016524 g DF .fini 00000000 Base _fini
+00015000 g DF .text 00000071 Base _obstack_free
+
+
+DYNAMIC RELOCATION RECORDS
+OFFSET TYPE VALUE
+000239b8 R_386_RELATIVE *ABS*
+000239bc R_386_RELATIVE *ABS*
+000239c0 R_386_RELATIVE *ABS*
+000239c4 R_386_RELATIVE *ABS*
+000239c8 R_386_RELATIVE *ABS*
+000239cc R_386_RELATIVE *ABS*
+000239d0 R_386_RELATIVE *ABS*
+000239d4 R_386_RELATIVE *ABS*
+000239d8 R_386_RELATIVE *ABS*
+000239dc R_386_RELATIVE *ABS*
+000239e0 R_386_RELATIVE *ABS*
+000239e4 R_386_RELATIVE *ABS*
+000239e8 R_386_RELATIVE *ABS*
+000239ec R_386_RELATIVE *ABS*
+000239f0 R_386_RELATIVE *ABS*
+000239f4 R_386_RELATIVE *ABS*
+000239f8 R_386_RELATIVE *ABS*
+000239fc R_386_RELATIVE *ABS*
+00023a00 R_386_RELATIVE *ABS*
+00023a04 R_386_RELATIVE *ABS*
+00023a08 R_386_RELATIVE *ABS*
+00023a0c R_386_RELATIVE *ABS*
+00023a10 R_386_RELATIVE *ABS*
+00023a14 R_386_RELATIVE *ABS*
+00023a18 R_386_RELATIVE *ABS*
+00023a1c R_386_RELATIVE *ABS*
+00023a20 R_386_RELATIVE *ABS*
+00023a24 R_386_RELATIVE *ABS*
+00023a28 R_386_RELATIVE *ABS*
+00023a2c R_386_RELATIVE *ABS*
+00023a40 R_386_RELATIVE *ABS*
+00023a44 R_386_RELATIVE *ABS*
+00023a48 R_386_RELATIVE *ABS*
+00023a4c R_386_RELATIVE *ABS*
+00023a50 R_386_RELATIVE *ABS*
+00023a54 R_386_RELATIVE *ABS*
+00023a58 R_386_RELATIVE *ABS*
+00023a5c R_386_RELATIVE *ABS*
+00023a60 R_386_RELATIVE *ABS*
+00023a64 R_386_RELATIVE *ABS*
+00023a68 R_386_RELATIVE *ABS*
+00023a6c R_386_RELATIVE *ABS*
+00023a70 R_386_RELATIVE *ABS*
+00023a74 R_386_RELATIVE *ABS*
+00023a78 R_386_RELATIVE *ABS*
+00023a7c R_386_RELATIVE *ABS*
+00023a80 R_386_RELATIVE *ABS*
+00023a84 R_386_RELATIVE *ABS*
+00023a88 R_386_RELATIVE *ABS*
+00023a8c R_386_RELATIVE *ABS*
+00023a90 R_386_RELATIVE *ABS*
+00023a94 R_386_RELATIVE *ABS*
+00023a98 R_386_RELATIVE *ABS*
+00023a9c R_386_RELATIVE *ABS*
+00023aa0 R_386_RELATIVE *ABS*
+00023aa4 R_386_RELATIVE *ABS*
+00023aa8 R_386_RELATIVE *ABS*
+00023aac R_386_RELATIVE *ABS*
+00023ab0 R_386_RELATIVE *ABS*
+00023ab4 R_386_RELATIVE *ABS*
+00023ab8 R_386_RELATIVE *ABS*
+00023abc R_386_RELATIVE *ABS*
+00023ac0 R_386_RELATIVE *ABS*
+00023ac8 R_386_RELATIVE *ABS*
+00023acc R_386_RELATIVE *ABS*
+00023ad0 R_386_RELATIVE *ABS*
+00023ad4 R_386_RELATIVE *ABS*
+00023ad8 R_386_RELATIVE *ABS*
+00023ae0 R_386_RELATIVE *ABS*
+00023ae4 R_386_RELATIVE *ABS*
+00023ae8 R_386_RELATIVE *ABS*
+00023aec R_386_RELATIVE *ABS*
+00023af0 R_386_RELATIVE *ABS*
+00023b00 R_386_RELATIVE *ABS*
+00023b04 R_386_RELATIVE *ABS*
+00023b08 R_386_RELATIVE *ABS*
+00023b0c R_386_RELATIVE *ABS*
+00023b10 R_386_RELATIVE *ABS*
+00023b14 R_386_RELATIVE *ABS*
+00023b18 R_386_RELATIVE *ABS*
+00023b20 R_386_RELATIVE *ABS*
+00023b30 R_386_RELATIVE *ABS*
+00023b40 R_386_RELATIVE *ABS*
+00023b50 R_386_RELATIVE *ABS*
+00023b60 R_386_RELATIVE *ABS*
+00023b70 R_386_RELATIVE *ABS*
+00023b80 R_386_RELATIVE *ABS*
+00023b90 R_386_RELATIVE *ABS*
+00023ba0 R_386_RELATIVE *ABS*
+00023bb0 R_386_RELATIVE *ABS*
+00023bc0 R_386_RELATIVE *ABS*
+00023bd0 R_386_RELATIVE *ABS*
+00023be0 R_386_RELATIVE *ABS*
+00023bf0 R_386_RELATIVE *ABS*
+00023c00 R_386_RELATIVE *ABS*
+00023c10 R_386_RELATIVE *ABS*
+00023c20 R_386_RELATIVE *ABS*
+00023c30 R_386_RELATIVE *ABS*
+00023c40 R_386_RELATIVE *ABS*
+00023c50 R_386_RELATIVE *ABS*
+00023c60 R_386_RELATIVE *ABS*
+00023c70 R_386_RELATIVE *ABS*
+00023c80 R_386_RELATIVE *ABS*
+00023c90 R_386_RELATIVE *ABS*
+00023ca0 R_386_RELATIVE *ABS*
+00023cb0 R_386_RELATIVE *ABS*
+00023cc0 R_386_RELATIVE *ABS*
+00023cd0 R_386_RELATIVE *ABS*
+00023ce0 R_386_RELATIVE *ABS*
+00023cf0 R_386_RELATIVE *ABS*
+00023d00 R_386_RELATIVE *ABS*
+00023d10 R_386_RELATIVE *ABS*
+00023d20 R_386_RELATIVE *ABS*
+00023d30 R_386_RELATIVE *ABS*
+00023d40 R_386_RELATIVE *ABS*
+00023d50 R_386_RELATIVE *ABS*
+00023d60 R_386_RELATIVE *ABS*
+00023d70 R_386_RELATIVE *ABS*
+00023d80 R_386_RELATIVE *ABS*
+00023d90 R_386_RELATIVE *ABS*
+00023da0 R_386_RELATIVE *ABS*
+00023db0 R_386_RELATIVE *ABS*
+00023dc0 R_386_RELATIVE *ABS*
+00023de0 R_386_RELATIVE *ABS*
+00023de4 R_386_RELATIVE *ABS*
+00023de8 R_386_RELATIVE *ABS*
+00023dec R_386_RELATIVE *ABS*
+00023df0 R_386_RELATIVE *ABS*
+00023df4 R_386_RELATIVE *ABS*
+00023df8 R_386_RELATIVE *ABS*
+00023dfc R_386_RELATIVE *ABS*
+00023e00 R_386_RELATIVE *ABS*
+00023e04 R_386_RELATIVE *ABS*
+00023e08 R_386_RELATIVE *ABS*
+00023e0c R_386_RELATIVE *ABS*
+00023e10 R_386_RELATIVE *ABS*
+00023e14 R_386_RELATIVE *ABS*
+00023e18 R_386_RELATIVE *ABS*
+00023e1c R_386_RELATIVE *ABS*
+00023e20 R_386_RELATIVE *ABS*
+00023e24 R_386_RELATIVE *ABS*
+00023e28 R_386_RELATIVE *ABS*
+00023e2c R_386_RELATIVE *ABS*
+00023e30 R_386_RELATIVE *ABS*
+00023e34 R_386_RELATIVE *ABS*
+00023e38 R_386_RELATIVE *ABS*
+00023e3c R_386_RELATIVE *ABS*
+00023e44 R_386_RELATIVE *ABS*
+00023e48 R_386_RELATIVE *ABS*
+00023e4c R_386_RELATIVE *ABS*
+00023e50 R_386_RELATIVE *ABS*
+00023e58 R_386_RELATIVE *ABS*
+00023e5c R_386_RELATIVE *ABS*
+00023e60 R_386_RELATIVE *ABS*
+00023e64 R_386_RELATIVE *ABS*
+00023e6c R_386_RELATIVE *ABS*
+00023e70 R_386_RELATIVE *ABS*
+00023e80 R_386_RELATIVE *ABS*
+00023e84 R_386_RELATIVE *ABS*
+00023e88 R_386_RELATIVE *ABS*
+00023e8c R_386_RELATIVE *ABS*
+00023e90 R_386_RELATIVE *ABS*
+00023e94 R_386_RELATIVE *ABS*
+00023e98 R_386_RELATIVE *ABS*
+00023e9c R_386_RELATIVE *ABS*
+00023ea0 R_386_RELATIVE *ABS*
+00023ea4 R_386_RELATIVE *ABS*
+00023fb8 R_386_RELATIVE *ABS*
+00023fc0 R_386_RELATIVE *ABS*
+00023fc8 R_386_RELATIVE *ABS*
+00023fd0 R_386_RELATIVE *ABS*
+00023fd8 R_386_RELATIVE *ABS*
+000241e4 R_386_RELATIVE *ABS*
+00024200 R_386_RELATIVE *ABS*
+00024204 R_386_RELATIVE *ABS*
+00024224 R_386_RELATIVE *ABS*
+0002422c R_386_RELATIVE *ABS*
+0002423c R_386_RELATIVE *ABS*
+00024254 R_386_RELATIVE *ABS*
+0002425c R_386_RELATIVE *ABS*
+00024264 R_386_RELATIVE *ABS*
+0002426c R_386_RELATIVE *ABS*
+00024274 R_386_RELATIVE *ABS*
+0002427c R_386_RELATIVE *ABS*
+00024294 R_386_RELATIVE *ABS*
+0002429c R_386_RELATIVE *ABS*
+000242a4 R_386_RELATIVE *ABS*
+000242ac R_386_RELATIVE *ABS*
+000242b4 R_386_RELATIVE *ABS*
+000242bc R_386_RELATIVE *ABS*
+000242c4 R_386_RELATIVE *ABS*
+000242cc R_386_RELATIVE *ABS*
+000242dc R_386_RELATIVE *ABS*
+000242e4 R_386_RELATIVE *ABS*
+000242e8 R_386_RELATIVE *ABS*
+00024334 R_386_RELATIVE *ABS*
+0002433c R_386_RELATIVE *ABS*
+00024340 R_386_RELATIVE *ABS*
+00023fa4 R_386_GLOB_DAT _ITM_deregisterTMCloneTable
+00023fa8 R_386_GLOB_DAT stderr@GLIBC_2.0
+00023fac R_386_GLOB_DAT free@GLIBC_2.0
+00023fb0 R_386_GLOB_DAT optind@GLIBC_2.0
+00023fb4 R_386_GLOB_DAT __cxa_finalize@GLIBC_2.1.3
+00023fbc R_386_GLOB_DAT malloc@GLIBC_2.0
+00023fc4 R_386_GLOB_DAT __gmon_start__
+00023fcc R_386_GLOB_DAT stdout@GLIBC_2.0
+00023fd4 R_386_GLOB_DAT program_invocation_name@GLIBC_2.0
+00023fdc R_386_GLOB_DAT program_invocation_short_name@GLIBC_2.0
+00023fe0 R_386_GLOB_DAT _ITM_registerTMCloneTable
+00023fe4 R_386_GLOB_DAT optarg@GLIBC_2.0
+0002400c R_386_JUMP_SLOT __ctype_toupper_loc@GLIBC_2.3
+00024010 R_386_JUMP_SLOT unsetenv@GLIBC_2.0
+00024014 R_386_JUMP_SLOT getpwnam@GLIBC_2.0
+00024018 R_386_JUMP_SLOT raise@GLIBC_2.0
+0002401c R_386_JUMP_SLOT __snprintf_chk@GLIBC_2.3.4
+00024020 R_386_JUMP_SLOT strcmp@GLIBC_2.0
+00024024 R_386_JUMP_SLOT open64@GLIBC_2.1
+00024028 R_386_JUMP_SLOT getpwuid@GLIBC_2.0
+0002402c R_386_JUMP_SLOT fflush@GLIBC_2.0
+00024030 R_386_JUMP_SLOT _exit@GLIBC_2.0
+00024034 R_386_JUMP_SLOT sigprocmask@GLIBC_2.0
+00024038 R_386_JUMP_SLOT dirfd@GLIBC_2.0
+0002403c R_386_JUMP_SLOT wcwidth@GLIBC_2.0
+00024040 R_386_JUMP_SLOT memmove@GLIBC_2.0
+00024044 R_386_JUMP_SLOT _setjmp@GLIBC_2.0
+00024048 R_386_JUMP_SLOT memcpy@GLIBC_2.0
+0002404c R_386_JUMP_SLOT mbsinit@GLIBC_2.0
+00024050 R_386_JUMP_SLOT clock_gettime@GLIBC_2.17
+00024054 R_386_JUMP_SLOT __strtoull_internal@GLIBC_2.0
+00024058 R_386_JUMP_SLOT fclose@GLIBC_2.1
+0002405c R_386_JUMP_SLOT fseeko64@GLIBC_2.1
+00024060 R_386_JUMP_SLOT signal@GLIBC_2.0
+00024064 R_386_JUMP_SLOT memcmp@GLIBC_2.0
+00024068 R_386_JUMP_SLOT gettimeofday@GLIBC_2.0
+0002406c R_386_JUMP_SLOT dcgettext@GLIBC_2.0
+00024070 R_386_JUMP_SLOT mktime@GLIBC_2.0
+00024074 R_386_JUMP_SLOT __stack_chk_fail@GLIBC_2.4
+00024078 R_386_JUMP_SLOT localtime_r@GLIBC_2.0
+0002407c R_386_JUMP_SLOT sigismember@GLIBC_2.0
+00024080 R_386_JUMP_SLOT fgetfilecon
+00024084 R_386_JUMP_SLOT fflush_unlocked@GLIBC_2.0
+00024088 R_386_JUMP_SLOT iswcntrl@GLIBC_2.0
+0002408c R_386_JUMP_SLOT textdomain@GLIBC_2.0
+00024090 R_386_JUMP_SLOT readlink@GLIBC_2.0
+00024094 R_386_JUMP_SLOT fnmatch@GLIBC_2.2.3
+00024098 R_386_JUMP_SLOT iswprint@GLIBC_2.0
+0002409c R_386_JUMP_SLOT ioctl@GLIBC_2.0
+000240a0 R_386_JUMP_SLOT fwrite@GLIBC_2.0
+000240a4 R_386_JUMP_SLOT __fxstat64@GLIBC_2.2
+000240a8 R_386_JUMP_SLOT tzset@GLIBC_2.0
+000240ac R_386_JUMP_SLOT __ctype_get_mb_cur_max@GLIBC_2.0
+000240b0 R_386_JUMP_SLOT strcpy@GLIBC_2.0
+000240b4 R_386_JUMP_SLOT __fpending@GLIBC_2.2
+000240b8 R_386_JUMP_SLOT wcstombs@GLIBC_2.0
+000240bc R_386_JUMP_SLOT mbrtowc@GLIBC_2.0
+000240c0 R_386_JUMP_SLOT gethostname@GLIBC_2.0
+000240c4 R_386_JUMP_SLOT __cxa_atexit@GLIBC_2.1.3
+000240c8 R_386_JUMP_SLOT error@GLIBC_2.0
+000240cc R_386_JUMP_SLOT strcoll@GLIBC_2.0
+000240d0 R_386_JUMP_SLOT getenv@GLIBC_2.0
+000240d4 R_386_JUMP_SLOT realloc@GLIBC_2.0
+000240d8 R_386_JUMP_SLOT lgetfilecon
+000240dc R_386_JUMP_SLOT timegm@GLIBC_2.0
+000240e0 R_386_JUMP_SLOT __freading@GLIBC_2.2
+000240e4 R_386_JUMP_SLOT __memcpy_chk@GLIBC_2.3.4
+000240e8 R_386_JUMP_SLOT exit@GLIBC_2.0
+000240ec R_386_JUMP_SLOT fdopen@GLIBC_2.1
+000240f0 R_386_JUMP_SLOT fputs_unlocked@GLIBC_2.1
+000240f4 R_386_JUMP_SLOT strftime@GLIBC_2.0
+000240f8 R_386_JUMP_SLOT getopt_long@GLIBC_2.0
+000240fc R_386_JUMP_SLOT getfilecon
+00024100 R_386_JUMP_SLOT strtoul@GLIBC_2.0
+00024104 R_386_JUMP_SLOT strchr@GLIBC_2.0
+00024108 R_386_JUMP_SLOT getcwd@GLIBC_2.0
+0002410c R_386_JUMP_SLOT fscanf@GLIBC_2.0
+00024110 R_386_JUMP_SLOT strlen@GLIBC_2.0
+00024114 R_386_JUMP_SLOT setenv@GLIBC_2.0
+00024118 R_386_JUMP_SLOT __libc_start_main@GLIBC_2.0
+0002411c R_386_JUMP_SLOT sigaddset@GLIBC_2.0
+00024120 R_386_JUMP_SLOT memset@GLIBC_2.0
+00024124 R_386_JUMP_SLOT ungetc@GLIBC_2.0
+00024128 R_386_JUMP_SLOT snprintf@GLIBC_2.0
+0002412c R_386_JUMP_SLOT __errno_location@GLIBC_2.0
+00024130 R_386_JUMP_SLOT tcgetpgrp@GLIBC_2.0
+00024134 R_386_JUMP_SLOT fileno@GLIBC_2.0
+00024138 R_386_JUMP_SLOT stpncpy@GLIBC_2.0
+0002413c R_386_JUMP_SLOT fwrite_unlocked@GLIBC_2.1
+00024140 R_386_JUMP_SLOT __printf_chk@GLIBC_2.3.4
+00024144 R_386_JUMP_SLOT mempcpy@GLIBC_2.1
+00024148 R_386_JUMP_SLOT wcswidth@GLIBC_2.0
+0002414c R_386_JUMP_SLOT sigemptyset@GLIBC_2.0
+00024150 R_386_JUMP_SLOT __uflow@GLIBC_2.0
+00024154 R_386_JUMP_SLOT __rawmemchr@GLIBC_2.1
+00024158 R_386_JUMP_SLOT nl_langinfo@GLIBC_2.0
+0002415c R_386_JUMP_SLOT setlocale@GLIBC_2.0
+00024160 R_386_JUMP_SLOT strrchr@GLIBC_2.0
+00024164 R_386_JUMP_SLOT __overflow@GLIBC_2.0
+00024168 R_386_JUMP_SLOT mbstowcs@GLIBC_2.0
+0002416c R_386_JUMP_SLOT gmtime_r@GLIBC_2.0
+00024170 R_386_JUMP_SLOT localeconv@GLIBC_2.2
+00024174 R_386_JUMP_SLOT getxattr@GLIBC_2.3
+00024178 R_386_JUMP_SLOT freecon
+0002417c R_386_JUMP_SLOT lseek64@GLIBC_2.1
+00024180 R_386_JUMP_SLOT readdir64@GLIBC_2.2
+00024184 R_386_JUMP_SLOT __fprintf_chk@GLIBC_2.3.4
+00024188 R_386_JUMP_SLOT sigaction@GLIBC_2.0
+0002418c R_386_JUMP_SLOT bindtextdomain@GLIBC_2.0
+00024190 R_386_JUMP_SLOT strncmp@GLIBC_2.0
+00024194 R_386_JUMP_SLOT isatty@GLIBC_2.0
+00024198 R_386_JUMP_SLOT abort@GLIBC_2.0
+0002419c R_386_JUMP_SLOT __xstat64@GLIBC_2.2
+000241a0 R_386_JUMP_SLOT __lxstat64@GLIBC_2.2
+000241a4 R_386_JUMP_SLOT getgrnam@GLIBC_2.0
+000241a8 R_386_JUMP_SLOT close@GLIBC_2.0
+000241ac R_386_JUMP_SLOT closedir@GLIBC_2.0
+000241b0 R_386_JUMP_SLOT strspn@GLIBC_2.0
+000241b4 R_386_JUMP_SLOT opendir@GLIBC_2.0
+000241b8 R_386_JUMP_SLOT getgrgid@GLIBC_2.0
+000241bc R_386_JUMP_SLOT __ctype_tolower_loc@GLIBC_2.3
+000241c0 R_386_JUMP_SLOT __assert_fail@GLIBC_2.0
+000241c4 R_386_JUMP_SLOT __ctype_b_loc@GLIBC_2.3
+000241c8 R_386_JUMP_SLOT calloc@GLIBC_2.0
+000241cc R_386_JUMP_SLOT __sprintf_chk@GLIBC_2.3.4
+
+
diff --git a/scripts/t/Dpkg_Shlibs/objdump.patterns b/scripts/t/Dpkg_Shlibs/objdump.patterns
new file mode 100644
index 0000000..571ad47
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.patterns
@@ -0,0 +1,235 @@
+
+./t/Dpkg_Shlibs/libobjdump.patterns.so: file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x00001650
+
+Program Header:
+ LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
+ filesz 0x0000212c memsz 0x0000212c flags r-x
+ LOAD off 0x00002dd8 vaddr 0x00003dd8 paddr 0x00003dd8 align 2**12
+ filesz 0x00000274 memsz 0x00000278 flags rw-
+ DYNAMIC off 0x00002ec8 vaddr 0x00003ec8 paddr 0x00003ec8 align 2**2
+ filesz 0x00000110 memsz 0x00000110 flags rw-
+ NOTE off 0x00000114 vaddr 0x00000114 paddr 0x00000114 align 2**2
+ filesz 0x00000024 memsz 0x00000024 flags r--
+EH_FRAME off 0x00001ba0 vaddr 0x00001ba0 paddr 0x00001ba0 align 2**2
+ filesz 0x00000134 memsz 0x00000134 flags r--
+ STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
+ filesz 0x00000000 memsz 0x00000000 flags rw-
+ RELRO off 0x00002dd8 vaddr 0x00003dd8 paddr 0x00003dd8 align 2**0
+ filesz 0x00000228 memsz 0x00000228 flags r--
+
+Dynamic Section:
+ NEEDED libstdc++.so.6
+ NEEDED libm.so.6
+ NEEDED libgcc_s.so.1
+ NEEDED libc.so.6
+ SONAME libpatterns.so.1
+ INIT 0x00001520
+ FINI 0x00001b2c
+ INIT_ARRAY 0x00003dd8
+ INIT_ARRAYSZ 0x00000004
+ FINI_ARRAY 0x00003ddc
+ FINI_ARRAYSZ 0x00000004
+ GNU_HASH 0x00000138
+ STRTAB 0x00000960
+ SYMTAB 0x000003d0
+ STRSZ 0x00000802
+ SYMENT 0x00000010
+ PLTGOT 0x00004000
+ PLTRELSZ 0x00000070
+ PLTREL 0x00000011
+ JMPREL 0x000014b0
+ REL 0x000012d8
+ RELSZ 0x000001d8
+ RELENT 0x00000008
+ VERDEF 0x00001214
+ VERDEFNUM 0x00000003
+ VERNEED 0x00001268
+ VERNEEDNUM 0x00000003
+ VERSYM 0x00001162
+ RELCOUNT 0x00000003
+
+Version definitions:
+1 0x01 0x03e92331 libpatterns.so.1
+2 0x00 0x0e2aa3a1 SYMVER_1
+3 0x00 0x0a4cbc82 SYMVEROPT_2
+
+Version References:
+ required from libgcc_s.so.1:
+ 0x0b792650 0x00 07 GCC_3.0
+ required from libstdc++.so.6:
+ 0x056bafd3 0x00 06 CXXABI_1.3
+ 0x0bafd179 0x00 05 CXXABI_1.3.9
+ required from libc.so.6:
+ 0x09691f73 0x00 04 GLIBC_2.1.3
+
+DYNAMIC SYMBOL TABLE:
+00000000 w DF *UND* 00000000 GLIBC_2.1.3 __cxa_finalize
+00000000 DF *UND* 00000000 CXXABI_1.3.9 _ZdlPvj
+00000000 DO *UND* 00000000 CXXABI_1.3 _ZTVN10__cxxabiv117__class_type_infoE
+00000000 DF *UND* 00000000 CXXABI_1.3 __gxx_personality_v0
+00000000 DO *UND* 00000000 CXXABI_1.3 _ZTVN10__cxxabiv121__vmi_class_type_infoE
+00000000 w D *UND* 00000000 _ITM_deregisterTMCloneTable
+00000000 DF *UND* 00000000 GCC_3.0 _Unwind_Resume
+00000000 w D *UND* 00000000 __gmon_start__
+00000000 w D *UND* 00000000 _ITM_registerTMCloneTable
+00001b88 w DO .rodata 00000008 Base _ZTS6ClassC
+00001790 g DF .text 00000002 Base _ZN6ClassBD1Ev
+00001940 g DF .text 00000007 Base _ZThn16_N3NSB6ClassDD0Ev
+000018e0 g DF .text 0000002a Base _ZN6ClassCD0Ev
+00001a00 g DF .text 0000001a Base _ZN3NSA6ClassAC2Ev
+00001af0 g DF .text 00000002 SYMVER_1 _ZN3NSB6SymverC2Ev
+000019c0 g DF .text 0000001a Base _ZN3NSA6ClassA8InternalC2Ev
+00001820 g DF .text 0000002a Base _ZN3NSA6ClassA7PrivateD0Ev
+00001a60 g DF .text 0000008c Base _ZN3NSB6ClassDC2Ev
+000019e0 g DF .text 00000002 Base _ZN3NSA6ClassA8Internal16internal_method1Ec
+00001970 g DF .text 00000002 Base _ZThn12_NK3NSB6ClassD11generate_vtEPKc
+00000000 g DO *ABS* 00000000 SYMVER_1 SYMVER_1
+00003e30 w DO .data.rel.ro 00000010 Base _ZTVN3NSA6ClassA7PrivateE
+00001770 g DF .text 00000002 Base _ZN3NSA6ClassAD1Ev
+00001760 g DF .text 00000002 Base _ZN3NSA6ClassA8InternalD1Ev
+00001b00 g DF .text 00000002 SYMVER_1 _ZN3NSB6SymverD1Ev
+00001a40 g DF .text 0000001a Base _ZN6ClassCC2Ev
+00001b00 g DF .text 00000002 SYMVEROPT_2 _ZN3NSB14SymverOptionalD2Ev
+00003e40 w DO .data.rel.ro 00000010 Base _ZTVN3NSA6ClassA8InternalE
+00001980 g DF .text 0000001a Base _ZN3NSA6ClassA7PrivateC2Ev
+000017b0 g DF .text 0000004d Base _ZN3NSB6ClassDD1Ev
+000019a0 g DF .text 00000002 Base _ZN3NSA6ClassA7Private11privmethod1Ei
+00001790 g DF .text 00000002 Base _ZN6ClassBD2Ev
+00001810 g DF .text 00000007 Base _ZThn16_N3NSB6ClassDD1Ev
+00001b2c g DF .fini 00000000 Base _fini
+00001950 g DF .text 00000007 Base _ZThn12_N3NSB6ClassDD0Ev
+000017a0 g DF .text 00000002 Base _ZN6ClassCD1Ev
+00001750 g DF .text 00000002 Base _ZN3NSA6ClassA7PrivateD1Ev
+00001520 g DF .init 00000000 Base _init
+00003df8 w DO .data.rel.ro 00000008 Base _ZTI6ClassB
+000019f0 g DF .text 00000002 Base _ZN3NSA6ClassA8Internal16internal_method2Ec
+00003e00 w DO .data.rel.ro 00000008 Base _ZTI6ClassC
+00001b00 g DF .text 00000002 SYMVER_1 _ZN3NSB6SymverD2Ev
+00001760 g DF .text 00000002 Base _ZN3NSA6ClassA8InternalD2Ev
+00000000 g DO *ABS* 00000000 SYMVEROPT_2 SYMVEROPT_2
+00001770 g DF .text 00000002 Base _ZN3NSA6ClassAD2Ev
+00003e8c w DO .data.rel.ro 0000003c Base _ZTVN3NSB6ClassDE
+00003e50 w DO .data.rel.ro 00000014 Base _ZTVN3NSA6ClassAE
+000019b0 g DF .text 00000002 Base _ZN3NSA6ClassA7Private11privmethod2Ei
+00001780 g DF .text 00000002 Base _ZNK3NSA6ClassA11generate_vtEPKc
+000017b0 g DF .text 0000004d Base _ZN3NSB6ClassDD2Ev
+00001960 g DF .text 00000002 Base _ZThn16_NK3NSB6ClassD11generate_vtEPKc
+00001780 g DF .text 00000002 Base _ZNK6ClassC11generate_vtEPKc
+00001800 g DF .text 00000007 Base _ZThn12_N3NSB6ClassDD1Ev
+00001af0 g DF .text 00000002 SYMVEROPT_2 _ZN3NSB14SymverOptionalC1Ev
+000017a0 g DF .text 00000002 Base _ZN6ClassCD2Ev
+00001b10 g DF .text 00000002 SYMVER_1 _ZN3NSB6Symver14symver_method1Ev
+00001750 g DF .text 00000002 Base _ZN3NSA6ClassA7PrivateD2Ev
+00001780 g DF .text 00000002 Base _ZNK6ClassB11generate_vtEPKc
+00001a20 g DF .text 0000001a Base _ZN6ClassBC1Ev
+00003e64 w DO .data.rel.ro 00000014 Base _ZTV6ClassB
+00003e78 w DO .data.rel.ro 00000014 Base _ZTV6ClassC
+00001b70 w DO .rodata 0000000e Base _ZTSN3NSA6ClassAE
+0000404c g D .data 00000000 Base _edata
+00001b40 w DO .rodata 00000016 Base _ZTSN3NSA6ClassA7PrivateE
+00001b90 w DO .rodata 0000000e Base _ZTSN3NSB6ClassDE
+000018b0 g DF .text 0000002a Base _ZN6ClassBD0Ev
+00003de0 w DO .data.rel.ro 00000008 Base _ZTIN3NSA6ClassA7PrivateE
+00001af0 g DF .text 00000002 SYMVEROPT_2 _ZN3NSB14SymverOptionalC2Ev
+000019c0 g DF .text 0000001a Base _ZN3NSA6ClassA8InternalC1Ev
+00001af0 g DF .text 00000002 SYMVER_1 _ZN3NSB6SymverC1Ev
+00004050 g D .bss 00000000 Base _end
+00001a00 g DF .text 0000001a Base _ZN3NSA6ClassAC1Ev
+00001b20 g DF .text 00000002 SYMVER_1 _ZN3NSB6Symver14symver_method2Ev
+00001a60 g DF .text 0000008c Base _ZN3NSB6ClassDC1Ev
+00001b58 w DO .rodata 00000017 Base _ZTSN3NSA6ClassA8InternalE
+00001a20 g DF .text 0000001a Base _ZN6ClassBC2Ev
+00001780 g DF .text 00000002 Base _ZNK3NSB6ClassD11generate_vtEPKc
+00001b00 g DF .text 00000002 SYMVEROPT_2 _ZN3NSB14SymverOptionalD1Ev
+00001880 g DF .text 0000002a Base _ZN3NSA6ClassAD0Ev
+00001a40 g DF .text 0000001a Base _ZN6ClassCC1Ev
+00001850 g DF .text 0000002a Base _ZN3NSA6ClassA8InternalD0Ev
+00003de8 w DO .data.rel.ro 00000008 Base _ZTIN3NSA6ClassA8InternalE
+0000404c g D .bss 00000000 Base __bss_start
+00003e08 w DO .data.rel.ro 00000028 Base _ZTIN3NSB6ClassDE
+00003df0 w DO .data.rel.ro 00000008 Base _ZTIN3NSA6ClassAE
+00001910 g DF .text 0000002a Base _ZN3NSB6ClassDD0Ev
+00001980 g DF .text 0000001a Base _ZN3NSA6ClassA7PrivateC1Ev
+00001b80 w DO .rodata 00000008 Base _ZTS6ClassB
+
+
+DYNAMIC RELOCATION RECORDS
+OFFSET TYPE VALUE
+00003dd8 R_386_RELATIVE *ABS*
+00003ddc R_386_RELATIVE *ABS*
+00004044 R_386_RELATIVE *ABS*
+00003de0 R_386_32 _ZTVN10__cxxabiv117__class_type_infoE@CXXABI_1.3
+00003de8 R_386_32 _ZTVN10__cxxabiv117__class_type_infoE@CXXABI_1.3
+00003df0 R_386_32 _ZTVN10__cxxabiv117__class_type_infoE@CXXABI_1.3
+00003df8 R_386_32 _ZTVN10__cxxabiv117__class_type_infoE@CXXABI_1.3
+00003e00 R_386_32 _ZTVN10__cxxabiv117__class_type_infoE@CXXABI_1.3
+00003de4 R_386_32 _ZTSN3NSA6ClassA7PrivateE@@Base
+00003dec R_386_32 _ZTSN3NSA6ClassA8InternalE@@Base
+00003df4 R_386_32 _ZTSN3NSA6ClassAE@@Base
+00003dfc R_386_32 _ZTS6ClassB@@Base
+00003e04 R_386_32 _ZTS6ClassC@@Base
+00003e08 R_386_32 _ZTVN10__cxxabiv121__vmi_class_type_infoE@CXXABI_1.3
+00003e0c R_386_32 _ZTSN3NSB6ClassDE@@Base
+00003e18 R_386_32 _ZTIN3NSA6ClassAE@@Base
+00003e54 R_386_32 _ZTIN3NSA6ClassAE@@Base
+00003e20 R_386_32 _ZTI6ClassB@@Base
+00003e68 R_386_32 _ZTI6ClassB@@Base
+00003e28 R_386_32 _ZTI6ClassC@@Base
+00003e7c R_386_32 _ZTI6ClassC@@Base
+00003e34 R_386_32 _ZTIN3NSA6ClassA7PrivateE@@Base
+00003e38 R_386_32 _ZN3NSA6ClassA7PrivateD1Ev@@Base
+00003e3c R_386_32 _ZN3NSA6ClassA7PrivateD0Ev@@Base
+00003e44 R_386_32 _ZTIN3NSA6ClassA8InternalE@@Base
+00003e48 R_386_32 _ZN3NSA6ClassA8InternalD1Ev@@Base
+00003e4c R_386_32 _ZN3NSA6ClassA8InternalD0Ev@@Base
+00003e58 R_386_32 _ZN3NSA6ClassAD1Ev@@Base
+00003e5c R_386_32 _ZN3NSA6ClassAD0Ev@@Base
+00003e60 R_386_32 _ZNK3NSA6ClassA11generate_vtEPKc@@Base
+00003e6c R_386_32 _ZN6ClassBD1Ev@@Base
+00003e70 R_386_32 _ZN6ClassBD0Ev@@Base
+00003e74 R_386_32 _ZNK6ClassB11generate_vtEPKc@@Base
+00003e80 R_386_32 _ZN6ClassCD1Ev@@Base
+00003e84 R_386_32 _ZN6ClassCD0Ev@@Base
+00003e88 R_386_32 _ZNK6ClassC11generate_vtEPKc@@Base
+00003e90 R_386_32 _ZTIN3NSB6ClassDE@@Base
+00003ea4 R_386_32 _ZTIN3NSB6ClassDE@@Base
+00003eb8 R_386_32 _ZTIN3NSB6ClassDE@@Base
+00003e94 R_386_32 _ZN3NSB6ClassDD1Ev@@Base
+00003e98 R_386_32 _ZN3NSB6ClassDD0Ev@@Base
+00003e9c R_386_32 _ZNK3NSB6ClassD11generate_vtEPKc@@Base
+00003ea8 R_386_32 _ZThn12_N3NSB6ClassDD1Ev@@Base
+00003eac R_386_32 _ZThn12_N3NSB6ClassDD0Ev@@Base
+00003eb0 R_386_32 _ZThn12_NK3NSB6ClassD11generate_vtEPKc@@Base
+00003ebc R_386_32 _ZThn16_N3NSB6ClassDD1Ev@@Base
+00003ec0 R_386_32 _ZThn16_N3NSB6ClassDD0Ev@@Base
+00003ec4 R_386_32 _ZThn16_NK3NSB6ClassD11generate_vtEPKc@@Base
+00003fd8 R_386_GLOB_DAT __cxa_finalize@GLIBC_2.1.3
+00003fdc R_386_GLOB_DAT _ZTVN3NSA6ClassA8InternalE@@Base
+00003fe0 R_386_GLOB_DAT _ZTVN3NSB6ClassDE@@Base
+00003fe4 R_386_GLOB_DAT _ZTVN3NSA6ClassAE@@Base
+00003fe8 R_386_GLOB_DAT _ZTV6ClassC@@Base
+00003fec R_386_GLOB_DAT _ZTV6ClassB@@Base
+00003ff0 R_386_GLOB_DAT _ITM_deregisterTMCloneTable
+00003ff4 R_386_GLOB_DAT _ZTVN3NSA6ClassA7PrivateE@@Base
+00003ff8 R_386_GLOB_DAT __gmon_start__
+00003ffc R_386_GLOB_DAT _ITM_registerTMCloneTable
+00004048 R_386_32 __gxx_personality_v0@CXXABI_1.3
+0000400c R_386_JUMP_SLOT _ZN6ClassBD1Ev@@Base
+00004010 R_386_JUMP_SLOT _ZN6ClassBD2Ev@@Base
+00004014 R_386_JUMP_SLOT _ZN3NSA6ClassA7PrivateD1Ev@@Base
+00004018 R_386_JUMP_SLOT _ZN3NSA6ClassAD1Ev@@Base
+0000401c R_386_JUMP_SLOT _ZN3NSA6ClassA8InternalD1Ev@@Base
+00004020 R_386_JUMP_SLOT _ZdlPvj@CXXABI_1.3.9
+00004024 R_386_JUMP_SLOT _ZN3NSB6ClassDD1Ev@@Base
+00004028 R_386_JUMP_SLOT _ZN6ClassCD2Ev@@Base
+0000402c R_386_JUMP_SLOT _ZN3NSA6ClassAC2Ev@@Base
+00004030 R_386_JUMP_SLOT _ZN6ClassBC2Ev@@Base
+00004034 R_386_JUMP_SLOT _ZN6ClassCC2Ev@@Base
+00004038 R_386_JUMP_SLOT _Unwind_Resume@GCC_3.0
+0000403c R_386_JUMP_SLOT _ZN3NSA6ClassAD2Ev@@Base
+00004040 R_386_JUMP_SLOT _ZN6ClassCD1Ev@@Base
+
+
diff --git a/scripts/t/Dpkg_Shlibs/objdump.space b/scripts/t/Dpkg_Shlibs/objdump.space
new file mode 100644
index 0000000..7ef3f90
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.space
@@ -0,0 +1,8 @@
+
+phony-output: file format elf32-i386
+architecture: i386, flags 0x00000112:
+EXEC_P, HAS_SYMS, D_PAGED
+start address 0x08049b50
+
+DYNAMIC SYMBOL TABLE:
+00000000 DF *UND* 00000075 singlespace
diff --git a/scripts/t/Dpkg_Shlibs/objdump.spacesyms b/scripts/t/Dpkg_Shlibs/objdump.spacesyms
new file mode 100644
index 0000000..1b26af9
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/objdump.spacesyms
@@ -0,0 +1,119 @@
+
+./t/Dpkg_Shlibs/libobjdump.spacesyms.so: file format elf32-i386
+architecture: i386, flags 0x00000150:
+HAS_SYMS, DYNAMIC, D_PAGED
+start address 0x00000770
+
+Program Header:
+ LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
+ filesz 0x00000d08 memsz 0x00000d08 flags r-x
+ LOAD off 0x00000f08 vaddr 0x00001f08 paddr 0x00001f08 align 2**12
+ filesz 0x00000198 memsz 0x0000019c flags rw-
+ DYNAMIC off 0x00000f10 vaddr 0x00001f10 paddr 0x00001f10 align 2**2
+ filesz 0x000000e0 memsz 0x000000e0 flags rw-
+ NOTE off 0x00000114 vaddr 0x00000114 paddr 0x00000114 align 2**2
+ filesz 0x00000024 memsz 0x00000024 flags r--
+EH_FRAME off 0x000009f8 vaddr 0x000009f8 paddr 0x000009f8 align 2**2
+ filesz 0x000000dc memsz 0x000000dc flags r--
+ STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
+ filesz 0x00000000 memsz 0x00000000 flags rw-
+ RELRO off 0x00000f08 vaddr 0x00001f08 paddr 0x00001f08 align 2**0
+ filesz 0x000000f8 memsz 0x000000f8 flags r--
+
+Dynamic Section:
+ NEEDED libc.so.6
+ SONAME libspacesyms.so.1
+ INIT 0x00000724
+ FINI 0x000009e4
+ INIT_ARRAY 0x00001f08
+ INIT_ARRAYSZ 0x00000004
+ FINI_ARRAY 0x00001f0c
+ FINI_ARRAYSZ 0x00000004
+ GNU_HASH 0x00000138
+ STRTAB 0x0000037c
+ SYMTAB 0x000001ec
+ STRSZ 0x00000200
+ SYMENT 0x00000010
+ PLTGOT 0x00002000
+ REL 0x0000062c
+ RELSZ 0x000000f8
+ RELENT 0x00000008
+ VERDEF 0x000005b0
+ VERDEFNUM 0x00000003
+ VERNEED 0x0000060c
+ VERNEEDNUM 0x00000001
+ VERSYM 0x0000057c
+ RELCOUNT 0x0000000f
+
+Version definitions:
+1 0x01 0x026eb371 libspacesyms.so.1
+2 0x00 0x00000591 V1
+3 0x00 0x0df29ee1 VERY_LONG_VERSION_1
+ V1
+
+Version References:
+ required from libc.so.6:
+ 0x09691f73 0x00 04 GLIBC_2.1.3
+
+DYNAMIC SYMBOL TABLE:
+00000000 w D *UND* 00000000 _ITM_deregisterTMCloneTable
+00000000 w DF *UND* 00000000 GLIBC_2.1.3 __cxa_finalize
+00000000 w D *UND* 00000000 __gmon_start__
+00000000 w D *UND* 00000000 _ITM_registerTMCloneTable
+000008c0 g DF .text 00000002 Base symdefaultverSPA CEdefault
+000009e4 g DF .fini 00000000 Base _fini
+00002040 g DO .data 00000060 Base funcs
+00000724 g DF .init 00000000 Base _init
+00000980 g DF .text 00000002 V1 symshortvernospacedefault
+000020a0 g D .bss 00000000 Base __bss_start
+00000890 g DF .text 00000002 Base .protected symdefaultvernospaceprotected
+000020a4 g D .bss 00000000 Base _end
+000009c0 g DF .text 00000002 V1 symshortverSPA CEdefault
+00000000 g DO *ABS* 00000000 V1 V1
+000009a0 g DF .text 00000002 V1 .protected symshortvernospaceprotected
+00000900 g DF .text 00000002 VERY_LONG_VERSION_1 symlongvernospacedefault
+00000000 g DO *ABS* 00000000 VERY_LONG_VERSION_1 VERY_LONG_VERSION_1
+000020a0 g D .data 00000000 Base _edata
+00000870 g DF .text 00000002 Base symdefaultvernospacedefault
+00000960 g DF .text 00000002 VERY_LONG_VERSION_1 .protected symlongverSPA CEprotected
+000008e0 g DF .text 00000002 Base .protected symdefaultverSPA CEprotected
+00000940 g DF .text 00000002 VERY_LONG_VERSION_1 symlongverSPA CEdefault
+000009e0 g DF .text 00000002 V1 .protected symshortverSPA CEprotected
+00000920 g DF .text 00000002 VERY_LONG_VERSION_1 .protected symlongvernospaceprotected
+
+
+DYNAMIC RELOCATION RECORDS
+OFFSET TYPE VALUE
+00001f08 R_386_RELATIVE *ABS*
+00001f0c R_386_RELATIVE *ABS*
+00002020 R_386_RELATIVE *ABS*
+00002044 R_386_RELATIVE *ABS*
+0000204c R_386_RELATIVE *ABS*
+00002054 R_386_RELATIVE *ABS*
+0000205c R_386_RELATIVE *ABS*
+00002064 R_386_RELATIVE *ABS*
+0000206c R_386_RELATIVE *ABS*
+00002074 R_386_RELATIVE *ABS*
+0000207c R_386_RELATIVE *ABS*
+00002084 R_386_RELATIVE *ABS*
+0000208c R_386_RELATIVE *ABS*
+00002094 R_386_RELATIVE *ABS*
+0000209c R_386_RELATIVE *ABS*
+00001ff0 R_386_GLOB_DAT _ITM_deregisterTMCloneTable
+00001ff4 R_386_GLOB_DAT __cxa_finalize@GLIBC_2.1.3
+00001ff8 R_386_GLOB_DAT __gmon_start__
+00001ffc R_386_GLOB_DAT _ITM_registerTMCloneTable
+00002040 R_386_32 symdefaultvernospacedefault@@Base
+00002048 R_386_32 symdefaultvernospaceprotected@@Base
+00002050 R_386_32 symdefaultverSPA CEdefault@@Base
+00002058 R_386_32 symdefaultverSPA CEprotected@@Base
+00002060 R_386_32 symlongvernospacedefault@@VERY_LONG_VERSION_1
+00002068 R_386_32 symlongvernospaceprotected@@VERY_LONG_VERSION_1
+00002070 R_386_32 symlongverSPA CEdefault@@VERY_LONG_VERSION_1
+00002078 R_386_32 symlongverSPA CEprotected@@VERY_LONG_VERSION_1
+00002080 R_386_32 symshortvernospacedefault@@V1
+00002088 R_386_32 symshortvernospaceprotected@@V1
+00002090 R_386_32 symshortverSPA CEdefault@@V1
+00002098 R_386_32 symshortverSPA CEprotected@@V1
+
+
diff --git a/scripts/t/Dpkg_Shlibs/patterns.cpp b/scripts/t/Dpkg_Shlibs/patterns.cpp
new file mode 100644
index 0000000..eb41664
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/patterns.cpp
@@ -0,0 +1,99 @@
+#define EXPORT(x) x {}
+
+namespace NSA {
+ class ClassA {
+ private:
+ class Private {
+ public:
+ Private();
+ virtual ~Private();
+ void privmethod1(int);
+ void privmethod2(int);
+ };
+ Private *p;
+ class Internal {
+ public:
+ Internal();
+ virtual ~Internal();
+ void internal_method1(char);
+ void internal_method2(char);
+ };
+ Internal *i;
+ public:
+ ClassA();
+ virtual ~ClassA();
+ virtual void generate_vt(const char *) const;
+ };
+
+ EXPORT(ClassA::Private::Private());
+ EXPORT(ClassA::Private::~Private());
+ EXPORT(void ClassA::Private::privmethod1(int));
+ EXPORT(void ClassA::Private::privmethod2(int));
+
+ EXPORT(ClassA::Internal::Internal());
+ EXPORT(ClassA::Internal::~Internal());
+ EXPORT(void ClassA::Internal::internal_method1(char));
+ EXPORT(void ClassA::Internal::internal_method2(char));
+
+ EXPORT(ClassA::ClassA());
+ EXPORT(ClassA::~ClassA());
+ EXPORT(void ClassA::generate_vt(const char *) const);
+};
+
+class ClassB {
+public:
+ ClassB();
+ virtual ~ClassB();
+ virtual void generate_vt(const char *) const;
+};
+
+EXPORT(ClassB::ClassB());
+EXPORT(ClassB::~ClassB());
+EXPORT(void ClassB::generate_vt(const char *) const);
+
+class ClassC {
+public:
+ ClassC();
+ virtual ~ClassC();
+ virtual void generate_vt(const char *) const;
+};
+
+EXPORT(ClassC::ClassC());
+EXPORT(ClassC::~ClassC());
+EXPORT(void ClassC::generate_vt(const char *) const);
+
+namespace NSB {
+ class ClassD : public NSA::ClassA, public ClassB, public ClassC {
+ public:
+ ClassD();
+ virtual ~ClassD();
+ virtual void generate_vt(const char *) const override;
+ };
+
+ EXPORT(ClassD::ClassD());
+ EXPORT(ClassD::~ClassD());
+ EXPORT(void ClassD::generate_vt(const char *) const);
+
+ class Symver {
+ public:
+ Symver();
+ ~Symver();
+
+ void symver_method1();
+ void symver_method2();
+ };
+
+ EXPORT(Symver::Symver());
+ EXPORT(Symver::~Symver());
+ EXPORT(void Symver::symver_method1());
+ EXPORT(void Symver::symver_method2());
+
+ class SymverOptional {
+ public:
+ SymverOptional();
+ ~SymverOptional();
+ };
+
+ EXPORT(SymverOptional::SymverOptional());
+ EXPORT(SymverOptional::~SymverOptional());
+};
diff --git a/scripts/t/Dpkg_Shlibs/patterns.map b/scripts/t/Dpkg_Shlibs/patterns.map
new file mode 100644
index 0000000..ace30b7
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/patterns.map
@@ -0,0 +1,9 @@
+SYMVER_1 {
+ global:
+ _ZN3NSB6Symver*;
+};
+
+SYMVEROPT_2 {
+ global:
+ _ZN3NSB14SymverOptional*;
+};
diff --git a/scripts/t/Dpkg_Shlibs/patterns.symbols b/scripts/t/Dpkg_Shlibs/patterns.symbols
new file mode 100644
index 0000000..bacf799
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/patterns.symbols
@@ -0,0 +1,47 @@
+libpatterns.so.1 libpatterns1 #MINVER#
+ (c++|regex|optional)NSA::ClassA::Private(::.*)?@Base 1.private
+ (c++)NSB::Symver::symver_method2()@SYMVER_1 1.method2
+ (symver|optional)SYMVEROPT_2 2
+ SYMVEROPT_2@SYMVEROPT_2 2
+ (c++|symver)SYMVER_1 1.generic
+ SYMVER_1@SYMVER_1 1
+ (regex|c++)^_Z(T[ISV])?N3NSA6ClassA8Internal.*@Base$ 1.internal
+ _ZN3NSA6ClassAC1Ev@Base 1
+ _ZN3NSA6ClassAC2Ev@Base 1
+ _ZN3NSA6ClassAD0Ev@Base 1
+ _ZN3NSA6ClassAD1Ev@Base 1
+ _ZN3NSA6ClassAD2Ev@Base 1
+ _ZN3NSB6ClassDC1Ev@Base 1
+ _ZN3NSB6ClassDC2Ev@Base 1
+ _ZN3NSB6ClassDD0Ev@Base 1
+ _ZN3NSB6ClassDD1Ev@Base 1
+ _ZN3NSB6ClassDD2Ev@Base 1
+ _ZN3NSB6Symver14symver_method1Ev@SYMVER_1 1.method1
+ _ZN6ClassBC1Ev@Base 1
+ _ZN6ClassBC2Ev@Base 1
+ _ZN6ClassBD0Ev@Base 1
+ _ZN6ClassBD1Ev@Base 1
+ _ZN6ClassBD2Ev@Base 1
+ _ZN6ClassCC1Ev@Base 1
+ _ZN6ClassCC2Ev@Base 1
+ _ZN6ClassCD0Ev@Base 1
+ _ZN6ClassCD1Ev@Base 1
+ _ZN6ClassCD2Ev@Base 1
+ _ZNK3NSA6ClassA11generate_vtEPKc@Base 1
+ _ZNK3NSB6ClassD11generate_vtEPKc@Base 1
+ _ZNK6ClassB11generate_vtEPKc@Base 1
+ _ZNK6ClassC11generate_vtEPKc@Base 1
+ _ZTI6ClassB@Base 1
+ _ZTI6ClassC@Base 1
+ _ZTIN3NSA6ClassAE@Base 1
+ _ZTIN3NSB6ClassDE@Base 1
+ _ZTS6ClassB@Base 1
+ _ZTS6ClassC@Base 1
+ _ZTSN3NSA6ClassAE@Base 1
+ _ZTSN3NSB6ClassDE@Base 1
+ _ZTV6ClassB@Base 1
+ _ZTV6ClassC@Base 1
+ _ZTVN3NSA6ClassAE@Base 1
+ _ZTVN3NSB6ClassDE@Base 1
+ (c++)"non-virtual thunk to NSB::ClassD::generate_vt(char const*) const@Base" 1
+ (c++)"non-virtual thunk to NSB::ClassD::~ClassD()@Base" 1
diff --git a/scripts/t/Dpkg_Shlibs/spacesyms-c-gen.pl b/scripts/t/Dpkg_Shlibs/spacesyms-c-gen.pl
new file mode 100755
index 0000000..48434f4
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/spacesyms-c-gen.pl
@@ -0,0 +1,37 @@
+#!/usr/bin/perl
+#
+# spacesyms-c-gen.pl
+#
+# Output a C file that contains symbols matching the shell glob
+# sym{defaultver,longver,shortver}{nospace,SPACE}{default,hidden,protected,internal}
+# with symbol visibility matching the final element and at least one relocation
+# against each symbol.
+#
+# When used together with spacesyms-o-map.pl and spacesyms.map, makes a shared
+# object that contains symbols that covers all cases of:
+#
+# 1) has a short, long or Base version,
+# 2) has or does not have a space in the symbol name,
+# 3) default, hidden, protected or internal visibility.
+
+use strict;
+use warnings;
+
+my @symbols;
+
+foreach my $version (qw(defaultver longver shortver)) {
+ foreach my $space (qw(nospace SPACE)) {
+ foreach my $visibility (qw(default hidden protected internal)) {
+ my $symbol = "sym$version$space$visibility";
+ push @symbols, $symbol;
+ print "void $symbol(void) __attribute__((visibility(\"$visibility\")));\n";
+ print "void $symbol(void) {}\n";
+ }
+ }
+}
+
+print "void (*funcs[])(void) = {\n";
+foreach my $symbol (@symbols) {
+ print "$symbol,\n";
+}
+print "};\n";
diff --git a/scripts/t/Dpkg_Shlibs/spacesyms-o-map.pl b/scripts/t/Dpkg_Shlibs/spacesyms-o-map.pl
new file mode 100755
index 0000000..5081de4
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/spacesyms-o-map.pl
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+#
+# spacesyms-o-map.pl INPUT OUTPUT
+#
+# Copy the object file INPUT to OUTPUT, redefining any symbol in INPUT that
+# contains "SPACE" in its name to contain "SPA CE" instead.
+
+use strict;
+use warnings;
+
+my ($input, $output) = @ARGV;
+my @cmds = ('objcopy');
+
+open my $nm, '-|', 'nm', $input or die "cannot run nm: $!";
+while (<$nm>) {
+ next if not m/SPACE/;
+ chomp;
+ my $x = (split / /, $_, 3)[2];
+ my $y = $x =~ s/SPACE/SPA CE/r;
+ push @cmds, "--redefine-sym=$x=$y";
+}
+close $nm;
+
+push @cmds, $input, $output;
+exec { $cmds[0] } @cmds;
diff --git a/scripts/t/Dpkg_Shlibs/spacesyms.map b/scripts/t/Dpkg_Shlibs/spacesyms.map
new file mode 100644
index 0000000..0053446
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/spacesyms.map
@@ -0,0 +1,7 @@
+V1 {
+ global: symshortver*;
+};
+
+VERY_LONG_VERSION_1 {
+ global: symlongver*;
+} V1;
diff --git a/scripts/t/Dpkg_Shlibs/symbols.fake-1 b/scripts/t/Dpkg_Shlibs/symbols.fake-1
new file mode 100644
index 0000000..f0a230e
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/symbols.fake-1
@@ -0,0 +1,3 @@
+ symbol1_fake1@Base 1.0
+ symbol2_fake1@Base 1.0
+ symbol3_fake1@Base 1.0
diff --git a/scripts/t/Dpkg_Shlibs/symbols.fake-2 b/scripts/t/Dpkg_Shlibs/symbols.fake-2
new file mode 100644
index 0000000..3eed289
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/symbols.fake-2
@@ -0,0 +1,9 @@
+#include "symbols.include-2"
+# This is just a comment
+libfake.so.1 #PACKAGE# #MINVER#
+* Build-Depends-Package: libfake-dev
+# The alternate dependency is below
+| libvirtualfake
+ symbol1_fake2@Base 1.0 1
+ symbol2_fake2@Base 1.0
+ symbol3_fake2@Base 1.1
diff --git a/scripts/t/Dpkg_Shlibs/symbols.fake-3 b/scripts/t/Dpkg_Shlibs/symbols.fake-3
new file mode 100644
index 0000000..576bf22
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/symbols.fake-3
@@ -0,0 +1,5 @@
+# if included, this file will change the current "object" parsed
+# after the include it will be libdivert.so.1 instead of the object
+# of the including symbols file
+libdivert.so.1 libdivert1 #MINVER#
+ divert_something@Base 1.0
diff --git a/scripts/t/Dpkg_Shlibs/symbols.include-1 b/scripts/t/Dpkg_Shlibs/symbols.include-1
new file mode 100644
index 0000000..b524e78
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/symbols.include-1
@@ -0,0 +1,9 @@
+libfake.so.1 libfake1 #MINVER#
+ symbol1_fake1@Base 0.9
+ symbol2_fake1@Base 0.9
+ symbol_before@Base 0.9
+#include "symbols.fake-1"
+ symbol3_fake1@Base 0
+ symbol_after@Base 1.1
+#include "symbols.fake-3"
+ symbol_in_libdivert@Base 1.0~beta1
diff --git a/scripts/t/Dpkg_Shlibs/symbols.include-2 b/scripts/t/Dpkg_Shlibs/symbols.include-2
new file mode 100644
index 0000000..0cc18fa
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/symbols.include-2
@@ -0,0 +1,3 @@
+libfake.so.1 libfake1
+ symbol1_fake2@Base 0.5
+#include "symbols.fake-2"
diff --git a/scripts/t/Dpkg_Shlibs/symbols.include-3 b/scripts/t/Dpkg_Shlibs/symbols.include-3
new file mode 100644
index 0000000..8c8f429
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/symbols.include-3
@@ -0,0 +1,5 @@
+libbasictags.so.2 libbasictags2
+ symbol0_before@Base 1.0
+(optional|random tag=random value)#include "symbols.fake-1"
+ symbol9_after@Base 1.0
+(optional=from parent|t=v)#include "basictags.symbols"
diff --git a/scripts/t/Dpkg_Shlibs/symbols.internal b/scripts/t/Dpkg_Shlibs/symbols.internal
new file mode 100644
index 0000000..a6d3dd6
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/symbols.internal
@@ -0,0 +1,4 @@
+ .gomp_critical_user_foo@Base 2.0
+ .gomp_critical_user_bar@Base 2.0
+ __aeabi_lcmp@GCC_3.0 3.0
+ __aeabi_unknown@GCC_4.0 4.0
diff --git a/scripts/t/Dpkg_Shlibs/symbols.internal-allow b/scripts/t/Dpkg_Shlibs/symbols.internal-allow
new file mode 100644
index 0000000..ea40815
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/symbols.internal-allow
@@ -0,0 +1,3 @@
+libinternal.so.0 libinternal0 #MINVER#
+(allow-internal)#include "symbols.internal"
+ symbol@Base 1.0
diff --git a/scripts/t/Dpkg_Shlibs/symbols.internal-allow-groups b/scripts/t/Dpkg_Shlibs/symbols.internal-allow-groups
new file mode 100644
index 0000000..e4492ec
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/symbols.internal-allow-groups
@@ -0,0 +1,4 @@
+libinternal.so.0 libinternal0 #MINVER#
+* Allow-Internal-Symbol-Groups: aeabi gomp
+#include "symbols.internal"
+ symbol@Base 1.0
diff --git a/scripts/t/Dpkg_Shlibs/symbols.internal-filter b/scripts/t/Dpkg_Shlibs/symbols.internal-filter
new file mode 100644
index 0000000..26e902f
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs/symbols.internal-filter
@@ -0,0 +1,3 @@
+libinternal.so.0 libinternal0 #MINVER#
+#include "symbols.internal"
+ symbol@Base 1.0
diff --git a/scripts/t/Dpkg_Shlibs_Cppfilt.t b/scripts/t/Dpkg_Shlibs_Cppfilt.t
new file mode 100644
index 0000000..6a76977
--- /dev/null
+++ b/scripts/t/Dpkg_Shlibs_Cppfilt.t
@@ -0,0 +1,90 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Dpkg qw(:needs);
+
+test_needs_command('c++filt');
+
+plan tests => 124;
+
+use_ok('Dpkg::Shlibs::Cppfilt');
+
+# Simple C++ demangling tests
+is ( cppfilt_demangle_cpp('_ZNSt10istrstreamC1EPKcl'),
+ 'std::istrstream::istrstream(char const*, long)',
+ 'demangle symbol' );
+is ( cppfilt_demangle_cpp('_ZNSt10istrstreamC1EPKcl@Base'),
+ 'std::istrstream::istrstream(char const*, long)@Base',
+ 'demangle symbol with extra postfix' );
+is ( cppfilt_demangle_cpp('foobar _ZNSt10istrstreamC1EPKcl@Base'),
+ 'foobar std::istrstream::istrstream(char const*, long)@Base',
+ 'demangle symbol with garbage around it' );
+is ( cppfilt_demangle_cpp('FoobarInvalidSymbol'), undef,
+ 'non-demanglable string' );
+
+# Mass C++ demangling. Checking if c++filt does not hang and cppfilt_demangle()
+# immediately provides a correct answer to the caller (i.e. no buffering).
+my @mangledtext = split(/\n+/s, <<'END');
+0000000000000000 DF *UND* 0000000000000000 GCC_3.0 _Unwind_SetIP
+0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __towlower_l
+0000000000000000 DO *UND* 0000000000000000 GLIBC_2.2.5 stdout
+0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 wmemset
+0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fflush
+0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 getc
+0000000000000000 w D *UND* 0000000000000000 pthread_join
+00000000000cfc22 g DO .rodata 0000000000000001 GLIBCXX_3.4 _ZNSt14numeric_limitsIyE17has_signaling_NaNE
+0000000000088d80 w DF .text 0000000000000064 GLIBCXX_3.4 _ZNSt11__timepunctIcEC2Em
+00000000002f40a0 w DO .data.rel.ro 0000000000000020 GLIBCXX_3.4 _ZTTSt14basic_ifstreamIwSt11char_traitsIwEE
+000000000005a5f0 g DF .text 0000000000000063 GLIBCXX_3.4.11 _ZNVSt9__atomic011atomic_flag5clearESt12memory_order
+00000000000bdc20 w DF .text 0000000000000024 GLIBCXX_3.4 _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwmRKS1_
+0000000000063850 g DF .text 0000000000000062 GLIBCXX_3.4 _ZNSt5ctypeIwED2Ev
+00000000000898b0 w DF .text 0000000000000255 GLIBCXX_3.4 _ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_
+
+00000000000bff30 g DF .text 0000000000000019 _ZNSt18condition_variable10notify_oneEv@GLIBCXX_3.4.11
+00000000000666a0 g DF .text 000000000000003f _ZNKSt3tr14hashIRKSbIwSt11char_traitsIwESaIwEEEclES6_@GLIBCXX_3.4.10
+00000000002f6160 w DO .data.rel.ro 0000000000000050 _ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4
+END
+
+my @demangledtext = split(/\n+/s, <<'END');
+0000000000000000 DF *UND* 0000000000000000 GCC_3.0 _Unwind_SetIP
+0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __towlower_l
+0000000000000000 DO *UND* 0000000000000000 GLIBC_2.2.5 stdout
+0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 wmemset
+0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fflush
+0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 getc
+0000000000000000 w D *UND* 0000000000000000 pthread_join
+00000000000cfc22 g DO .rodata 0000000000000001 GLIBCXX_3.4 std::numeric_limits<unsigned long long>::has_signaling_NaN
+0000000000088d80 w DF .text 0000000000000064 GLIBCXX_3.4 std::__timepunct<char>::__timepunct(unsigned long)
+00000000002f40a0 w DO .data.rel.ro 0000000000000020 GLIBCXX_3.4 VTT for std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >
+000000000005a5f0 g DF .text 0000000000000063 GLIBCXX_3.4.11 std::__atomic0::atomic_flag::clear(std::memory_order) volatile
+00000000000bdc20 w DF .text 0000000000000024 GLIBCXX_3.4 std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(wchar_t const*, unsigned long, std::allocator<wchar_t> const&)
+0000000000063850 g DF .text 0000000000000062 GLIBCXX_3.4 std::ctype<wchar_t>::~ctype()
+00000000000898b0 w DF .text 0000000000000255 GLIBCXX_3.4 std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, tm const*, char const*, char const*) const
+
+00000000000bff30 g DF .text 0000000000000019 std::condition_variable::notify_one()@GLIBCXX_3.4.11
+00000000000666a0 g DF .text 000000000000003f std::tr1::hash<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>::operator()(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const@GLIBCXX_3.4.10
+00000000002f6160 w DO .data.rel.ro 0000000000000050 VTT for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4
+END
+
+for my $try (1 .. 7) {
+ for my $i (0 .. $#mangledtext) {
+ my $demangled = cppfilt_demangle_cpp($mangledtext[$i]) || $mangledtext[$i];
+ is($demangled, $demangledtext[$i], "mass c++ demangling (${try}x" . (${i} + 1) . ')');
+ }
+}
diff --git a/scripts/t/Dpkg_Source_Archive.t b/scripts/t/Dpkg_Source_Archive.t
new file mode 100644
index 0000000..0d8d167
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Archive.t
@@ -0,0 +1,122 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 4;
+use Test::Dpkg qw(:paths);
+
+use File::Spec;
+use File::Path qw(make_path);
+
+BEGIN {
+ use_ok('Dpkg::Source::Archive');
+}
+
+use Dpkg;
+use Dpkg::File;
+
+my $tmpdir = test_get_temp_path();
+
+sub test_path_escape
+{
+ my $name = shift;
+
+ my $treedir = File::Spec->rel2abs("$tmpdir/$name-tree");
+ my $overdir = File::Spec->rel2abs("$tmpdir/$name-overlay");
+ my $outdir = "$tmpdir/$name-out";
+ my $expdir = "$tmpdir/$name-exp";
+
+ # This is the base directory, where we are going to be extracting stuff
+ # into, which include traps.
+ make_path("$treedir/subdir-a");
+ file_touch("$treedir/subdir-a/file-a");
+ file_touch("$treedir/subdir-a/file-pre-a");
+ make_path("$treedir/subdir-b");
+ file_touch("$treedir/subdir-b/file-b");
+ file_touch("$treedir/subdir-b/file-pre-b");
+ symlink File::Spec->abs2rel($outdir, $treedir), "$treedir/symlink-escape";
+ symlink File::Spec->abs2rel("$outdir/nonexistent", $treedir), "$treedir/symlink-nonexistent";
+ symlink "$treedir/file", "$treedir/symlink-within";
+ file_touch("$treedir/supposed-dir");
+
+ # This is the overlay directory, which we'll pack and extract over the
+ # base directory.
+ make_path($overdir);
+ make_path("$overdir/subdir-a/aa");
+ file_dump("$overdir/subdir-a/aa/file-aa", 'aa');
+ file_dump("$overdir/subdir-a/file-a", 'a');
+ make_path("$overdir/subdir-b/bb");
+ file_dump("$overdir/subdir-b/bb/file-bb", 'bb');
+ file_dump("$overdir/subdir-b/file-b", 'b');
+ make_path("$overdir/symlink-escape");
+ file_dump("$overdir/symlink-escape/escaped-file", 'escaped');
+ file_dump("$overdir/symlink-nonexistent", 'nonexistent');
+ make_path("$overdir/symlink-within");
+ make_path("$overdir/supposed-dir");
+ file_dump("$overdir/supposed-dir/supposed-file", 'something');
+
+ # Generate overlay tar.
+ system($Dpkg::PROGTAR, '-cf', "$overdir.tar", '-C', $overdir, qw(
+ subdir-a subdir-b
+ symlink-escape/escaped-file symlink-nonexistent symlink-within
+ supposed-dir
+ )) == 0
+ or die "cannot create overlay tar archive\n";
+
+ # This is the expected directory, which we'll be comparing against.
+ make_path($expdir);
+ system('cp', '-a', $overdir, $expdir) == 0
+ or die "cannot copy overlay hierarchy into expected directory\n";
+
+ # Store the expected and out reference directories into a tar to compare
+ # its structure against the result reference.
+ system($Dpkg::PROGTAR, '-cf', "$expdir.tar", '-C', $overdir, qw(
+ subdir-a subdir-b
+ symlink-escape/escaped-file symlink-nonexistent symlink-within
+ supposed-dir
+ ), '-C', $treedir, qw(
+ subdir-a/file-pre-a
+ subdir-b/file-pre-b
+ )) == 0
+ or die "cannot create expected tar archive\n";
+
+ # This directory is supposed to remain empty, anything inside implies a
+ # directory traversal.
+ make_path($outdir);
+
+ my $warnseen;
+ local $SIG{__WARN__} = sub { $warnseen = $_[0] };
+
+ # Perform the extraction.
+ my $tar = Dpkg::Source::Archive->new(filename => "$overdir.tar");
+ $tar->extract($treedir, in_place => 1);
+
+ # Store the result into a tar to compare its structure against a reference.
+ system($Dpkg::PROGTAR, '-cf', "$treedir.tar", '-C', $treedir, '.');
+
+ # Check results
+ ok(length $warnseen && $warnseen =~ m/points outside source root/,
+ 'expected warning seen');
+ ok(system($Dpkg::PROGTAR, '--compare', '-f', "$expdir.tar", '-C', $treedir) == 0,
+ 'expected directory matches');
+ ok(! -e "$outdir/escaped-file",
+ 'expected output directory is empty, directory traversal');
+}
+
+test_path_escape('in-place');
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_Source_Format.t b/scripts/t/Dpkg_Source_Format.t
new file mode 100644
index 0000000..68aa04e
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Format.t
@@ -0,0 +1,63 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 14;
+
+BEGIN {
+ use_ok('Dpkg::Source::Format');
+}
+
+my $format = Dpkg::Source::Format->new();
+my @format_parts;
+my $format_string;
+
+$format->set('4.3 (variant)');
+@format_parts = $format->get();
+is_deeply(\@format_parts, [ qw(4 3 variant) ], 'decomposition of format');
+$format_string = $format->get();
+ok($format_string eq '4.3 (variant)', 'function stringification of format');
+$format_string = "$format";
+ok($format_string eq '4.3 (variant)', 'operator stringification of format');
+
+$format->set('5.5');
+$format_string = $format->get();
+ok($format_string eq '5.5', 'missing variant');
+
+$format->set('6');
+$format_string = $format->get();
+ok($format_string eq '6.0', 'implied minor');
+
+my %format_bogus = (
+ 'a' => 'require numerical major',
+ '7.a' => 'require numerical minor',
+ '.5' => 'require non-empty major',
+ '7.' => 'require non-empty minor',
+ '7.0 ()' => 'require non-empty variant',
+ '7.0 ( )' => 'require non-space variant',
+ '7.0 (VARIANT)' => 'require lower-case variant',
+ '7.6.5' => 'excess version part',
+);
+
+foreach my $format_bogus (sort keys %format_bogus) {
+ eval {
+ $format->set($format_bogus);
+ };
+ ok($@, $format_bogus{$format_bogus});
+};
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_Source_Functions.t b/scripts/t/Dpkg_Source_Functions.t
new file mode 100644
index 0000000..3a3d5b9
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Functions.t
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+BEGIN {
+ use_ok('Dpkg::Source::Functions');
+}
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_Source_Package.t b/scripts/t/Dpkg_Source_Package.t
new file mode 100644
index 0000000..509e422
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Package.t
@@ -0,0 +1,62 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Dpkg qw(:paths :needs);
+
+use File::Compare;
+
+use Dpkg::ErrorHandling;
+use Dpkg::OpenPGP::ErrorCodes;
+
+test_needs_openpgp_backend();
+
+plan tests => 6;
+
+use_ok('Dpkg::Source::Package');
+
+report_options(quiet_warnings => 1);
+
+my $datadir = test_get_data_path();
+my $tmpdir = test_get_temp_path();
+my $ascfile;
+
+my $p = Dpkg::Source::Package->new();
+
+$ascfile = "$tmpdir/package_1.0.orig.tar.enoent";
+is($p->armor_original_tarball_signature("$datadir/nonexistent", $ascfile),
+ undef, 'no conversion of inexistent file');
+
+$ascfile = "$tmpdir/package_1.0.orig.tar.sig2asc";
+is($p->armor_original_tarball_signature("$datadir/package_1.0.orig.tar.sig", $ascfile),
+ OPENPGP_OK, 'conversion from binary sig to armored asc');
+
+ok(compare($ascfile, "$datadir/package_1.0.orig.tar.asc") == 0,
+ 'binary signature converted to OpenPGP ASCII Armor');
+
+# Grab the output messages.
+eval {
+ $ascfile = "$tmpdir/package_1.0.orig.tar.asc2asc";
+ is($p->armor_original_tarball_signature("$datadir/package_1.0.orig.tar.asc", $ascfile),
+ OPENPGP_OK, 'copy instead of converting already armored input');
+};
+
+ok(compare($ascfile, "$datadir/package_1.0.orig.tar.asc") == 0,
+ 'OpenPGP ASCII Armor copied to destination');
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_Source_Package/package_1.0.orig.tar b/scripts/t/Dpkg_Source_Package/package_1.0.orig.tar
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Package/package_1.0.orig.tar
diff --git a/scripts/t/Dpkg_Source_Package/package_1.0.orig.tar.asc b/scripts/t/Dpkg_Source_Package/package_1.0.orig.tar.asc
new file mode 100644
index 0000000..06f2ab0
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Package/package_1.0.orig.tar.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEETz509DYFDBD1aWV0uXK/PqSuV6MFAlnijuMACgkQuXK/PqSu
+V6Oiuw/+P0+5BMH/WfsyhDrykF90tp2q6+eQvbgny8Mo1SJT647cS0bXFrZqd1Zr
+22hFouKLbbqmJVm7GqIyWzg6mWvRJ85tvKMhwaUHiNKBrwOguw6crk8TdRidvS1p
+m7E70wYdoPGvLt0Sr7nDWyaj82r3QkqTWTMxiD9jD4Z3w5Ztz08rpho6CJcGcAlv
+09WGRVo+AiQLDRT70T7598lilHviFNGJdC9sVOrkEyFVDJZirnTvqXgqTJAy5Lve
+DjTnfYAzmivtsQUXkYIj31XWLsiFa5mfpl6FSmFUSBPXALO++sZrL+mQZoUqnBv/
+bxCg3RYbPA6dpZ9IB/gyAvvEOEECeA4v5gDqGn67FeZsALPOEhvAYclkMtLOQBxr
+sJD9GPCQtT2QfObmaUlqabXASNjzguayprh+a8CJChyBKWSvn6LoSdsBzesPT/bh
+DJenc5M9jvIVShiwqQYCdYotebdKYDIvelblz0TbaTs5RZNGrizgj4Mrl0CaKVHs
+51M8Vpb+w1TM+jm3b+5Na+v9TuS0TxGKI1FTyfjZMjF92AF3A13KanSWMg+37eE1
+R1R4pPuJ2s4xYULQNh+BTHlrGso43nxzc2gkJbsPRa6n3fZFRVdYfkIJgv4kzaQD
+Lgsnhzrz1onBWvfnFWlJaRZ/ti4/3EEHAFvt25ZLMyJC2WOCG4I=
+=N2cG
+-----END PGP SIGNATURE-----
diff --git a/scripts/t/Dpkg_Source_Package/package_1.0.orig.tar.sig b/scripts/t/Dpkg_Source_Package/package_1.0.orig.tar.sig
new file mode 100644
index 0000000..a15acec
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Package/package_1.0.orig.tar.sig
Binary files differ
diff --git a/scripts/t/Dpkg_Source_Patch.t b/scripts/t/Dpkg_Source_Patch.t
new file mode 100644
index 0000000..fb64fe6
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Patch.t
@@ -0,0 +1,72 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 10;
+use Test::Dpkg qw(:paths);
+
+use File::Path qw(make_path);
+
+BEGIN {
+ use_ok('Dpkg::Source::Patch');
+}
+
+my $datadir = test_get_data_path();
+my $tmpdir = test_get_temp_path();
+
+sub test_patch_escape {
+ my ($name, $symlink, $patchname, $desc) = @_;
+
+ make_path("$tmpdir/$name-tree");
+ make_path("$tmpdir/$name-out");
+ symlink "../$name-out", "$tmpdir/$name-tree/$symlink";
+
+ my $patch = Dpkg::Source::Patch->new(filename => "$datadir/$patchname");
+ eval {
+ $patch->apply("$tmpdir/$name-tree", verbose => 0);
+ };
+ ok(rmdir "$tmpdir/$name-out", $desc);
+}
+
+# This is CVE-2014-0471 with GNU patch >= 2.7
+test_patch_escape('c-style-parsed', "\tmp", 'c-style.patch',
+ 'patch(1) prevents escape using known c-style encoded filename');
+
+# This is CVE-2014-0471 with GNU patch < 2.7
+test_patch_escape('c-style-unknown', '\\tmp', 'c-style.patch',
+ 'patch(1) prevents escape using unknown c-style encoded filename');
+
+# This is CVE-2014-3865
+test_patch_escape('index-alone', 'symlink', 'index-alone.patch',
+ 'patch(1) prevents escape using Index: w/o ---/+++ header');
+test_patch_escape('index-+++', 'symlink', 'index-+++.patch',
+ 'patch(1) prevents escape using Index: w/ only +++ header');
+test_patch_escape('index-inert', 'symlink', 'index-inert.patch',
+ 'patch(1) should not fail to apply using an inert Index:');
+ok(-e "$tmpdir/index-inert-tree/inert-file",
+ 'patch(1) applies correctly with inert Index:');
+
+# This is CVE-2014-3864
+test_patch_escape('partial', 'symlink', 'partial.patch',
+ 'patch(1) prevents escape using partial +++ header');
+
+test_patch_escape('ghost-hunk', 'symlink', 'ghost-hunk.patch',
+ 'patch(1) prevents escape using a disabling hunk');
+
+# This is CVE-2017-8283
+test_patch_escape('indent-header', 'symlink', 'indent-header.patch',
+ 'patch(1) prevents escape using indented hunks');
diff --git a/scripts/t/Dpkg_Source_Patch/c-style.patch b/scripts/t/Dpkg_Source_Patch/c-style.patch
new file mode 100644
index 0000000..290a640
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Patch/c-style.patch
@@ -0,0 +1,4 @@
+--- /dev/null
++++ "b/\tmp/c-style"
+@@ -0,0 +1 @@
++Escaped
diff --git a/scripts/t/Dpkg_Source_Patch/ghost-hunk.patch b/scripts/t/Dpkg_Source_Patch/ghost-hunk.patch
new file mode 100644
index 0000000..32c3efe
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Patch/ghost-hunk.patch
@@ -0,0 +1,7 @@
+--- a/disable/partial-file
++++ b/disable/partial-file
+@@ -0,0 +1,1 @@disable
++++ b/symlink/hunk-file
+--- a/symlink/hunk-file
+@@ -0,0 +1,1 @@
++Escaped
diff --git a/scripts/t/Dpkg_Source_Patch/indent-header.patch b/scripts/t/Dpkg_Source_Patch/indent-header.patch
new file mode 100644
index 0000000..4bef008
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Patch/indent-header.patch
@@ -0,0 +1,9 @@
+ --- /dev/null
+ +++ b/symlink/index-file
+ @@ -0,0 +1,1 @@
+ +Escaped
+
+--- /dev/null
++++ b/dummy-file
+@@ -0,0 +1,1 @@
++Dummy to make the code see a valid hunk
diff --git a/scripts/t/Dpkg_Source_Patch/index-+++.patch b/scripts/t/Dpkg_Source_Patch/index-+++.patch
new file mode 100644
index 0000000..4ebc23e
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Patch/index-+++.patch
@@ -0,0 +1,4 @@
+Index: index/symlink/index-file
++++
+@@ -0,0 +1,1 @@
++Escaped
diff --git a/scripts/t/Dpkg_Source_Patch/index-alone.patch b/scripts/t/Dpkg_Source_Patch/index-alone.patch
new file mode 100644
index 0000000..904d3d1
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Patch/index-alone.patch
@@ -0,0 +1,3 @@
+Index: index/symlink/index-file
+@@ -0,0 +1,1 @@
++Escaped
diff --git a/scripts/t/Dpkg_Source_Patch/index-inert.patch b/scripts/t/Dpkg_Source_Patch/index-inert.patch
new file mode 100644
index 0000000..5d16c7d
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Patch/index-inert.patch
@@ -0,0 +1,8 @@
+This could be a comment about the patch itself, where we could use an
+Index: a/ header with /../ inside that could be interpreted as a
+malicious pseudo-header, so we should not validate it,
+
+--- /dev/null
++++ b/inert-file
+@@ -0,0 +1,1 @@
++Inert
diff --git a/scripts/t/Dpkg_Source_Patch/partial.patch b/scripts/t/Dpkg_Source_Patch/partial.patch
new file mode 100644
index 0000000..0878858
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Patch/partial.patch
@@ -0,0 +1,3 @@
++++ b/symlink/partial-file
+@@ -0,0 +1,1 @@
++Escaped
diff --git a/scripts/t/Dpkg_Source_Quilt.t b/scripts/t/Dpkg_Source_Quilt.t
new file mode 100644
index 0000000..14169a3
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Quilt.t
@@ -0,0 +1,36 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 2;
+use Test::Dpkg qw(:paths);
+
+BEGIN {
+ use_ok('Dpkg::Source::Quilt');
+}
+
+my $datadir = test_get_data_path();
+
+my $quilt;
+my (@series_got, @series_exp);
+
+$quilt = Dpkg::Source::Quilt->new("$datadir/parse");
+@series_got = $quilt->series();
+@series_exp = qw(change-a.patch change-b.patch change-c.patch change-d.patch);
+is_deeply(\@series_got, \@series_exp, 'Parsed series file matches ref');
+
+# TODO: Add actual test cases.
diff --git a/scripts/t/Dpkg_Source_Quilt/parse/debian/patches/series b/scripts/t/Dpkg_Source_Quilt/parse/debian/patches/series
new file mode 100644
index 0000000..6d9fbf5
--- /dev/null
+++ b/scripts/t/Dpkg_Source_Quilt/parse/debian/patches/series
@@ -0,0 +1,9 @@
+ # Comment-only line
+ change-a.patch -p1
+
+ # Blank line with comments
+ change-b.patch
+ change-c.patch -p1
+ change-d.patch
+
+# End comment
diff --git a/scripts/t/Dpkg_Substvars.t b/scripts/t/Dpkg_Substvars.t
new file mode 100644
index 0000000..61ac027
--- /dev/null
+++ b/scripts/t/Dpkg_Substvars.t
@@ -0,0 +1,280 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 56;
+use Test::Dpkg qw(:paths);
+
+use Dpkg ();
+use Dpkg::Arch qw(get_host_arch);
+
+$ENV{DEB_BUILD_ARCH} = 'amd64';
+$ENV{DEB_HOST_ARCH} = 'amd64';
+
+use_ok('Dpkg::Substvars');
+
+my $datadir = test_get_data_path();
+
+my $output;
+my $expected;
+
+my $s = Dpkg::Substvars->new();
+
+$s->load("$datadir/substvars1");
+
+# simple value tests
+is($s->get('var1'), 'Some value', 'var1');
+is($s->get('var2'), 'Some other value', 'var2');
+is($s->get('var3'), 'Yet another value', 'var3');
+is($s->get('var4'), undef, 'no var4');
+is($s->get('optional-var5'), 'Optionally used value', 'optional-var5');
+
+# Set automatic variable
+$s->set_as_auto('var_auto', 'auto');
+is($s->get('var_auto'), 'auto', 'get var_auto');
+
+$expected = <<'VARS';
+optional-var5?=Optionally used value
+var1=Some value
+var2=Some other value
+var3=Yet another value
+VARS
+is($s->output(), $expected, 'No automatic variables output');
+
+# overriding
+$s->set('var1', 'New value');
+is($s->get('var1'), 'New value', 'var1 updated');
+
+# deleting
+$s->delete('var3');
+is($s->get('var3'), undef, 'var3 deleted');
+
+# default variables
+is($s->get('Newline'), "\n", 'newline');
+is($s->get('Space'), ' ', 'space');
+is($s->get('Tab'), "\t", 'tab');
+is($s->get('dpkg:Version'), $Dpkg::PROGVERSION, 'dpkg version 1');
+
+# special variables
+is($s->get('Arch'), undef, 'no arch');
+$s->set_arch_substvars();
+is($s->get('Arch'), get_host_arch(), 'arch');
+
+is($s->get('vendor:Id'), undef, 'no vendor id');
+is($s->get('vendor:Name'), undef, 'no vendor name');
+$s->set_vendor_substvars();
+is($s->get('vendor:Id'), 'debian', 'vendor id');
+is($s->get('vendor:Name'), 'Debian', 'vendor name');
+
+is($s->get($_), undef, 'no ' . $_) for qw/binary:Version source:Version source:Upstream-Version/;
+$s->set_version_substvars('1:2.3.4~5-6.7.8~nmu9', '1:2.3.4~5-6.7.8~nmu9+bin0');
+is($s->get('binary:Version'), '1:2.3.4~5-6.7.8~nmu9+bin0', 'binary:Version');
+is($s->get('source:Version'), '1:2.3.4~5-6.7.8~nmu9', 'source:Version');
+is($s->get('source:Upstream-Version'), '1:2.3.4~5', 'source:Upstream-Version');
+$s->set_version_substvars('2.3.4~5-6.7.8~nmu9+b1', '1:2.3.4~5-6.7.8~nmu9+b1');
+is($s->get('binary:Version'), '1:2.3.4~5-6.7.8~nmu9+b1', 'binary:Version');
+is($s->get('source:Version'), '2.3.4~5-6.7.8~nmu9', 'source:Version');
+is($s->get('source:Upstream-Version'), '2.3.4~5', 'source:Upstream-Version');
+$s->set_version_substvars('1:2.3.4~5-6.7.8~nmu9+b0');
+is($s->get('binary:Version'), '1:2.3.4~5-6.7.8~nmu9+b0', 'binary:Version');
+is($s->get('source:Version'), '1:2.3.4~5-6.7.8~nmu9', 'source:Version');
+is($s->get('source:Upstream-Version'), '1:2.3.4~5', 'source:Upstream-Version');
+
+is($s->get($_), undef, 'no ' . $_) foreach qw(source:Synopsis source:Extended-Description);
+$s->set_desc_substvars("short synopsis\nthis is the long\nextended text\n");
+is($s->get('source:Synopsis'), 'short synopsis', 'contents of source:Synopsis');
+is($s->get('source:Extended-Description'), "this is the long\nextended text\n",
+ 'contents of source:Extended-Description');
+
+my %ctrl_fields = (
+ 'Some-Field' => 'some-value',
+ 'Other-Field' => 'other-value',
+ 'Alter-Field' => 'alter-value',
+);
+is($s->get($_), undef, 'no ' . $_) foreach sort keys %ctrl_fields;
+$s->set_field_substvars(\%ctrl_fields, 'ctrl');
+is($s->get('ctrl:Some-Field'), 'some-value', 'contents of ctrl:Some-Field');
+is($s->get('ctrl:Other-Field'), 'other-value', 'contents of ctrl:Other-Field');
+is($s->get('ctrl:Alter-Field'), 'alter-value', 'contents of ctrl:Alter-Field');
+
+# Direct replace: few
+is($s->substvars('This is a string ${var1} with variables ${binary:Version}'),
+ 'This is a string New value with variables 1:2.3.4~5-6.7.8~nmu9+b0',
+ 'direct replace, few times');
+
+# Direct replace: many times (more than the recursive limit)
+$s->set('dr', 'feed');
+is($s->substvars('${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}' .
+ '${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}' .
+ '${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}' .
+ '${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}' .
+ '${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}' .
+ '${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}${dr}'),
+ 'feedfeedfeedfeedfeedfeedfeedfeedfeedfeed' .
+ 'feedfeedfeedfeedfeedfeedfeedfeedfeedfeed' .
+ 'feedfeedfeedfeedfeedfeedfeedfeedfeedfeed' .
+ 'feedfeedfeedfeedfeedfeedfeedfeedfeedfeed' .
+ 'feedfeedfeedfeedfeedfeedfeedfeedfeedfeed' .
+ 'feedfeedfeedfeedfeedfeedfeedfeedfeedfeed',
+ 'direct replace, many times');
+
+# Add a test prefix to error and warning messages.
+$s->set_msg_prefix('test ');
+
+$output = q{};
+$SIG{__WARN__} = sub { $output .= $_[0] };
+is($s->substvars('This is a string with unknown variable ${blubb}'),
+ 'This is a string with unknown variable ',
+ 'substvars missing');
+delete $SIG{__WARN__};
+is($output,
+ 'Dpkg_Substvars.t: warning: test substitution variable ${blubb} used, but is not defined' . "\n",
+ 'missing variables warning');
+
+# Recursive replace: Simple.
+$s->set('rvar', 'recursive ${var1}');
+is($s->substvars('This is a string with ${rvar}'),
+ 'This is a string with recursive New value',
+ 'recursive replace simple');
+
+# Recursive replace: Constructed variables.
+$s->set('partref', 'recursive result');
+$s->set('part1', '${pa');
+$s->set('part2', 'rtr');
+$s->set('part3', 'ef}');
+is($s->substvars('Constructed ${part1}${part2}${part3} replace'),
+ 'Constructed recursive result replace',
+ 'recursive constructed variable');
+
+# Recursive replace: Cycle.
+$s->set('ref0', '${ref1}');
+$s->set('ref1', '${ref2}');
+$s->set('ref2', '${ref0}');
+
+eval {
+ $s->substvars('Cycle reference ${ref0}');
+ 1;
+};
+$output = $@ // q{};
+is($output,
+ 'Dpkg_Substvars.t: error: test too many ${ref0} substitutions ' .
+ "(recursive?) in 'Cycle reference \${ref1}'\n",
+ 'recursive cyclic expansion is limited');
+
+# Recursive replace: Billion laughs.
+$s->set('ex0', ':)');
+$s->set('ex1', '${ex0}${ex0}${ex0}${ex0}${ex0}${ex0}${ex0}${ex0}${ex0}${ex0}');
+$s->set('ex2', '${ex1}${ex1}${ex1}${ex1}${ex1}${ex1}${ex1}${ex1}${ex1}${ex1}');
+$s->set('ex3', '${ex2}${ex2}${ex2}${ex2}${ex2}${ex2}${ex2}${ex2}${ex2}${ex2}');
+$s->set('ex4', '${ex3}${ex3}${ex3}${ex3}${ex3}${ex3}${ex3}${ex3}${ex3}${ex3}');
+$s->set('ex5', '${ex4}${ex4}${ex4}${ex4}${ex4}${ex4}${ex4}${ex4}${ex4}${ex4}');
+$s->set('ex6', '${ex5}${ex5}${ex5}${ex5}${ex5}${ex5}${ex5}${ex5}${ex5}${ex5}');
+$s->set('ex7', '${ex6}${ex6}${ex6}${ex6}${ex6}${ex6}${ex6}${ex6}${ex6}${ex6}');
+$s->set('ex8', '${ex7}${ex7}${ex7}${ex7}${ex7}${ex7}${ex7}${ex7}${ex7}${ex7}');
+$s->set('ex9', '${ex8}${ex8}${ex8}${ex8}${ex8}${ex8}${ex8}${ex8}${ex8}${ex8}');
+
+eval {
+ $s->substvars('Billion laughs ${ex9}');
+ 1;
+};
+$output = $@ // q{};
+is($output,
+ 'Dpkg_Substvars.t: error: test too many ${ex1} substitutions ' .
+ "(recursive?) in 'Billion laughs :):):):):):):):):):):):):):)" .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ ':):):):):):):):):):):):):):):):):):):):):):):):):):)' .
+ '${ex0}${ex0}${ex0}${ex0}${ex0}${ex0}${ex0}${ex0}${ex0}${ex0}' .
+ '${ex2}${ex2}${ex2}${ex2}${ex2}' .
+ '${ex3}${ex3}${ex3}${ex3}${ex3}${ex3}${ex3}${ex3}${ex3}' .
+ '${ex4}${ex4}${ex4}${ex4}${ex4}${ex4}${ex4}${ex4}${ex4}' .
+ '${ex5}${ex5}${ex5}${ex5}${ex5}${ex5}${ex5}${ex5}${ex5}' .
+ '${ex6}${ex6}${ex6}${ex6}${ex6}${ex6}${ex6}${ex6}${ex6}' .
+ '${ex7}${ex7}${ex7}${ex7}${ex7}${ex7}${ex7}${ex7}${ex7}' .
+ '${ex8}${ex8}${ex8}${ex8}${ex8}${ex8}${ex8}${ex8}${ex8}' .
+ "'\n",
+ 'recursive or exponential expansion is limited');
+
+# Strange input
+is($s->substvars('Nothing to $ ${substitute here}, is it ${}?, it ${is'),
+ 'Nothing to $ ${substitute here}, is it ${}?, it ${is',
+ 'substvars strange');
+
+# Warnings about unused variables
+$output = '';
+$SIG{__WARN__} = sub { $output .= $_[0] };
+$s->warn_about_unused();
+delete $SIG{__WARN__};
+is($output,
+ 'Dpkg_Substvars.t: warning: test substitution variable ${var2} unused, but is defined' . "\n",
+ 'unused variables warnings');
+
+# Disable warnings for a certain variable
+$s->set_as_used('var_used', 'used');
+$s->mark_as_used('var2');
+$output = '';
+$SIG{__WARN__} = sub { $output .= $_[0] };
+$s->warn_about_unused();
+delete $SIG{__WARN__};
+is($output, '', 'disabled unused variables warnings');
+
+$s->delete('var_used');
+
+# Variable filters
+my $sf;
+
+$expected = <<'VARS';
+name3=Yet another value
+name4=Name value
+otherprefix:var7=Quux
+var1=Some value
+var2=Some other value
+VARS
+$sf = Dpkg::Substvars->new("$datadir/substvars2");
+$sf->filter(remove => sub { $_[0] =~ m/^prefix:/ });
+is($sf->output(), $expected, 'Filter remove variables');
+
+$expected = <<'VARS';
+otherprefix:var7=Quux
+prefix:var5=Foo
+var1=Some value
+var2=Some other value
+VARS
+$sf = Dpkg::Substvars->new("$datadir/substvars2");
+$sf->filter(keep => sub { $_[0] =~ m/var/ });
+is($sf->output(), $expected, 'Filter keep variables');
+
+$expected = <<'VARS';
+prefix:name6=Bar
+VARS
+$sf = Dpkg::Substvars->new("$datadir/substvars2");
+$sf->filter(remove => sub { $_[0] =~ m/var/ },
+ keep => sub { $_[0] =~ m/^prefix:/ });
+is($sf->output(), $expected, 'Filter keep and remove variables');
diff --git a/scripts/t/Dpkg_Substvars/substvars1 b/scripts/t/Dpkg_Substvars/substvars1
new file mode 100644
index 0000000..a2196c8
--- /dev/null
+++ b/scripts/t/Dpkg_Substvars/substvars1
@@ -0,0 +1,10 @@
+var1=Some value
+var2=Some other value
+# the next line is empty
+
+# the next line has some spaces
+
+ # this line has a late comment
+var3=Yet another value
+#var4=This is not set
+optional-var5?=Optionally used value
diff --git a/scripts/t/Dpkg_Substvars/substvars2 b/scripts/t/Dpkg_Substvars/substvars2
new file mode 100644
index 0000000..27d5944
--- /dev/null
+++ b/scripts/t/Dpkg_Substvars/substvars2
@@ -0,0 +1,7 @@
+var1=Some value
+var2=Some other value
+name3=Yet another value
+name4=Name value
+prefix:var5=Foo
+prefix:name6=Bar
+otherprefix:var7=Quux
diff --git a/scripts/t/Dpkg_Vendor.t b/scripts/t/Dpkg_Vendor.t
new file mode 100644
index 0000000..121f620
--- /dev/null
+++ b/scripts/t/Dpkg_Vendor.t
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 7;
+
+# Delete variables that can affect the tests.
+delete $ENV{DEB_VENDOR};
+
+use_ok('Dpkg::Vendor', qw(get_vendor_dir get_current_vendor get_vendor_object));
+
+is(get_vendor_dir(), $ENV{DPKG_ORIGINS_DIR}, 'Check vendor dir');
+
+my ($vendor, $obj);
+
+$vendor = get_current_vendor();
+is($vendor, 'Debian', 'Check current vendor name');
+
+$obj = get_vendor_object();
+is(ref($obj), 'Dpkg::Vendor::Debian', 'Check current vendor object');
+$obj = get_vendor_object('Devuan');
+is(ref($obj), 'Dpkg::Vendor::Devuan', 'Check Devuan vendor object');
+$obj = get_vendor_object('gNewSense');
+is(ref($obj), 'Dpkg::Vendor::Debian', 'Check parent fallback vendor object');
+$obj = get_vendor_object('Ubuntu');
+is(ref($obj), 'Dpkg::Vendor::Ubuntu', 'Check specific vendor object');
diff --git a/scripts/t/Dpkg_Version.t b/scripts/t/Dpkg_Version.t
new file mode 100644
index 0000000..1de7968
--- /dev/null
+++ b/scripts/t/Dpkg_Version.t
@@ -0,0 +1,214 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use IPC::Cmd qw(can_run);
+
+use Dpkg::ErrorHandling;
+use Dpkg::IPC;
+use Dpkg::Version;
+
+report_options(quiet_warnings => 1);
+
+my @tests = <DATA>;
+my @ops = qw(
+ < << lt
+ <= le
+ = eq
+ >= ge
+ > >> gt
+);
+
+plan tests => scalar(@tests) * (3 * scalar(@ops) + 4) + 27;
+
+my $have_dpkg = can_run('dpkg');
+
+sub dpkg_vercmp {
+ my ($a, $cmp, $b) = @_;
+ my $stderr;
+
+ spawn(exec => [ 'dpkg', '--compare-versions', '--', $a, $cmp, $b ],
+ error_to_string => \$stderr, wait_child => 1, nocheck => 1);
+ diag("dpkg --compare-versions error=$?: $stderr") if $? and $? != 256;
+
+ return $? == 0;
+}
+
+sub obj_vercmp {
+ my ($a, $cmp, $b) = @_;
+ return $a < $b if $cmp eq '<<';
+ return $a lt $b if $cmp eq 'lt';
+ return $a <= $b if $cmp eq '<=' or $cmp eq '<';
+ return $a le $b if $cmp eq 'le';
+ return $a == $b if $cmp eq '=';
+ return $a eq $b if $cmp eq 'eq';
+ return $a >= $b if $cmp eq '>=' or $cmp eq '>';
+ return $a ge $b if $cmp eq 'ge';
+ return $a > $b if $cmp eq '>>';
+ return $a gt $b if $cmp eq 'gt';
+}
+
+my $truth = {
+ '-1' => {
+ '<<' => 1, 'lt' => 1,
+ '<=' => 1, 'le' => 1, '<' => 1,
+ '=' => 0, 'eq' => 0,
+ '>=' => 0, 'ge' => 0, '>' => 0,
+ '>>' => 0, 'gt' => 0,
+ },
+ '0' => {
+ '<<' => 0, 'lt' => 0,
+ '<=' => 1, 'le' => 1, '<' => 1,
+ '=' => 1, 'eq' => 1,
+ '>=' => 1, 'ge' => 1, '>' => 1,
+ '>>' => 0, 'gt' => 0,
+ },
+ '1' => {
+ '<<' => 0, 'lt' => 0,
+ '<=' => 0, 'le' => 0, '<' => 0,
+ '=' => 0, 'eq' => 0,
+ '>=' => 1, 'ge' => 1, '>' => 1,
+ '>>' => 1, 'gt' => 1,
+ },
+};
+
+# Handling of empty/invalid versions
+my $empty = Dpkg::Version->new('');
+ok($empty eq '', "Dpkg::Version->new('') eq ''");
+ok($empty->as_string() eq '', "Dpkg::Version->new('')->as_string() eq ''");
+ok(!$empty->is_valid(), 'empty version is invalid');
+$empty = Dpkg::Version->new('-0');
+ok($empty eq '', "Dpkg::Version->new('-0') eq '-0'");
+ok($empty->as_string() eq '-0', "Dpkg::Version->new('-0')->as_string() eq '-0'");
+ok(!$empty->is_valid(), 'empty upstream version is invalid');
+$empty = Dpkg::Version->new('0:-0');
+ok($empty eq '0:-0', "Dpkg::Version->new('0:-0') eq '0:-0'");
+ok($empty->as_string() eq '0:-0', "Dpkg::Version->new('0:-0')->as_string() eq '0:-0'");
+ok(!$empty->is_valid(), 'empty upstream version with epoch is invalid');
+$empty = Dpkg::Version->new(':1.0');
+ok($empty eq ':1.0', "Dpkg::Version->new(':1.0') eq ':1.0'");
+ok($empty->as_string() eq ':1.0', "Dpkg::Version->new(':1.0')->as_string() eq ':1.0'");
+ok(!$empty->is_valid(), 'empty epoch is invalid');
+$empty = Dpkg::Version->new('1.0-');
+ok($empty eq '1.0-', "Dpkg::Version->new('1.0-') eq '1.0-'");
+ok($empty->as_string() eq '1.0-', "Dpkg::Version->new('1.0-')->as_string() eq '1.0-'");
+ok(!$empty->is_valid(), 'empty revision is invalid');
+my $ver = Dpkg::Version->new('10a:5.2');
+ok(!$ver->is_valid(), 'bad epoch is invalid');
+ok(!$ver, 'bool eval of invalid leads to false');
+ok($ver eq '10a:5.2', 'invalid still same string 1/2');
+$ver = Dpkg::Version->new('5.2@3-2');
+ok($ver eq '5.2@3-2', 'invalid still same string 2/2');
+ok(!$ver->is_valid(), 'illegal character is invalid');
+$ver = Dpkg::Version->new('foo5.2');
+ok(!$ver->is_valid(), 'version does not start with digit 1/2');
+$ver = Dpkg::Version->new('0:foo5.2');
+ok(!$ver->is_valid(), 'version does not start with digit 2/2');
+
+# Native and non-native versions
+$ver = Dpkg::Version->new('1.0');
+ok($ver->is_native(), 'upstream version is native');
+$ver = Dpkg::Version->new('1:1.0');
+ok($ver->is_native(), 'upstream version w/ epoch is native');
+$ver = Dpkg::Version->new('1:1.0:1.0');
+ok($ver->is_native(), 'upstream version w/ epoch and colon is native');
+$ver = Dpkg::Version->new('1.0-1');
+ok(!$ver->is_native(), 'upstream version w/ revision is not native');
+$ver = Dpkg::Version->new('1.0-1.0-1');
+ok(!$ver->is_native(), 'upstream version w/ dash and revision is not native');
+
+# Comparisons
+foreach my $case (@tests) {
+ my ($a, $b, $res) = split ' ', $case;
+ my $va = Dpkg::Version->new($a, check => 1);
+ my $vb = Dpkg::Version->new($b, check => 1);
+
+ is("$va", $a, "String representation of Dpkg::Version($a) is $a");
+ is("$vb", $b, "String representation of Dpkg::Version($b) is $b");
+
+ is(version_compare($a, $b), $res, "$a cmp $b => $res");
+ is($va <=> $vb, $res, "Dpkg::Version($a) <=> Dpkg::Version($b) => $res");
+ foreach my $op (@ops) {
+ my $norm_op = version_normalize_relation($op);
+ if ($truth->{$res}{$op}) {
+ ok(version_compare_relation($a, $norm_op, $b), "$a $op $b => true");
+ ok(obj_vercmp($va, $op, $vb), "Dpkg::Version($a) $op Dpkg::Version($b) => true");
+
+ SKIP: {
+ skip 'dpkg not available', 1 if not $have_dpkg;
+
+ ok(dpkg_vercmp($a, $op, $b), "dpkg --compare-versions -- $a $op $b => true");
+ }
+ } else {
+ ok(!version_compare_relation($a, $norm_op, $b), "$a $op $b => false");
+ ok(!obj_vercmp($va, $op, $vb), "Dpkg::Version($a) $op Dpkg::Version($b) => false");
+
+ SKIP: {
+ skip 'dpkg not available', 1 if not $have_dpkg;
+
+ ok(!dpkg_vercmp($a, $op, $b), "dpkg --compare-versions -- $a $op $b => false");
+ }
+ }
+ }
+}
+
+__DATA__
+1.0-1 2.0-2 -1
+2.2~rc-4 2.2-1 -1
+2.2-1 2.2~rc-4 1
+1.0000-1 1.0-1 0
+1 0:1 0
+0 0:0-0 0
+2:2.5 1:7.5 1
+1:0foo 0foo 1
+0:0foo 0foo 0
+0foo 0foo 0
+0foo-0 0foo 0
+0foo 0foo-0 0
+0foo 0fo 1
+0foo-0 0foo+ -1
+0foo~1 0foo -1
+0foo~foo+Bar 0foo~foo+bar -1
+0foo~~ 0foo~ -1
+1~ 1 -1
+12345+that-really-is-some-ver-0 12345+that-really-is-some-ver-10 -1
+0foo-0 0foo-01 -1
+0foo.bar 0foobar 1
+0foo.bar 0foo1bar 1
+0foo.bar 0foo0bar 1
+0foo1bar-1 0foobar-1 -1
+0foo2.0 0foo2 1
+0foo2.0.0 0foo2.10.0 -1
+0foo2.0 0foo2.0.0 -1
+0foo2.0 0foo2.10 -1
+0foo2.1 0foo2.10 -1
+1.09 1.9 0
+1.0.8+nmu1 1.0.8 1
+3.11 3.10+nmu1 1
+0.9j-20080306-4 0.9i-20070324-2 1
+1.2.0~b7-1 1.2.0~b6-1 1
+1.011-1 1.06-2 1
+0.0.9+dfsg1-1 0.0.8+dfsg1-3 1
+4.6.99+svn6582-1 4.6.99+svn6496-1 1
+53 52 1
+0.9.9~pre122-1 0.9.9~pre111-1 1
+2:2.3.2-2+lenny2 2:2.3.2-2 1
+1:3.8.1-1 3.8.GA-1 1
+1.0.1+gpl-1 1.0.1-2 1
+1a 1000a -1
diff --git a/scripts/t/dpkg_buildpackage.t b/scripts/t/dpkg_buildpackage.t
new file mode 100644
index 0000000..bfcd23f
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage.t
@@ -0,0 +1,244 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Dpkg qw(:needs :paths test_neutralize_checksums);
+
+use File::Spec::Functions qw(rel2abs);
+use File::Compare;
+use File::Path qw(make_path);
+use File::Copy;
+
+use Dpkg::File;
+use Dpkg::IPC;
+use Dpkg::BuildTypes;
+use Dpkg::Substvars;
+
+test_needs_command('fakeroot');
+
+plan tests => 17;
+
+my $srcdir = rel2abs($ENV{srcdir} || '.');
+my $datadir = "$srcdir/t/dpkg_buildpackage";
+my $tmpdir = test_get_temp_path();
+
+$ENV{$_} = rel2abs($ENV{$_}) foreach qw(DPKG_DATADIR DPKG_ORIGINS_DIR);
+
+# Any parallelization from the parent should be ignored, we are testing
+# the makefiles serially anyway.
+delete $ENV{MAKEFLAGS};
+
+# Delete variables that can affect the tests.
+delete $ENV{SOURCE_DATE_EPOCH};
+
+# Delete other variables that can affect the tests.
+delete $ENV{$_} foreach grep { m/^DEB_/ } keys %ENV;
+
+# Set architecture variables to not require dpkg nor gcc.
+$ENV{PATH} = "$srcdir/t/mock-bin:$ENV{PATH}";
+
+chdir $tmpdir;
+
+my $tmpl_format = <<'TMPL_FORMAT';
+3.0 (native)
+TMPL_FORMAT
+
+my $tmpl_changelog = <<'TMPL_CHANGELOG';
+${source-name} (${source-version}) ${suite}; urgency=${urgency}
+
+ * Entry. Closes: #12345
+
+ -- ${maintainer} Thu, 30 Jun 2016 20:15:12 +0200
+TMPL_CHANGELOG
+
+my $tmpl_control = <<'TMPL_CONTROL';
+Source: ${source-name}
+Section: ${source-section}
+Priority: ${source-priority}
+Maintainer: ${maintainer}
+
+Package: test-binary-all
+Architecture: all
+Description: architecture independent binary package
+
+Package: test-binary-any
+Architecture: any
+Description: architecture dependent binary package
+TMPL_CONTROL
+
+my $tmpl_rules = <<'TMPL_RULES';
+#!/usr/bin/make -f
+
+DI := debian/${binary-name-all}
+DA := debian/${binary-name-any}
+
+# fakeroot confuses ASAN link order check.
+export ASAN_OPTIONS = verify_asan_link_order=0
+
+clean:
+ rm -f debian/files
+ rm -rf $(DI) $(DA)
+
+build-indep:
+build-arch:
+build: build-indep build-arch
+
+binary-indep: build-indep
+ rm -rf $(DI)
+ mkdir -p $(DI)/DEBIAN
+ dpkg-gencontrol -P$(DI) -p${binary-name-all}
+ dpkg-deb --build $(DI) ..
+
+binary-arch: build-arch
+ rm -rf $(DA)
+ mkdir -p $(DA)/DEBIAN
+ dpkg-gencontrol -P$(DA) -p${binary-name-any}
+ dpkg-deb --build $(DA) ..
+
+binary: binary-indep binary-arch
+
+.PHONY: clean build-indep build-arch build binary-indexp binary-arch binary
+TMPL_RULES
+
+my %default_substvars = (
+ 'source-name' => 'test-source',
+ 'source-version' => 0,
+ 'source-section' => 'test',
+ 'source-priority' => 'optional',
+ 'binary-name-all' => 'test-binary-all',
+ 'binary-name-any' => 'test-binary-any',
+ 'suite' => 'unstable',
+ 'urgency' => 'low',
+ 'maintainer' => 'Dpkg Developers <debian-dpkg@lists.debian.org>',
+);
+
+sub gen_from_tmpl
+{
+ my ($pathname, $tmpl, $substvars) = @_;
+
+ file_dump($pathname, $substvars->substvars($tmpl));
+}
+
+sub gen_source
+{
+ my (%options) = @_;
+
+ my $substvars = Dpkg::Substvars->new();
+ foreach my $var (%default_substvars) {
+ my $value = $options{$var} // $default_substvars{$var};
+
+ $substvars->set_as_auto($var, $value);
+ }
+
+ my $source = $substvars->get('source-name');
+ my $version = $substvars->get('source-version');
+ my $basename = "$source\_$version";
+ my $dirname = $basename =~ tr/_/-/r;
+
+ make_path("$dirname/debian/source");
+
+ gen_from_tmpl("$dirname/debian/source/format", $tmpl_format, $substvars);
+ gen_from_tmpl("$dirname/debian/changelog", $tmpl_changelog, $substvars);
+ gen_from_tmpl("$dirname/debian/control", $tmpl_control, $substvars);
+ gen_from_tmpl("$dirname/debian/rules", $tmpl_rules, $substvars);
+
+ return $basename;
+}
+
+sub test_diff
+{
+ my $filename = shift;
+
+ my $expected_file = "$datadir/$filename";
+ my $generated_file = $filename;
+
+ test_neutralize_checksums($generated_file);
+
+ my $res = compare($expected_file, $generated_file);
+ if ($res) {
+ system "diff -u $expected_file $generated_file >&2";
+ }
+ ok($res == 0, "generated file matches expected one ($expected_file)");
+}
+
+sub test_build
+{
+ my ($basename, $type) = @_;
+ my $dirname = $basename =~ tr/_/-/r;
+
+ set_build_type($type, 'buildtype', nocheck => 1);
+ my $typename = get_build_options_from_type();
+
+ my $stderr;
+
+ my @hook_names = qw(
+ preinit
+ init
+ preclean
+ source
+ build
+ binary
+ buildinfo
+ changes
+ postclean
+ check
+ sign
+ done
+ );
+ my @hook_opts = map {
+ "--hook-$_=$datadir/hook a=%a p=%p v=%v s=%s u=%u >>../$basename\_$typename.hook"
+ } @hook_names;
+
+ chdir $dirname;
+ spawn(exec => [ $ENV{PERL}, "$srcdir/dpkg-buildpackage.pl",
+ "--admindir=$datadir/dpkgdb",
+ '--host-arch=amd64',
+ '--ignore-builtin-builddeps',
+ '--no-sign',
+ "--build=$typename",
+ '--check-command=',
+ @hook_opts,
+ ],
+ error_to_string => \$stderr,
+ wait_child => 1, nocheck => 1);
+ chdir '..';
+
+ ok($? == 0, "dpkg-buildpackage --build=$typename succeeded");
+ diag($stderr) unless $? == 0;
+
+ if (build_has_all(BUILD_ARCH_DEP)) {
+ # Rename the file to preserve on consecutive invocations.
+ move("$basename\_amd64.changes", "$basename\_$typename.changes");
+ }
+
+ test_diff("$basename\_$typename.hook");
+
+ if (build_has_all(BUILD_SOURCE)) {
+ test_diff("$basename.dsc");
+ }
+
+ test_diff("$basename\_$typename.changes");
+}
+
+my $basename = gen_source();
+
+test_build($basename, BUILD_SOURCE);
+test_build($basename, BUILD_ARCH_INDEP);
+test_build($basename, BUILD_ARCH_DEP);
+test_build($basename, BUILD_BINARY);
+test_build($basename, BUILD_FULL);
diff --git a/scripts/t/dpkg_buildpackage/dpkgdb/status b/scripts/t/dpkg_buildpackage/dpkgdb/status
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/dpkgdb/status
diff --git a/scripts/t/dpkg_buildpackage/hook b/scripts/t/dpkg_buildpackage/hook
new file mode 100755
index 0000000..9623311
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/hook
@@ -0,0 +1,25 @@
+#!/bin/sh
+self="$(basename "$0")"
+from="$(dirname "$0")"
+case "$DPKG_BUILDPACKAGE_HOOK_NAME" in
+source)
+ echo "$self: source-opts=$DPKG_BUILDPACKAGE_HOOK_SOURCE_OPTIONS"
+ ;;
+build)
+ echo "$self: build-target=$DPKG_BUILDPACKAGE_HOOK_BUILD_TARGET"
+ ;;
+binary)
+ echo "$self: binary-target=$DPKG_BUILDPACKAGE_HOOK_BINARY_TARGET"
+ ;;
+buildinfo)
+ echo "$self: buildinfo-opts=$DPKG_BUILDPACKAGE_HOOK_BUILDINFO_OPTIONS" \
+ | perl -p -E "s{\Q$from\E}{<ROOT>}g"
+ ;;
+changes)
+ echo "$self: changes-opts=$DPKG_BUILDPACKAGE_HOOK_CHANGES_OPTIONS"
+ ;;
+check)
+ echo "$self: check-opts=$DPKG_BUILDPACKAGE_HOOK_CHECK_OPTIONS"
+ ;;
+esac
+echo "$self: n=$DPKG_BUILDPACKAGE_HOOK_NAME $*"
diff --git a/scripts/t/dpkg_buildpackage/test-source_0.dsc b/scripts/t/dpkg_buildpackage/test-source_0.dsc
new file mode 100644
index 0000000..fe5b4f8
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0.dsc
@@ -0,0 +1,15 @@
+Format: 3.0 (native)
+Source: test-source
+Binary: test-binary-all, test-binary-any
+Architecture: any all
+Version: 0
+Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
+Package-List:
+ test-binary-all deb test optional arch=all
+ test-binary-any deb test optional arch=any
+Checksums-Sha1:
+ 0000000000000000000000000000000000000000 0 test-source_0.tar.xz
+Checksums-Sha256:
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-source_0.tar.xz
+Files:
+ 00000000000000000000000000000000 0 test-source_0.tar.xz
diff --git a/scripts/t/dpkg_buildpackage/test-source_0_all.changes b/scripts/t/dpkg_buildpackage/test-source_0_all.changes
new file mode 100644
index 0000000..c6c444f
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0_all.changes
@@ -0,0 +1,26 @@
+Format: 1.8
+Date: Thu, 30 Jun 2016 20:15:12 +0200
+Source: test-source
+Binary: test-binary-all
+Architecture: all
+Version: 0
+Distribution: unstable
+Urgency: low
+Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
+Changed-By: Dpkg Developers <debian-dpkg@lists.debian.org>
+Description:
+ test-binary-all - architecture independent binary package
+Closes: 12345
+Changes:
+ test-source (0) unstable; urgency=low
+ .
+ * Entry. Closes: #12345
+Checksums-Sha1:
+ 0000000000000000000000000000000000000000 0 test-binary-all_0_all.deb
+ 0000000000000000000000000000000000000000 0 test-source_0_all.buildinfo
+Checksums-Sha256:
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-binary-all_0_all.deb
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-source_0_all.buildinfo
+Files:
+ 00000000000000000000000000000000 0 test optional test-binary-all_0_all.deb
+ 00000000000000000000000000000000 0 test optional test-source_0_all.buildinfo
diff --git a/scripts/t/dpkg_buildpackage/test-source_0_all.hook b/scripts/t/dpkg_buildpackage/test-source_0_all.hook
new file mode 100644
index 0000000..4dc28d8
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0_all.hook
@@ -0,0 +1,18 @@
+hook: n=preinit a=1 p= v= s= u=
+hook: n=init a=1 p=test-source v=0 s=0 u=0
+hook: n=preclean a=1 p=test-source v=0 s=0 u=0
+hook: source-opts=
+hook: n=source a=0 p=test-source v=0 s=0 u=0
+hook: build-target=build-indep
+hook: n=build a=1 p=test-source v=0 s=0 u=0
+hook: binary-target=binary-indep
+hook: n=binary a=1 p=test-source v=0 s=0 u=0
+hook: buildinfo-opts=--build=all --admindir=<ROOT>/dpkgdb -O../test-source_0_all.buildinfo
+hook: n=buildinfo a=1 p=test-source v=0 s=0 u=0
+hook: changes-opts=--build=all -O../test-source_0_all.changes
+hook: n=changes a=1 p=test-source v=0 s=0 u=0
+hook: n=postclean a=0 p=test-source v=0 s=0 u=0
+hook: check-opts=
+hook: n=check a=0 p=test-source v=0 s=0 u=0
+hook: n=sign a=0 p=test-source v=0 s=0 u=0
+hook: n=done a=1 p=test-source v=0 s=0 u=0
diff --git a/scripts/t/dpkg_buildpackage/test-source_0_any.changes b/scripts/t/dpkg_buildpackage/test-source_0_any.changes
new file mode 100644
index 0000000..d67460c
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0_any.changes
@@ -0,0 +1,26 @@
+Format: 1.8
+Date: Thu, 30 Jun 2016 20:15:12 +0200
+Source: test-source
+Binary: test-binary-any
+Architecture: amd64
+Version: 0
+Distribution: unstable
+Urgency: low
+Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
+Changed-By: Dpkg Developers <debian-dpkg@lists.debian.org>
+Description:
+ test-binary-any - architecture dependent binary package
+Closes: 12345
+Changes:
+ test-source (0) unstable; urgency=low
+ .
+ * Entry. Closes: #12345
+Checksums-Sha1:
+ 0000000000000000000000000000000000000000 0 test-binary-any_0_amd64.deb
+ 0000000000000000000000000000000000000000 0 test-source_0_amd64.buildinfo
+Checksums-Sha256:
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-binary-any_0_amd64.deb
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-source_0_amd64.buildinfo
+Files:
+ 00000000000000000000000000000000 0 test optional test-binary-any_0_amd64.deb
+ 00000000000000000000000000000000 0 test optional test-source_0_amd64.buildinfo
diff --git a/scripts/t/dpkg_buildpackage/test-source_0_any.hook b/scripts/t/dpkg_buildpackage/test-source_0_any.hook
new file mode 100644
index 0000000..430fbcd
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0_any.hook
@@ -0,0 +1,18 @@
+hook: n=preinit a=1 p= v= s= u=
+hook: n=init a=1 p=test-source v=0 s=0 u=0
+hook: n=preclean a=1 p=test-source v=0 s=0 u=0
+hook: source-opts=
+hook: n=source a=0 p=test-source v=0 s=0 u=0
+hook: build-target=build-arch
+hook: n=build a=1 p=test-source v=0 s=0 u=0
+hook: binary-target=binary-arch
+hook: n=binary a=1 p=test-source v=0 s=0 u=0
+hook: buildinfo-opts=--build=any --admindir=<ROOT>/dpkgdb -O../test-source_0_amd64.buildinfo
+hook: n=buildinfo a=1 p=test-source v=0 s=0 u=0
+hook: changes-opts=--build=any -O../test-source_0_amd64.changes
+hook: n=changes a=1 p=test-source v=0 s=0 u=0
+hook: n=postclean a=0 p=test-source v=0 s=0 u=0
+hook: check-opts=
+hook: n=check a=0 p=test-source v=0 s=0 u=0
+hook: n=sign a=0 p=test-source v=0 s=0 u=0
+hook: n=done a=1 p=test-source v=0 s=0 u=0
diff --git a/scripts/t/dpkg_buildpackage/test-source_0_binary.changes b/scripts/t/dpkg_buildpackage/test-source_0_binary.changes
new file mode 100644
index 0000000..7470ce5
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0_binary.changes
@@ -0,0 +1,30 @@
+Format: 1.8
+Date: Thu, 30 Jun 2016 20:15:12 +0200
+Source: test-source
+Binary: test-binary-all test-binary-any
+Architecture: all amd64
+Version: 0
+Distribution: unstable
+Urgency: low
+Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
+Changed-By: Dpkg Developers <debian-dpkg@lists.debian.org>
+Description:
+ test-binary-all - architecture independent binary package
+ test-binary-any - architecture dependent binary package
+Closes: 12345
+Changes:
+ test-source (0) unstable; urgency=low
+ .
+ * Entry. Closes: #12345
+Checksums-Sha1:
+ 0000000000000000000000000000000000000000 0 test-binary-all_0_all.deb
+ 0000000000000000000000000000000000000000 0 test-binary-any_0_amd64.deb
+ 0000000000000000000000000000000000000000 0 test-source_0_amd64.buildinfo
+Checksums-Sha256:
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-binary-all_0_all.deb
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-binary-any_0_amd64.deb
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-source_0_amd64.buildinfo
+Files:
+ 00000000000000000000000000000000 0 test optional test-binary-all_0_all.deb
+ 00000000000000000000000000000000 0 test optional test-binary-any_0_amd64.deb
+ 00000000000000000000000000000000 0 test optional test-source_0_amd64.buildinfo
diff --git a/scripts/t/dpkg_buildpackage/test-source_0_binary.hook b/scripts/t/dpkg_buildpackage/test-source_0_binary.hook
new file mode 100644
index 0000000..cf5be4f
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0_binary.hook
@@ -0,0 +1,18 @@
+hook: n=preinit a=1 p= v= s= u=
+hook: n=init a=1 p=test-source v=0 s=0 u=0
+hook: n=preclean a=1 p=test-source v=0 s=0 u=0
+hook: source-opts=
+hook: n=source a=0 p=test-source v=0 s=0 u=0
+hook: build-target=build
+hook: n=build a=1 p=test-source v=0 s=0 u=0
+hook: binary-target=binary
+hook: n=binary a=1 p=test-source v=0 s=0 u=0
+hook: buildinfo-opts=--build=binary --admindir=<ROOT>/dpkgdb -O../test-source_0_amd64.buildinfo
+hook: n=buildinfo a=1 p=test-source v=0 s=0 u=0
+hook: changes-opts=--build=binary -O../test-source_0_amd64.changes
+hook: n=changes a=1 p=test-source v=0 s=0 u=0
+hook: n=postclean a=0 p=test-source v=0 s=0 u=0
+hook: check-opts=
+hook: n=check a=0 p=test-source v=0 s=0 u=0
+hook: n=sign a=0 p=test-source v=0 s=0 u=0
+hook: n=done a=1 p=test-source v=0 s=0 u=0
diff --git a/scripts/t/dpkg_buildpackage/test-source_0_full.changes b/scripts/t/dpkg_buildpackage/test-source_0_full.changes
new file mode 100644
index 0000000..fef013c
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0_full.changes
@@ -0,0 +1,36 @@
+Format: 1.8
+Date: Thu, 30 Jun 2016 20:15:12 +0200
+Source: test-source
+Binary: test-binary-all test-binary-any
+Architecture: source all amd64
+Version: 0
+Distribution: unstable
+Urgency: low
+Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
+Changed-By: Dpkg Developers <debian-dpkg@lists.debian.org>
+Description:
+ test-binary-all - architecture independent binary package
+ test-binary-any - architecture dependent binary package
+Closes: 12345
+Changes:
+ test-source (0) unstable; urgency=low
+ .
+ * Entry. Closes: #12345
+Checksums-Sha1:
+ 0000000000000000000000000000000000000000 0 test-source_0.dsc
+ 0000000000000000000000000000000000000000 0 test-source_0.tar.xz
+ 0000000000000000000000000000000000000000 0 test-binary-all_0_all.deb
+ 0000000000000000000000000000000000000000 0 test-binary-any_0_amd64.deb
+ 0000000000000000000000000000000000000000 0 test-source_0_amd64.buildinfo
+Checksums-Sha256:
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-source_0.dsc
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-source_0.tar.xz
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-binary-all_0_all.deb
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-binary-any_0_amd64.deb
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-source_0_amd64.buildinfo
+Files:
+ 00000000000000000000000000000000 0 test optional test-source_0.dsc
+ 00000000000000000000000000000000 0 test optional test-source_0.tar.xz
+ 00000000000000000000000000000000 0 test optional test-binary-all_0_all.deb
+ 00000000000000000000000000000000 0 test optional test-binary-any_0_amd64.deb
+ 00000000000000000000000000000000 0 test optional test-source_0_amd64.buildinfo
diff --git a/scripts/t/dpkg_buildpackage/test-source_0_full.hook b/scripts/t/dpkg_buildpackage/test-source_0_full.hook
new file mode 100644
index 0000000..086300d
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0_full.hook
@@ -0,0 +1,18 @@
+hook: n=preinit a=1 p= v= s= u=
+hook: n=init a=1 p=test-source v=0 s=0 u=0
+hook: n=preclean a=1 p=test-source v=0 s=0 u=0
+hook: source-opts=
+hook: n=source a=1 p=test-source v=0 s=0 u=0
+hook: build-target=build
+hook: n=build a=1 p=test-source v=0 s=0 u=0
+hook: binary-target=binary
+hook: n=binary a=1 p=test-source v=0 s=0 u=0
+hook: buildinfo-opts=--build=full --admindir=<ROOT>/dpkgdb -O../test-source_0_amd64.buildinfo
+hook: n=buildinfo a=1 p=test-source v=0 s=0 u=0
+hook: changes-opts=--build=full -O../test-source_0_amd64.changes
+hook: n=changes a=1 p=test-source v=0 s=0 u=0
+hook: n=postclean a=0 p=test-source v=0 s=0 u=0
+hook: check-opts=
+hook: n=check a=0 p=test-source v=0 s=0 u=0
+hook: n=sign a=0 p=test-source v=0 s=0 u=0
+hook: n=done a=1 p=test-source v=0 s=0 u=0
diff --git a/scripts/t/dpkg_buildpackage/test-source_0_source.changes b/scripts/t/dpkg_buildpackage/test-source_0_source.changes
new file mode 100644
index 0000000..8c2f3d1
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0_source.changes
@@ -0,0 +1,26 @@
+Format: 1.8
+Date: Thu, 30 Jun 2016 20:15:12 +0200
+Source: test-source
+Architecture: source
+Version: 0
+Distribution: unstable
+Urgency: low
+Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
+Changed-By: Dpkg Developers <debian-dpkg@lists.debian.org>
+Closes: 12345
+Changes:
+ test-source (0) unstable; urgency=low
+ .
+ * Entry. Closes: #12345
+Checksums-Sha1:
+ 0000000000000000000000000000000000000000 0 test-source_0.dsc
+ 0000000000000000000000000000000000000000 0 test-source_0.tar.xz
+ 0000000000000000000000000000000000000000 0 test-source_0_source.buildinfo
+Checksums-Sha256:
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-source_0.dsc
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-source_0.tar.xz
+ 0000000000000000000000000000000000000000000000000000000000000000 0 test-source_0_source.buildinfo
+Files:
+ 00000000000000000000000000000000 0 test optional test-source_0.dsc
+ 00000000000000000000000000000000 0 test optional test-source_0.tar.xz
+ 00000000000000000000000000000000 0 test optional test-source_0_source.buildinfo
diff --git a/scripts/t/dpkg_buildpackage/test-source_0_source.hook b/scripts/t/dpkg_buildpackage/test-source_0_source.hook
new file mode 100644
index 0000000..eb7387a
--- /dev/null
+++ b/scripts/t/dpkg_buildpackage/test-source_0_source.hook
@@ -0,0 +1,16 @@
+hook: n=preinit a=1 p= v= s= u=
+hook: n=init a=1 p=test-source v=0 s=0 u=0
+hook: n=preclean a=1 p=test-source v=0 s=0 u=0
+hook: source-opts=
+hook: n=source a=1 p=test-source v=0 s=0 u=0
+hook: build-target=
+hook: n=build a=0 p=test-source v=0 s=0 u=0
+hook: buildinfo-opts=--build=source --admindir=<ROOT>/dpkgdb -O../test-source_0_source.buildinfo
+hook: n=buildinfo a=1 p=test-source v=0 s=0 u=0
+hook: changes-opts=--build=source -O../test-source_0_source.changes
+hook: n=changes a=1 p=test-source v=0 s=0 u=0
+hook: n=postclean a=0 p=test-source v=0 s=0 u=0
+hook: check-opts=
+hook: n=check a=0 p=test-source v=0 s=0 u=0
+hook: n=sign a=0 p=test-source v=0 s=0 u=0
+hook: n=done a=1 p=test-source v=0 s=0 u=0
diff --git a/scripts/t/dpkg_mergechangelogs.t b/scripts/t/dpkg_mergechangelogs.t
new file mode 100644
index 0000000..646cd2f
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs.t
@@ -0,0 +1,66 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 4;
+
+use File::Spec;
+use File::Compare;
+use File::Temp;
+
+use Dpkg::IPC;
+
+my $srcdir = $ENV{srcdir} || '.';
+my $datadir = "$srcdir/t/dpkg_mergechangelogs";
+
+sub test_merge {
+ my ($expected_file, @options) = @_;
+ my $fh = File::Temp->new();
+ spawn(exec => [ $ENV{PERL}, "$srcdir/dpkg-mergechangelogs.pl", @options ],
+ to_handle => $fh, error_to_file => '/dev/null',
+ wait_child => 1, nocheck => 1);
+ my $res = compare($expected_file, $fh->filename);
+ if ($res) {
+ system('diff', '-u', $expected_file, $fh->filename);
+ }
+ ok($res == 0, "merged changelog matches expected one ($expected_file)");
+}
+
+my $has_alg_merge = 1;
+eval 'use Algorithm::Merge;';
+if ($@) {
+ $has_alg_merge = 0;
+}
+
+my @input = ("$datadir/ch-old", "$datadir/ch-a", "$datadir/ch-b");
+if ($has_alg_merge) {
+ test_merge("$datadir/ch-merged", @input);
+ test_merge("$datadir/ch-merged-pr", '-m', @input);
+ test_merge("$datadir/ch-unreleased-merged", '--merge-unreleased',
+ ("$datadir/ch-unreleased-old",
+ "$datadir/ch-unreleased-a",
+ "$datadir/ch-unreleased-b"));
+} else {
+ test_merge("$datadir/ch-merged-basic", @input);
+ test_merge("$datadir/ch-merged-pr-basic", '-m', @input);
+ test_merge("$datadir/ch-unreleased-merged-basic", '--merge-unreleased',
+ ("$datadir/ch-unreleased-old",
+ "$datadir/ch-unreleased-a",
+ "$datadir/ch-unreleased-b"));
+}
+test_merge("$datadir/ch-badver-merged", ("$datadir/ch-badver-old",
+ "$datadir/ch-badver-a", "$datadir/ch-badver-b"));
diff --git a/scripts/t/dpkg_mergechangelogs/ch-a b/scripts/t/dpkg_mergechangelogs/ch-a
new file mode 100644
index 0000000..ff5419d
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-a
@@ -0,0 +1,94 @@
+test (2.0-1) unstable; urgency=low
+
+ * Version B with 2.0-1~exp3 contains only up to line 3 while version A
+ with 2.0-1 contains the 5 lines. The resulting version should have the
+ 5 lines without conflict with Algorithm::Merge and a conflict without.
+ * Line 1.
+ * Line 2.
+ * Line 3.
+ * Line 4.
+ * Line 5.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:23:09 +0200
+
+test (1.2-2) unstable; urgency=low
+
+ * This is the last entry in changelog O.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:18:50 +0200
+
+test (1.2-1) unstable; urgency=low
+
+ * This entry should not have conflicts with Algorithm::Merge installed.
+ * Changelog B should a have supplementary line above this one.
+ * Pi is 3.14 is true for all changelogs.
+ * Changelog A should have a supplementary line
+ somewhere in this sub-list
+ - The weather is nice
+ - Really no clouds in the sky
+ - Yet I'm hacking on dpkg
+ - What does that mean about me?
+ * This line should be shared but the next one is dropped in B only.
+ * If I'm here it's because the changelog is not B (I should not appear
+ in the resulting changelog).
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:09:07 +0200
+
+test (1.1-1+conflict2) unstable; urgency=low
+
+ * This entry has a conflict on the next line.
+ * I'm in changelog A.
+ * This line is the same in all 3 versions.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:07:40 +0200
+
+test (1.1-1+conflict1) experimental; urgency=low
+
+ * This entry has conflicts on the header line: A wants distribution
+ experimental (instead of unstable) and B wants urgency=high (instead
+ of low).
+ * But it also has a conflict on the trailer line. A changed the
+ timestamp to 18:05:00 and B to 18:06:00.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:05:00 +0200
+
+test (1.1-1+change2) unstable; urgency=low
+
+ * This entry is everywhere but the last line is different in A. The
+ merged version should have what's in A. Furthermore the timestamp in
+ B is set to 17:55:00, it should also be picked up.
+ * I'm definitely in changelog A.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:54:52 +0200
+
+test (1.1-1+change1) unstable; urgency=high
+
+ * This entry is everywhere but the last line is different in B. The
+ merged version should have what's in B. Furthermore the urgency in
+ A is set to high, it should also be picked up.
+ * I'm not in changelog B.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:50:58 +0200
+
+test (1.0-3+a) experimental; urgency=low
+
+ * This entry is present in A only. It's considered new and should thus
+ be in the merged changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:44:39 +0200
+
+test (1.0-2) unstable; urgency=low
+
+ * This entry is dropped in B only.
+ * Since it's in O and A, it should not appear in the result.
+ * Pi is 3.14.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:39:15 +0200
+
+test (1.0-1) unstable; urgency=low
+
+ * Initial release. (Closes: #XXXXXX)
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:37:46 +0200
+
+vim: et
diff --git a/scripts/t/dpkg_mergechangelogs/ch-b b/scripts/t/dpkg_mergechangelogs/ch-b
new file mode 100644
index 0000000..a74145f
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-b
@@ -0,0 +1,89 @@
+test (2.0-1~exp3) unstable; urgency=low
+
+ * Version B with 2.0-1~exp3 contains only up to line 3 while version A
+ with 2.0-1 contains the 5 lines. The resulting version should have the
+ 5 lines without conflict with Algorithm::Merge and a conflict without.
+ * Line 1.
+ * Line 2.
+ * Line 3.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:23:09 +0200
+
+test (1.2-2) unstable; urgency=low
+
+ * This is the last entry in changelog O.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:18:50 +0200
+
+test (1.2-1) unstable; urgency=low
+
+ * This entry should not have conflicts with Algorithm::Merge installed.
+ * I'm the added line mentioned below (B-only).
+ * Changelog B should a have supplementary line above this one.
+ * Pi is 3.14 is true for all changelogs.
+ * Changelog A should have a supplementary line
+ somewhere in this sub-list
+ - The weather is nice
+ - Yet I'm hacking on dpkg
+ - What does that mean about me?
+ * This line should be shared but the next one is dropped in B only.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:09:07 +0200
+
+test (1.1-1+conflict2) unstable; urgency=low
+
+ * This entry has a conflict on the next line.
+ * I'm in changelog B.
+ * This line is the same in all 3 versions.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:07:40 +0200
+
+test (1.1-1+conflict1) unstable; urgency=high
+
+ * This entry has conflicts on the header line: A wants distribution
+ experimental (instead of unstable) and B wants urgency=high (instead
+ of low).
+ * But it also has a conflict on the trailer line. A changed the
+ timestamp to 18:05:00 and B to 18:06:00.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:06:00 +0200
+
+test (1.1-1+change2) unstable; urgency=low
+
+ * This entry is everywhere but the last line is different in A. The
+ merged version should have what's in A. Furthermore the timestamp in
+ B is set to 17:55:00, it should also be picked up.
+ * I'm not in changelog A.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:54:52 +0200
+
+test (1.1-1+change1) unstable; urgency=low
+
+ * This entry is everywhere but the last line is different in B. The
+ merged version should have what's in B. Furthermore the urgency in
+ A is set to high, it should also be picked up.
+ * I'm definitely in changelog B.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:50:58 +0200
+
+test (1.0-3+b) experimental; urgency=low
+
+ * This entry is present in B only. It's considered new and should thus
+ be in the merged changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:47:38 +0200
+
+test (1.0-3) unstable; urgency=low
+
+ * This entry is dropped in A only.
+ * Since it's in O and B, it should not appear in the result.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:41:31 +0200
+
+test (1.0-1) unstable; urgency=low
+
+ * Initial release. (Closes: #XXXXXX)
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:37:46 +0200
+
+vim: et
diff --git a/scripts/t/dpkg_mergechangelogs/ch-badver-a b/scripts/t/dpkg_mergechangelogs/ch-badver-a
new file mode 100644
index 0000000..d544e64
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-badver-a
@@ -0,0 +1,5 @@
+egcs (ss-970814-1) experimental; urgency=low
+
+ * Initial packaging (of initial snapshot!)
+
+ -- Galen Hazelwood <galenh@micron.net> Wed, 20 Aug 1997 00:36:28 +0000
diff --git a/scripts/t/dpkg_mergechangelogs/ch-badver-b b/scripts/t/dpkg_mergechangelogs/ch-badver-b
new file mode 100644
index 0000000..609254e
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-badver-b
@@ -0,0 +1,11 @@
+egcs (970904-1) experimental; urgency=low
+
+ * New upstream snapshot
+
+ -- Galen Hazelwood <galenh@micron.net> Sun, 7 Sep 1997 18:25:06 -0600
+
+egcs (ss-970814-1) experimental; urgency=low
+
+ * Initial packaging (of initial snapshot!)
+
+ -- Galen Hazelwood <galenh@micron.net> Wed, 20 Aug 1997 00:36:28 +0000
diff --git a/scripts/t/dpkg_mergechangelogs/ch-badver-merged b/scripts/t/dpkg_mergechangelogs/ch-badver-merged
new file mode 100644
index 0000000..609254e
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-badver-merged
@@ -0,0 +1,11 @@
+egcs (970904-1) experimental; urgency=low
+
+ * New upstream snapshot
+
+ -- Galen Hazelwood <galenh@micron.net> Sun, 7 Sep 1997 18:25:06 -0600
+
+egcs (ss-970814-1) experimental; urgency=low
+
+ * Initial packaging (of initial snapshot!)
+
+ -- Galen Hazelwood <galenh@micron.net> Wed, 20 Aug 1997 00:36:28 +0000
diff --git a/scripts/t/dpkg_mergechangelogs/ch-badver-old b/scripts/t/dpkg_mergechangelogs/ch-badver-old
new file mode 100644
index 0000000..d544e64
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-badver-old
@@ -0,0 +1,5 @@
+egcs (ss-970814-1) experimental; urgency=low
+
+ * Initial packaging (of initial snapshot!)
+
+ -- Galen Hazelwood <galenh@micron.net> Wed, 20 Aug 1997 00:36:28 +0000
diff --git a/scripts/t/dpkg_mergechangelogs/ch-merged b/scripts/t/dpkg_mergechangelogs/ch-merged
new file mode 100644
index 0000000..29a985d
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-merged
@@ -0,0 +1,115 @@
+test (2.0-1) unstable; urgency=low
+
+ * Version B with 2.0-1~exp3 contains only up to line 3 while version A
+ with 2.0-1 contains the 5 lines. The resulting version should have the
+ 5 lines without conflict with Algorithm::Merge and a conflict without.
+ * Line 1.
+ * Line 2.
+ * Line 3.
+ * Line 4.
+ * Line 5.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:23:09 +0200
+
+test (2.0-1~exp3) unstable; urgency=low
+
+ * Version B with 2.0-1~exp3 contains only up to line 3 while version A
+ with 2.0-1 contains the 5 lines. The resulting version should have the
+ 5 lines without conflict with Algorithm::Merge and a conflict without.
+ * Line 1.
+ * Line 2.
+ * Line 3.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:23:09 +0200
+
+test (1.2-2) unstable; urgency=low
+
+ * This is the last entry in changelog O.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:18:50 +0200
+
+test (1.2-1) unstable; urgency=low
+
+ * This entry should not have conflicts with Algorithm::Merge installed.
+ * I'm the added line mentioned below (B-only).
+ * Changelog B should a have supplementary line above this one.
+ * Pi is 3.14 is true for all changelogs.
+ * Changelog A should have a supplementary line
+ somewhere in this sub-list
+ - The weather is nice
+ - Really no clouds in the sky
+ - Yet I'm hacking on dpkg
+ - What does that mean about me?
+ * This line should be shared but the next one is dropped in B only.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:09:07 +0200
+
+test (1.1-1+conflict2) unstable; urgency=low
+
+ * This entry has a conflict on the next line.
+<<<<<<<
+ * I'm in changelog A.
+=======
+ * I'm in changelog B.
+>>>>>>>
+ * This line is the same in all 3 versions.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:07:40 +0200
+
+<<<<<<<
+test (1.1-1+conflict1) experimental; urgency=low
+=======
+test (1.1-1+conflict1) unstable; urgency=high
+>>>>>>>
+
+ * This entry has conflicts on the header line: A wants distribution
+ experimental (instead of unstable) and B wants urgency=high (instead
+ of low).
+ * But it also has a conflict on the trailer line. A changed the
+ timestamp to 18:05:00 and B to 18:06:00.
+
+<<<<<<<
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:05:00 +0200
+=======
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:06:00 +0200
+>>>>>>>
+
+test (1.1-1+change2) unstable; urgency=low
+
+ * This entry is everywhere but the last line is different in A. The
+ merged version should have what's in A. Furthermore the timestamp in
+ B is set to 17:55:00, it should also be picked up.
+ * I'm definitely in changelog A.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:54:52 +0200
+
+test (1.1-1+change1) unstable; urgency=high
+
+ * This entry is everywhere but the last line is different in B. The
+ merged version should have what's in B. Furthermore the urgency in
+ A is set to high, it should also be picked up.
+ * I'm definitely in changelog B.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:50:58 +0200
+
+test (1.0-3+b) experimental; urgency=low
+
+ * This entry is present in B only. It's considered new and should thus
+ be in the merged changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:47:38 +0200
+
+test (1.0-3+a) experimental; urgency=low
+
+ * This entry is present in A only. It's considered new and should thus
+ be in the merged changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:44:39 +0200
+
+test (1.0-1) unstable; urgency=low
+
+ * Initial release. (Closes: #XXXXXX)
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:37:46 +0200
+
+vim: et
diff --git a/scripts/t/dpkg_mergechangelogs/ch-merged-basic b/scripts/t/dpkg_mergechangelogs/ch-merged-basic
new file mode 100644
index 0000000..f89fe11
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-merged-basic
@@ -0,0 +1,138 @@
+test (2.0-1) unstable; urgency=low
+
+ * Version B with 2.0-1~exp3 contains only up to line 3 while version A
+ with 2.0-1 contains the 5 lines. The resulting version should have the
+ 5 lines without conflict with Algorithm::Merge and a conflict without.
+ * Line 1.
+ * Line 2.
+ * Line 3.
+ * Line 4.
+ * Line 5.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:23:09 +0200
+
+test (2.0-1~exp3) unstable; urgency=low
+
+ * Version B with 2.0-1~exp3 contains only up to line 3 while version A
+ with 2.0-1 contains the 5 lines. The resulting version should have the
+ 5 lines without conflict with Algorithm::Merge and a conflict without.
+ * Line 1.
+ * Line 2.
+ * Line 3.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:23:09 +0200
+
+test (1.2-2) unstable; urgency=low
+
+ * This is the last entry in changelog O.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:18:50 +0200
+
+test (1.2-1) unstable; urgency=low
+
+<<<<<<<
+ * This entry should not have conflicts with Algorithm::Merge installed.
+ * Changelog B should a have supplementary line above this one.
+ * Pi is 3.14 is true for all changelogs.
+ * Changelog A should have a supplementary line
+ somewhere in this sub-list
+ - The weather is nice
+ - Really no clouds in the sky
+ - Yet I'm hacking on dpkg
+ - What does that mean about me?
+ * This line should be shared but the next one is dropped in B only.
+ * If I'm here it's because the changelog is not B (I should not appear
+ in the resulting changelog).
+=======
+ * This entry should not have conflicts with Algorithm::Merge installed.
+ * I'm the added line mentioned below (B-only).
+ * Changelog B should a have supplementary line above this one.
+ * Pi is 3.14 is true for all changelogs.
+ * Changelog A should have a supplementary line
+ somewhere in this sub-list
+ - The weather is nice
+ - Yet I'm hacking on dpkg
+ - What does that mean about me?
+ * This line should be shared but the next one is dropped in B only.
+>>>>>>>
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:09:07 +0200
+
+test (1.1-1+conflict2) unstable; urgency=low
+
+<<<<<<<
+ * This entry has a conflict on the next line.
+ * I'm in changelog A.
+ * This line is the same in all 3 versions.
+=======
+ * This entry has a conflict on the next line.
+ * I'm in changelog B.
+ * This line is the same in all 3 versions.
+>>>>>>>
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:07:40 +0200
+
+<<<<<<<
+test (1.1-1+conflict1) experimental; urgency=low
+=======
+test (1.1-1+conflict1) unstable; urgency=high
+>>>>>>>
+
+ * This entry has conflicts on the header line: A wants distribution
+ experimental (instead of unstable) and B wants urgency=high (instead
+ of low).
+ * But it also has a conflict on the trailer line. A changed the
+ timestamp to 18:05:00 and B to 18:06:00.
+
+<<<<<<<
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:05:00 +0200
+=======
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:06:00 +0200
+>>>>>>>
+
+test (1.1-1+change2) unstable; urgency=low
+
+ * This entry is everywhere but the last line is different in A. The
+ merged version should have what's in A. Furthermore the timestamp in
+ B is set to 17:55:00, it should also be picked up.
+ * I'm definitely in changelog A.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:54:52 +0200
+
+test (1.1-1+change1) unstable; urgency=high
+
+<<<<<<<
+ * This entry is everywhere but the last line is different in B. The
+ merged version should have what's in B. Furthermore the urgency in
+ A is set to high, it should also be picked up.
+ * I'm not in changelog B.
+=======
+ * This entry is everywhere but the last line is different in B. The
+ merged version should have what's in B. Furthermore the urgency in
+ A is set to high, it should also be picked up.
+ * I'm definitely in changelog B.
+>>>>>>>
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:50:58 +0200
+
+test (1.0-3+b) experimental; urgency=low
+
+ * This entry is present in B only. It's considered new and should thus
+ be in the merged changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:47:38 +0200
+
+test (1.0-3+a) experimental; urgency=low
+
+ * This entry is present in A only. It's considered new and should thus
+ be in the merged changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:44:39 +0200
+
+test (1.0-1) unstable; urgency=low
+
+ * Initial release. (Closes: #XXXXXX)
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:37:46 +0200
+
+vim: et
diff --git a/scripts/t/dpkg_mergechangelogs/ch-merged-pr b/scripts/t/dpkg_mergechangelogs/ch-merged-pr
new file mode 100644
index 0000000..a58f097
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-merged-pr
@@ -0,0 +1,108 @@
+<<<<<<<
+test (2.0-1) unstable; urgency=low
+=======
+test (2.0-1~exp3) unstable; urgency=low
+>>>>>>>
+
+ * Version B with 2.0-1~exp3 contains only up to line 3 while version A
+ with 2.0-1 contains the 5 lines. The resulting version should have the
+ 5 lines without conflict with Algorithm::Merge and a conflict without.
+ * Line 1.
+ * Line 2.
+ * Line 3.
+ * Line 4.
+ * Line 5.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:23:09 +0200
+
+test (1.2-2) unstable; urgency=low
+
+ * This is the last entry in changelog O.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:18:50 +0200
+
+test (1.2-1) unstable; urgency=low
+
+ * This entry should not have conflicts with Algorithm::Merge installed.
+ * I'm the added line mentioned below (B-only).
+ * Changelog B should a have supplementary line above this one.
+ * Pi is 3.14 is true for all changelogs.
+ * Changelog A should have a supplementary line
+ somewhere in this sub-list
+ - The weather is nice
+ - Really no clouds in the sky
+ - Yet I'm hacking on dpkg
+ - What does that mean about me?
+ * This line should be shared but the next one is dropped in B only.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:09:07 +0200
+
+test (1.1-1+conflict2) unstable; urgency=low
+
+ * This entry has a conflict on the next line.
+<<<<<<<
+ * I'm in changelog A.
+=======
+ * I'm in changelog B.
+>>>>>>>
+ * This line is the same in all 3 versions.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:07:40 +0200
+
+<<<<<<<
+test (1.1-1+conflict1) experimental; urgency=low
+=======
+test (1.1-1+conflict1) unstable; urgency=high
+>>>>>>>
+
+ * This entry has conflicts on the header line: A wants distribution
+ experimental (instead of unstable) and B wants urgency=high (instead
+ of low).
+ * But it also has a conflict on the trailer line. A changed the
+ timestamp to 18:05:00 and B to 18:06:00.
+
+<<<<<<<
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:05:00 +0200
+=======
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:06:00 +0200
+>>>>>>>
+
+test (1.1-1+change2) unstable; urgency=low
+
+ * This entry is everywhere but the last line is different in A. The
+ merged version should have what's in A. Furthermore the timestamp in
+ B is set to 17:55:00, it should also be picked up.
+ * I'm definitely in changelog A.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:54:52 +0200
+
+test (1.1-1+change1) unstable; urgency=high
+
+ * This entry is everywhere but the last line is different in B. The
+ merged version should have what's in B. Furthermore the urgency in
+ A is set to high, it should also be picked up.
+ * I'm definitely in changelog B.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:50:58 +0200
+
+test (1.0-3+b) experimental; urgency=low
+
+ * This entry is present in B only. It's considered new and should thus
+ be in the merged changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:47:38 +0200
+
+test (1.0-3+a) experimental; urgency=low
+
+ * This entry is present in A only. It's considered new and should thus
+ be in the merged changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:44:39 +0200
+
+test (1.0-1) unstable; urgency=low
+
+ * Initial release. (Closes: #XXXXXX)
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:37:46 +0200
+
+vim: et
diff --git a/scripts/t/dpkg_mergechangelogs/ch-merged-pr-basic b/scripts/t/dpkg_mergechangelogs/ch-merged-pr-basic
new file mode 100644
index 0000000..7733612
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-merged-pr-basic
@@ -0,0 +1,140 @@
+<<<<<<<
+test (2.0-1) unstable; urgency=low
+=======
+test (2.0-1~exp3) unstable; urgency=low
+>>>>>>>
+
+<<<<<<<
+ * Version B with 2.0-1~exp3 contains only up to line 3 while version A
+ with 2.0-1 contains the 5 lines. The resulting version should have the
+ 5 lines without conflict with Algorithm::Merge and a conflict without.
+ * Line 1.
+ * Line 2.
+ * Line 3.
+ * Line 4.
+ * Line 5.
+=======
+ * Version B with 2.0-1~exp3 contains only up to line 3 while version A
+ with 2.0-1 contains the 5 lines. The resulting version should have the
+ 5 lines without conflict with Algorithm::Merge and a conflict without.
+ * Line 1.
+ * Line 2.
+ * Line 3.
+>>>>>>>
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:23:09 +0200
+
+test (1.2-2) unstable; urgency=low
+
+ * This is the last entry in changelog O.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:18:50 +0200
+
+test (1.2-1) unstable; urgency=low
+
+<<<<<<<
+ * This entry should not have conflicts with Algorithm::Merge installed.
+ * Changelog B should a have supplementary line above this one.
+ * Pi is 3.14 is true for all changelogs.
+ * Changelog A should have a supplementary line
+ somewhere in this sub-list
+ - The weather is nice
+ - Really no clouds in the sky
+ - Yet I'm hacking on dpkg
+ - What does that mean about me?
+ * This line should be shared but the next one is dropped in B only.
+ * If I'm here it's because the changelog is not B (I should not appear
+ in the resulting changelog).
+=======
+ * This entry should not have conflicts with Algorithm::Merge installed.
+ * I'm the added line mentioned below (B-only).
+ * Changelog B should a have supplementary line above this one.
+ * Pi is 3.14 is true for all changelogs.
+ * Changelog A should have a supplementary line
+ somewhere in this sub-list
+ - The weather is nice
+ - Yet I'm hacking on dpkg
+ - What does that mean about me?
+ * This line should be shared but the next one is dropped in B only.
+>>>>>>>
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:09:07 +0200
+
+test (1.1-1+conflict2) unstable; urgency=low
+
+<<<<<<<
+ * This entry has a conflict on the next line.
+ * I'm in changelog A.
+ * This line is the same in all 3 versions.
+=======
+ * This entry has a conflict on the next line.
+ * I'm in changelog B.
+ * This line is the same in all 3 versions.
+>>>>>>>
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:07:40 +0200
+
+<<<<<<<
+test (1.1-1+conflict1) experimental; urgency=low
+=======
+test (1.1-1+conflict1) unstable; urgency=high
+>>>>>>>
+
+ * This entry has conflicts on the header line: A wants distribution
+ experimental (instead of unstable) and B wants urgency=high (instead
+ of low).
+ * But it also has a conflict on the trailer line. A changed the
+ timestamp to 18:05:00 and B to 18:06:00.
+
+<<<<<<<
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:05:00 +0200
+=======
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:06:00 +0200
+>>>>>>>
+
+test (1.1-1+change2) unstable; urgency=low
+
+ * This entry is everywhere but the last line is different in A. The
+ merged version should have what's in A. Furthermore the timestamp in
+ B is set to 17:55:00, it should also be picked up.
+ * I'm definitely in changelog A.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:54:52 +0200
+
+test (1.1-1+change1) unstable; urgency=high
+
+<<<<<<<
+ * This entry is everywhere but the last line is different in B. The
+ merged version should have what's in B. Furthermore the urgency in
+ A is set to high, it should also be picked up.
+ * I'm not in changelog B.
+=======
+ * This entry is everywhere but the last line is different in B. The
+ merged version should have what's in B. Furthermore the urgency in
+ A is set to high, it should also be picked up.
+ * I'm definitely in changelog B.
+>>>>>>>
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:50:58 +0200
+
+test (1.0-3+b) experimental; urgency=low
+
+ * This entry is present in B only. It's considered new and should thus
+ be in the merged changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:47:38 +0200
+
+test (1.0-3+a) experimental; urgency=low
+
+ * This entry is present in A only. It's considered new and should thus
+ be in the merged changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:44:39 +0200
+
+test (1.0-1) unstable; urgency=low
+
+ * Initial release. (Closes: #XXXXXX)
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:37:46 +0200
+
+vim: et
diff --git a/scripts/t/dpkg_mergechangelogs/ch-old b/scripts/t/dpkg_mergechangelogs/ch-old
new file mode 100644
index 0000000..5ff7dd3
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-old
@@ -0,0 +1,87 @@
+test (1.2-2) unstable; urgency=low
+
+ * This is the last entry in changelog O.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:18:50 +0200
+
+test (1.2-1) unstable; urgency=low
+
+ * This entry should not have conflicts with Algorithm::Merge installed.
+ * Changelog B should a have supplementary line above this one.
+ * Pi is 3.14 is true for all changelogs.
+ * Changelog A should have a supplementary line
+ somewhere in this sub-list
+ - The weather is nice
+ - Yet I'm hacking on dpkg
+ - What does that mean about me?
+ * This line should be shared but the next one is dropped in B only.
+ * If I'm here it's because the changelog is not B (I should not appear
+ in the resulting changelog).
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:09:07 +0200
+
+test (1.1-1+conflict2) unstable; urgency=low
+
+ * This entry has a conflict on the next line.
+ * I'm in changelog O (old).
+ * This line is the same in all 3 versions.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:07:40 +0200
+
+test (1.1-1+conflict1) unstable; urgency=low
+
+ * This entry has conflicts on the header line: A wants distribution
+ experimental (instead of unstable) and B wants urgency=high (instead
+ of low).
+ * But it also has a conflict on the trailer line. A changed the
+ timestamp to 18:05:00 and B to 18:06:00.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 18:04:18 +0200
+
+test (1.1-1+change2) unstable; urgency=low
+
+ * This entry is everywhere but the last line is different in A. The
+ merged version should have what's in A. Furthermore the timestamp in
+ B is set to 17:55:00, it should also be picked up.
+ * I'm not in changelog A.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:54:52 +0200
+
+test (1.1-1+change1) unstable; urgency=low
+
+ * This entry is everywhere but the last line is different in B. The
+ merged version should have what's in B. Furthermore the urgency in
+ A is set to high, it should also be picked up.
+ * I'm not in changelog B.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:50:58 +0200
+
+test (1.1-0.1) stable; urgency=low
+
+ * This entry is present in O only, it should not appear in the merged
+ changelog.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:49:15 +0200
+
+test (1.0-3) unstable; urgency=low
+
+ * This entry is dropped in A only.
+ * Since it's in O and B, it should not appear in the result.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:41:31 +0200
+
+test (1.0-2) unstable; urgency=low
+
+ * This entry is dropped in B only.
+ * Since it's in O and A, it should not appear in the result.
+ * Pi is 3.14.
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:39:15 +0200
+
+test (1.0-1) unstable; urgency=low
+
+ * Initial release. (Closes: #XXXXXX)
+
+ -- Raphaël Hertzog <hertzog@debian.org> Sun, 18 Apr 2010 17:37:46 +0200
+
+vim: et
diff --git a/scripts/t/dpkg_mergechangelogs/ch-unreleased-a b/scripts/t/dpkg_mergechangelogs/ch-unreleased-a
new file mode 100644
index 0000000..d86d3ff
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-unreleased-a
@@ -0,0 +1,12 @@
+test (1.2-0) UNRELEASED; urgency=low
+
+ * New upstream release.
+ - Adds a new feature.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Thu, 02 Sep 2021 05:26:30 +0200
+
+test (1.0-1) unstable; urgency=low
+
+ * Initial release.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Wed, 20 Aug 1997 00:36:28 +0000
diff --git a/scripts/t/dpkg_mergechangelogs/ch-unreleased-b b/scripts/t/dpkg_mergechangelogs/ch-unreleased-b
new file mode 100644
index 0000000..96263e3
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-unreleased-b
@@ -0,0 +1,12 @@
+test (1.1-1) UNRELEASED; urgency=low
+
+ * New upstream release.
+ - Fixes a random bug.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Wed, 01 Sep 2021 05:27:48 +0200
+
+test (1.0) unstable; urgency=low
+
+ * Initial release.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Wed, 20 Aug 1997 00:36:28 +0000
diff --git a/scripts/t/dpkg_mergechangelogs/ch-unreleased-merged b/scripts/t/dpkg_mergechangelogs/ch-unreleased-merged
new file mode 100644
index 0000000..5fbf866
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-unreleased-merged
@@ -0,0 +1,24 @@
+<<<<<<<
+test (1.2-0) UNRELEASED; urgency=low
+=======
+test (1.1-1) UNRELEASED; urgency=low
+>>>>>>>
+
+ * New upstream release.
+<<<<<<<
+ - Adds a new feature.
+=======
+ - Fixes a random bug.
+>>>>>>>
+
+<<<<<<<
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Thu, 02 Sep 2021 05:26:30 +0200
+=======
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Wed, 01 Sep 2021 05:27:48 +0200
+>>>>>>>
+
+test (1.0-1) unstable; urgency=low
+
+ * Initial release.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Wed, 20 Aug 1997 00:36:28 +0000
diff --git a/scripts/t/dpkg_mergechangelogs/ch-unreleased-merged-basic b/scripts/t/dpkg_mergechangelogs/ch-unreleased-merged-basic
new file mode 100644
index 0000000..dd6938c
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-unreleased-merged-basic
@@ -0,0 +1,25 @@
+<<<<<<<
+test (1.2-0) UNRELEASED; urgency=low
+=======
+test (1.1-1) UNRELEASED; urgency=low
+>>>>>>>
+
+<<<<<<<
+ * New upstream release.
+ - Adds a new feature.
+=======
+ * New upstream release.
+ - Fixes a random bug.
+>>>>>>>
+
+<<<<<<<
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Thu, 02 Sep 2021 05:26:30 +0200
+=======
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Wed, 01 Sep 2021 05:27:48 +0200
+>>>>>>>
+
+test (1.0-1) unstable; urgency=low
+
+ * Initial release.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Wed, 20 Aug 1997 00:36:28 +0000
diff --git a/scripts/t/dpkg_mergechangelogs/ch-unreleased-old b/scripts/t/dpkg_mergechangelogs/ch-unreleased-old
new file mode 100644
index 0000000..e9377c3
--- /dev/null
+++ b/scripts/t/dpkg_mergechangelogs/ch-unreleased-old
@@ -0,0 +1,5 @@
+test (1.0) unstable; urgency=low
+
+ * Initial release.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Wed, 20 Aug 1997 00:36:28 +0000
diff --git a/scripts/t/dpkg_source.t b/scripts/t/dpkg_source.t
new file mode 100644
index 0000000..056aa95
--- /dev/null
+++ b/scripts/t/dpkg_source.t
@@ -0,0 +1,184 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Dpkg qw(:needs :paths test_neutralize_checksums);
+
+use File::Spec::Functions qw(rel2abs);
+use File::Compare;
+use File::Path qw(make_path);
+
+use Dpkg::File;
+use Dpkg::IPC;
+use Dpkg::Substvars;
+
+test_needs_command('xz');
+
+plan tests => 8;
+
+my $srcdir = rel2abs($ENV{srcdir} || '.');
+my $datadir = "$srcdir/t/dpkg_source";
+my $tmpdir = test_get_temp_path();
+
+$ENV{$_} = rel2abs($ENV{$_}) foreach qw(DPKG_DATADIR DPKG_ORIGINS_DIR);
+
+# Delete variables that can affect the tests.
+delete $ENV{SOURCE_DATE_EPOCH};
+
+chdir $tmpdir;
+
+my $tmpl_format = <<'TMPL_FORMAT';
+3.0 (native)
+TMPL_FORMAT
+
+my $tmpl_changelog = <<'TMPL_CHANGELOG';
+${source-name} (${source-version}) ${suite}; urgency=${urgency}
+
+ * Test package.
+
+ -- ${maintainer} Sat, 05 Jul 2014 21:11:22 +0200
+TMPL_CHANGELOG
+
+my $tmpl_control = <<'TMPL_CONTROL';
+Source: ${source-name}
+Section: ${source-section}
+Priority: ${source-priority}
+Maintainer: ${maintainer}
+Standards-Version: 1.0
+Testsuite: ${source-testsuite}
+
+Package: test-binary
+Architecture: all
+Description: test package
+TMPL_CONTROL
+
+my $tmpl_control_tests = <<'TMPL_CONTROL_TESTS';
+Test-Command: test-unique
+Depends: @, aa
+
+Tests: test-dupe
+Depends: @builddeps@
+
+Test-Command: test-dupe
+Depends: bb, test-binary
+
+Test-Command: test-dupe
+Depends: cc
+TMPL_CONTROL_TESTS
+
+my %default_substvars = (
+ 'source-name' => 'test-source',
+ 'source-version' => 0,
+ 'source-section' => 'test',
+ 'source-priority' => 'optional',
+ 'source-testsuite' => 'autopkgtest',
+ 'suite' => 'unstable',
+ 'urgency' => 'low',
+ 'maintainer' => 'Dpkg Developers <debian-dpkg@lists.debian.org>',
+);
+
+sub gen_from_tmpl
+{
+ my ($pathname, $tmpl, $substvars) = @_;
+
+ file_dump($pathname, $substvars->substvars($tmpl));
+}
+
+sub gen_source
+{
+ my (%options) = @_;
+
+ my $substvars = Dpkg::Substvars->new();
+ foreach my $var ((keys %default_substvars, keys %options)) {
+ my $value = $options{$var} // $default_substvars{$var};
+
+ $substvars->set_as_auto($var, $value);
+ }
+
+ my $source = $substvars->get('source-name');
+ my $version = $substvars->get('source-version');
+ my $dirname = "$source-$version";
+
+ make_path("$dirname/debian/source");
+
+ gen_from_tmpl("$dirname/debian/source/format", $tmpl_format, $substvars);
+ gen_from_tmpl("$dirname/debian/changelog", $tmpl_changelog, $substvars);
+ gen_from_tmpl("$dirname/debian/control", $tmpl_control, $substvars);
+
+ if (defined $options{'control-test'}) {
+ make_path("$dirname/debian/tests");
+ gen_from_tmpl("$dirname/debian/tests/control", $options{'control-test'}, $substvars);
+ }
+
+ return $dirname;
+}
+
+sub test_diff
+{
+ my $filename = shift;
+
+ my $expected_file = "$datadir/$filename";
+ my $generated_file = $filename;
+
+ test_neutralize_checksums($generated_file);
+
+ my $res = compare($expected_file, $generated_file);
+ if ($res) {
+ system "diff -u $expected_file $generated_file >&2";
+ }
+ ok($res == 0, "generated file matches expected one ($expected_file)");
+}
+
+sub test_build_source
+{
+ my ($name) = shift;
+ my $stderr;
+
+ spawn(exec => [ $ENV{PERL}, "$srcdir/dpkg-source.pl", '--build', $name ],
+ error_to_string => \$stderr,
+ wait_child => 1, nocheck => 1);
+
+ ok($? == 0, 'dpkg-source --build succeeded');
+ diag($stderr) unless $? == 0;
+
+ my $basename = $name =~ tr/-/_/r;
+
+ test_diff("$basename.dsc");
+}
+
+my $dirname;
+
+$dirname = gen_source('source-name' => 'testsuite',
+ 'source-version' => 0,
+ 'control-test' => '');
+test_build_source($dirname);
+
+$dirname = gen_source('source-name' => 'testsuite',
+ 'source-version' => 1,
+ 'control-test' => '');
+test_build_source($dirname);
+
+$dirname = gen_source('source-name' => 'testsuite',
+ 'source-version' => 2,
+ 'source-testsuite' => 'smokepkgtest, unitpkgtest, funcpkgtest',
+ 'control-test' => $tmpl_control_tests);
+test_build_source($dirname);
+
+$dirname = gen_source('source-name' => 'testsuite',
+ 'source-version' => 3);
+test_build_source($dirname);
diff --git a/scripts/t/dpkg_source/testsuite_0.dsc b/scripts/t/dpkg_source/testsuite_0.dsc
new file mode 100644
index 0000000..4ec33a4
--- /dev/null
+++ b/scripts/t/dpkg_source/testsuite_0.dsc
@@ -0,0 +1,16 @@
+Format: 3.0 (native)
+Source: testsuite
+Binary: test-binary
+Architecture: all
+Version: 0
+Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
+Standards-Version: 1.0
+Testsuite: autopkgtest
+Package-List:
+ test-binary deb test optional arch=all
+Checksums-Sha1:
+ 0000000000000000000000000000000000000000 0 testsuite_0.tar.xz
+Checksums-Sha256:
+ 0000000000000000000000000000000000000000000000000000000000000000 0 testsuite_0.tar.xz
+Files:
+ 00000000000000000000000000000000 0 testsuite_0.tar.xz
diff --git a/scripts/t/dpkg_source/testsuite_1.dsc b/scripts/t/dpkg_source/testsuite_1.dsc
new file mode 100644
index 0000000..c408625
--- /dev/null
+++ b/scripts/t/dpkg_source/testsuite_1.dsc
@@ -0,0 +1,16 @@
+Format: 3.0 (native)
+Source: testsuite
+Binary: test-binary
+Architecture: all
+Version: 1
+Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
+Standards-Version: 1.0
+Testsuite: autopkgtest
+Package-List:
+ test-binary deb test optional arch=all
+Checksums-Sha1:
+ 0000000000000000000000000000000000000000 0 testsuite_1.tar.xz
+Checksums-Sha256:
+ 0000000000000000000000000000000000000000000000000000000000000000 0 testsuite_1.tar.xz
+Files:
+ 00000000000000000000000000000000 0 testsuite_1.tar.xz
diff --git a/scripts/t/dpkg_source/testsuite_2.dsc b/scripts/t/dpkg_source/testsuite_2.dsc
new file mode 100644
index 0000000..184c47e
--- /dev/null
+++ b/scripts/t/dpkg_source/testsuite_2.dsc
@@ -0,0 +1,17 @@
+Format: 3.0 (native)
+Source: testsuite
+Binary: test-binary
+Architecture: all
+Version: 2
+Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
+Standards-Version: 1.0
+Testsuite: autopkgtest, funcpkgtest, smokepkgtest, unitpkgtest
+Testsuite-Triggers: @builddeps@, aa, bb, cc
+Package-List:
+ test-binary deb test optional arch=all
+Checksums-Sha1:
+ 0000000000000000000000000000000000000000 0 testsuite_2.tar.xz
+Checksums-Sha256:
+ 0000000000000000000000000000000000000000000000000000000000000000 0 testsuite_2.tar.xz
+Files:
+ 00000000000000000000000000000000 0 testsuite_2.tar.xz
diff --git a/scripts/t/dpkg_source/testsuite_3.dsc b/scripts/t/dpkg_source/testsuite_3.dsc
new file mode 100644
index 0000000..88be231
--- /dev/null
+++ b/scripts/t/dpkg_source/testsuite_3.dsc
@@ -0,0 +1,15 @@
+Format: 3.0 (native)
+Source: testsuite
+Binary: test-binary
+Architecture: all
+Version: 3
+Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
+Standards-Version: 1.0
+Package-List:
+ test-binary deb test optional arch=all
+Checksums-Sha1:
+ 0000000000000000000000000000000000000000 0 testsuite_3.tar.xz
+Checksums-Sha256:
+ 0000000000000000000000000000000000000000000000000000000000000000 0 testsuite_3.tar.xz
+Files:
+ 00000000000000000000000000000000 0 testsuite_3.tar.xz
diff --git a/scripts/t/mk.t b/scripts/t/mk.t
new file mode 100644
index 0000000..a31eef7
--- /dev/null
+++ b/scripts/t/mk.t
@@ -0,0 +1,153 @@
+#!/usr/bin/perl
+#
+# 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; either 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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More tests => 12;
+use Test::Dpkg qw(:paths);
+
+use File::Spec::Functions qw(rel2abs);
+
+use Dpkg ();
+use Dpkg::ErrorHandling;
+use Dpkg::IPC;
+use Dpkg::Vendor;
+
+my $srcdir = rel2abs($ENV{srcdir} || '.');
+my $datadir = test_get_data_path();
+
+# Turn these into absolute names so that we can safely switch to the test
+# directory with «make -C».
+$ENV{$_} = rel2abs($ENV{$_}) foreach qw(srcdir DPKG_DATADIR DPKG_ORIGINS_DIR);
+
+# Any parallelization from the parent should be ignored, we are testing
+# the makefiles serially anyway.
+delete $ENV{MAKEFLAGS};
+
+# Delete other variables that can affect the tests.
+delete $ENV{$_} foreach grep { m/^DEB_/ } keys %ENV;
+
+# Set architecture variables to not require dpkg nor gcc.
+$ENV{PATH} = "$srcdir/t/mock-bin:$ENV{PATH}";
+
+$ENV{DEB_BUILD_PATH} = rel2abs($datadir);
+
+sub test_makefile {
+ my ($makefile, $desc) = @_;
+
+ $desc //= 'default';
+
+ spawn(exec => [ $Dpkg::PROGMAKE, '-C', $datadir, '-f', $makefile ],
+ wait_child => 1, nocheck => 1);
+ ok($? == 0, "makefile $makefile computes all values correctly ($desc)");
+}
+
+sub cmd_get_vars {
+ my (@cmd) = @_;
+ my %var;
+
+ open my $cmd_fh, '-|', @cmd or subprocerr($cmd[0]);
+ while (<$cmd_fh>) {
+ chomp;
+ my ($key, $value) = split /=/, $_, 2;
+ $var{$key} = $value;
+ }
+ close $cmd_fh or subprocerr($cmd[0]);
+
+ return %var;
+}
+
+# Test makefiles.
+
+my %arch = cmd_get_vars($ENV{PERL}, "$srcdir/dpkg-architecture.pl", '-f');
+
+while (my ($k, $v) = each %arch) {
+ delete $ENV{$k};
+ $ENV{"TEST_$k"} = $v;
+}
+test_makefile('architecture.mk', 'without envvars');
+while (my ($k, $v) = each %arch) {
+ $ENV{$k} = $v;
+}
+test_makefile('architecture.mk', 'with envvars');
+
+test_makefile('buildapi.mk');
+
+$ENV{DEB_BUILD_OPTIONS} = 'parallel=16';
+$ENV{TEST_DEB_BUILD_OPTION_PARALLEL} = '16';
+test_makefile('buildopts.mk');
+delete $ENV{DEB_BUILD_OPTIONS};
+delete $ENV{TEST_DEB_BUILD_OPTION_PARALLEL};
+
+my %buildflag = cmd_get_vars($ENV{PERL}, "$srcdir/dpkg-buildflags.pl");
+
+while (my ($var, $flags) = each %buildflag) {
+ delete $ENV{$var};
+ $ENV{"TEST_$var"} = $flags;
+}
+test_makefile('buildflags.mk');
+
+my %buildtools = (
+ AS => 'as',
+ CPP => 'gcc -E',
+ CC => 'gcc',
+ CXX => 'g++',
+ OBJC => 'gcc',
+ OBJCXX => 'g++',
+ F77 => 'gfortran',
+ FC => 'gfortran',
+ LD => 'ld',
+ STRIP => 'strip',
+ OBJCOPY => 'objcopy',
+ OBJDUMP => 'objdump',
+ NM => 'nm',
+ AR => 'ar',
+ RANLIB => 'ranlib',
+ PKG_CONFIG => 'pkgconf',
+);
+
+while (my ($var, $tool) = each %buildtools) {
+ delete $ENV{$var};
+ $ENV{"TEST_$var"} = "$ENV{DEB_HOST_GNU_TYPE}-$tool";
+ delete $ENV{"${var}_FOR_BUILD"};
+ $ENV{"TEST_${var}_FOR_BUILD"} = "$ENV{DEB_BUILD_GNU_TYPE}-$tool";
+}
+test_makefile('buildtools.mk', 'without envvars');
+
+$ENV{DEB_BUILD_OPTIONS} = 'nostrip';
+$ENV{TEST_STRIP} = ':';
+$ENV{TEST_STRIP_FOR_BUILD} = ':';
+test_makefile('buildtools.mk', 'with envvars');
+delete $ENV{DEB_BUILD_OPTIONS};
+
+foreach my $tool (keys %buildtools) {
+ delete $ENV{${tool}};
+ delete $ENV{"${tool}_FOR_BUILD"};
+}
+
+delete $ENV{SOURCE_DATE_EPOCH};
+# Timestamp in seconds since the epoch from date in test debian/changelog
+# entry: «Tue, 04 Aug 2015 16:13:50 +0200».
+$ENV{TEST_SOURCE_DATE_EPOCH} = 1438697630;
+test_makefile('pkg-info.mk');
+
+$ENV{SOURCE_DATE_EPOCH} = 100;
+$ENV{TEST_SOURCE_DATE_EPOCH} = 100;
+test_makefile('pkg-info.mk');
+
+test_makefile('vendor.mk');
+test_makefile('vendor-v0.mk');
+test_makefile('vendor-v1.mk');
diff --git a/scripts/t/mk/architecture.mk b/scripts/t/mk/architecture.mk
new file mode 100644
index 0000000..2ac0222
--- /dev/null
+++ b/scripts/t/mk/architecture.mk
@@ -0,0 +1,36 @@
+include $(srcdir)/mk/architecture.mk
+
+test:
+ test "$(DEB_BUILD_ARCH)" = "$(TEST_DEB_BUILD_ARCH)"
+ test "$(DEB_BUILD_ARCH_ABI)" = "$(TEST_DEB_BUILD_ARCH_ABI)"
+ test "$(DEB_BUILD_ARCH_BITS)" = "$(TEST_DEB_BUILD_ARCH_BITS)"
+ test "$(DEB_BUILD_ARCH_CPU)" = "$(TEST_DEB_BUILD_ARCH_CPU)"
+ test "$(DEB_BUILD_ARCH_ENDIAN)" = "$(TEST_DEB_BUILD_ARCH_ENDIAN)"
+ test "$(DEB_BUILD_ARCH_LIBC)" = "$(TEST_DEB_BUILD_ARCH_LIBC)"
+ test "$(DEB_BUILD_ARCH_OS)" = "$(TEST_DEB_BUILD_ARCH_OS)"
+ test "$(DEB_BUILD_GNU_CPU)" = "$(TEST_DEB_BUILD_GNU_CPU)"
+ test "$(DEB_BUILD_GNU_SYSTEM)" = "$(TEST_DEB_BUILD_GNU_SYSTEM)"
+ test "$(DEB_BUILD_GNU_TYPE)" = "$(TEST_DEB_BUILD_GNU_TYPE)"
+ test "$(DEB_BUILD_MULTIARCH)" = "$(TEST_DEB_BUILD_MULTIARCH)"
+ test "$(DEB_HOST_ARCH)" = "$(TEST_DEB_HOST_ARCH)"
+ test "$(DEB_HOST_ARCH_ABI)" = "$(TEST_DEB_HOST_ARCH_ABI)"
+ test "$(DEB_HOST_ARCH_BITS)" = "$(TEST_DEB_HOST_ARCH_BITS)"
+ test "$(DEB_HOST_ARCH_CPU)" = "$(TEST_DEB_HOST_ARCH_CPU)"
+ test "$(DEB_HOST_ARCH_ENDIAN)" = "$(TEST_DEB_HOST_ARCH_ENDIAN)"
+ test "$(DEB_HOST_ARCH_LIBC)" = "$(TEST_DEB_HOST_ARCH_LIBC)"
+ test "$(DEB_HOST_ARCH_OS)" = "$(TEST_DEB_HOST_ARCH_OS)"
+ test "$(DEB_HOST_GNU_CPU)" = "$(TEST_DEB_HOST_GNU_CPU)"
+ test "$(DEB_HOST_GNU_SYSTEM)" = "$(TEST_DEB_HOST_GNU_SYSTEM)"
+ test "$(DEB_HOST_GNU_TYPE)" = "$(TEST_DEB_HOST_GNU_TYPE)"
+ test "$(DEB_HOST_MULTIARCH)" = "$(TEST_DEB_HOST_MULTIARCH)"
+ test "$(DEB_TARGET_ARCH)" = "$(TEST_DEB_TARGET_ARCH)"
+ test "$(DEB_TARGET_ARCH_ABI)" = "$(TEST_DEB_TARGET_ARCH_ABI)"
+ test "$(DEB_TARGET_ARCH_BITS)" = "$(TEST_DEB_TARGET_ARCH_BITS)"
+ test "$(DEB_TARGET_ARCH_CPU)" = "$(TEST_DEB_TARGET_ARCH_CPU)"
+ test "$(DEB_TARGET_ARCH_ENDIAN)" = "$(TEST_DEB_TARGET_ARCH_ENDIAN)"
+ test "$(DEB_TARGET_ARCH_LIBC)" = "$(TEST_DEB_TARGET_ARCH_LIBC)"
+ test "$(DEB_TARGET_ARCH_OS)" = "$(TEST_DEB_TARGET_ARCH_OS)"
+ test "$(DEB_TARGET_GNU_CPU)" = "$(TEST_DEB_TARGET_GNU_CPU)"
+ test "$(DEB_TARGET_GNU_SYSTEM)" = "$(TEST_DEB_TARGET_GNU_SYSTEM)"
+ test "$(DEB_TARGET_GNU_TYPE)" = "$(TEST_DEB_TARGET_GNU_TYPE)"
+ test "$(DEB_TARGET_MULTIARCH)" = "$(TEST_DEB_TARGET_MULTIARCH)"
diff --git a/scripts/t/mk/buildapi.mk b/scripts/t/mk/buildapi.mk
new file mode 100644
index 0000000..96269bc
--- /dev/null
+++ b/scripts/t/mk/buildapi.mk
@@ -0,0 +1,4 @@
+include $(srcdir)/mk/buildapi.mk
+
+test:
+ test "$(DPKG_BUILD_API)" = "0"
diff --git a/scripts/t/mk/buildflags.mk b/scripts/t/mk/buildflags.mk
new file mode 100644
index 0000000..94d85a7
--- /dev/null
+++ b/scripts/t/mk/buildflags.mk
@@ -0,0 +1,26 @@
+DEB_CPPFLAGS_MAINT_APPEND = -DTEST_MK=test-host
+DEB_CPPFLAGS_FOR_BUILD_MAINT_APPEND = -DTEST_MK=test-build
+
+include $(srcdir)/mk/buildflags.mk
+
+test:
+ test "$(ASFLAGS)" = "$(TEST_ASFLAGS)"
+ test "$(ASFLAGS_FOR_BUILD)" = "$(TEST_ASFLAGS_FOR_BUILD)"
+ test "$(CFLAGS)" = "$(TEST_CFLAGS)"
+ test "$(CFLAGS_FOR_BUILD)" = "$(TEST_CFLAGS_FOR_BUILD)"
+ test "$(CPPFLAGS)" = "$(TEST_CPPFLAGS) -DTEST_MK=test-host"
+ test "$(CPPFLAGS_FOR_BUILD)" = "$(TEST_CPPFLAGS_FOR_BUILD)-DTEST_MK=test-build"
+ test "$(CXXFLAGS)" = "$(TEST_CXXFLAGS)"
+ test "$(CXXFLAGS_FOR_BUILD)" = "$(TEST_CXXFLAGS_FOR_BUILD)"
+ test "$(DFLAGS)" = "$(TEST_DFLAGS)"
+ test "$(DFLAGS_FOR_BUILD)" = "$(TEST_DFLAGS_FOR_BUILD)"
+ test "$(FCFLAGS)" = "$(TEST_FCFLAGS)"
+ test "$(FCFLAGS_FOR_BUILD)" = "$(TEST_FCFLAGS_FOR_BUILD)"
+ test "$(FFLAGS)" = "$(TEST_FFLAGS)"
+ test "$(FFLAGS_FOR_BUILD)" = "$(TEST_FFLAGS_FOR_BUILD)"
+ test "$(LDFLAGS)" = "$(TEST_LDFLAGS)"
+ test "$(LDFLAGS_FOR_BUILD)" = "$(TEST_LDFLAGS_FOR_BUILD)"
+ test "$(OBJCFLAGS)" = "$(TEST_OBJCFLAGS)"
+ test "$(OBJCFLAGS_FOR_BUILD)" = "$(TEST_OBJCFLAGS_FOR_BUILD)"
+ test "$(OBJCXXFLAGS)" = "$(TEST_OBJCXXFLAGS)"
+ test "$(OBJCXXFLAGS_FOR_BUILD)" = "$(TEST_OBJCXXFLAGS_FOR_BUILD)"
diff --git a/scripts/t/mk/buildopts.mk b/scripts/t/mk/buildopts.mk
new file mode 100644
index 0000000..46d0efa
--- /dev/null
+++ b/scripts/t/mk/buildopts.mk
@@ -0,0 +1,4 @@
+include $(srcdir)/mk/buildopts.mk
+
+test:
+ test "$(DEB_BUILD_OPTION_PARALLEL)" = "$(TEST_DEB_BUILD_OPTION_PARALLEL)"
diff --git a/scripts/t/mk/buildtools.mk b/scripts/t/mk/buildtools.mk
new file mode 100644
index 0000000..6c27c5c
--- /dev/null
+++ b/scripts/t/mk/buildtools.mk
@@ -0,0 +1,33 @@
+include $(srcdir)/mk/buildtools.mk
+
+test:
+ test "$(AS)" = "$(TEST_AS)"
+ test "$(AS_FOR_BUILD)" = "$(TEST_AS_FOR_BUILD)"
+ test "$(CC)" = "$(TEST_CC)"
+ test "$(CC_FOR_BUILD)" = "$(TEST_CC_FOR_BUILD)"
+ test "$(CXX)" = "$(TEST_CXX)"
+ test "$(CXX_FOR_BUILD)" = "$(TEST_CXX_FOR_BUILD)"
+ test "$(OBJC)" = "$(TEST_OBJC)"
+ test "$(OBJC_FOR_BUILD)" = "$(TEST_OBJC_FOR_BUILD)"
+ test "$(OBJCXX)" = "$(TEST_OBJCXX)"
+ test "$(OBJCXX_FOR_BUILD)" = "$(TEST_OBJCXX_FOR_BUILD)"
+ test "$(F77)" = "$(TEST_F77)"
+ test "$(F77_FOR_BUILD)" = "$(TEST_F77_FOR_BUILD)"
+ test "$(FC)" = "$(TEST_FC)"
+ test "$(FC_FOR_BUILD)" = "$(TEST_FC_FOR_BUILD)"
+ test "$(LD)" = "$(TEST_LD)"
+ test "$(LD_FOR_BUILD)" = "$(TEST_LD_FOR_BUILD)"
+ test "$(STRIP)" = "$(TEST_STRIP)"
+ test "$(STRIP_FOR_BUILD)" = "$(TEST_STRIP_FOR_BUILD)"
+ test "$(OBJCOPY)" = "$(TEST_OBJCOPY)"
+ test "$(OBJCOPY_FOR_BUILD)" = "$(TEST_OBJCOPY_FOR_BUILD)"
+ test "$(OBJDUMP)" = "$(TEST_OBJDUMP)"
+ test "$(OBJDUMP_FOR_BUILD)" = "$(TEST_OBJDUMP_FOR_BUILD)"
+ test "$(NM)" = "$(TEST_NM)"
+ test "$(NM_FOR_BUILD)" = "$(TEST_NM_FOR_BUILD)"
+ test "$(AR)" = "$(TEST_AR)"
+ test "$(AR_FOR_BUILD)" = "$(TEST_AR_FOR_BUILD)"
+ test "$(RANLIB)" = "$(TEST_RANLIB)"
+ test "$(RANLIB_FOR_BUILD)" = "$(TEST_RANLIB_FOR_BUILD)"
+ test "$(PKG_CONFIG)" = "$(TEST_PKG_CONFIG)"
+ test "$(PKG_CONFIG_FOR_BUILD)" = "$(TEST_PKG_CONFIG_FOR_BUILD)"
diff --git a/scripts/t/mk/debian/changelog b/scripts/t/mk/debian/changelog
new file mode 100644
index 0000000..728c8ec
--- /dev/null
+++ b/scripts/t/mk/debian/changelog
@@ -0,0 +1,5 @@
+source (1:2:3.4-5-6) suite; urgency=low
+
+ * Initial release.
+
+ -- Dpkg Developers <debian-dpkg@lists.debian.org> Tue, 04 Aug 2015 16:13:50 +0200
diff --git a/scripts/t/mk/debian/control b/scripts/t/mk/debian/control
new file mode 100644
index 0000000..43b35d3
--- /dev/null
+++ b/scripts/t/mk/debian/control
@@ -0,0 +1,6 @@
+Source: source
+Build-Depends:
+ dpkg-build-api (= 0),
+
+Package: binary
+Architecture: all
diff --git a/scripts/t/mk/pkg-info.mk b/scripts/t/mk/pkg-info.mk
new file mode 100644
index 0000000..c0e3287
--- /dev/null
+++ b/scripts/t/mk/pkg-info.mk
@@ -0,0 +1,11 @@
+include $(srcdir)/mk/pkg-info.mk
+
+test:
+ test "$(DEB_SOURCE)" = "source"
+ test "$(DEB_VERSION)" = "1:2:3.4-5-6"
+ test "$(DEB_VERSION_EPOCH_UPSTREAM)" = "1:2:3.4-5"
+ test "$(DEB_VERSION_UPSTREAM_REVISION)" = "2:3.4-5-6"
+ test "$(DEB_VERSION_UPSTREAM)" = "2:3.4-5"
+ test "$(DEB_DISTRIBUTION)" = "suite"
+ test '$(SOURCE_DATE_EPOCH)' = '$(TEST_SOURCE_DATE_EPOCH)'
+ test "$${SOURCE_DATE_EPOCH}" = '$(TEST_SOURCE_DATE_EPOCH)'
diff --git a/scripts/t/mk/vendor-v0.mk b/scripts/t/mk/vendor-v0.mk
new file mode 100644
index 0000000..602a8c6
--- /dev/null
+++ b/scripts/t/mk/vendor-v0.mk
@@ -0,0 +1,6 @@
+dpkg_vendor_derives_from = $(dpkg_vendor_derives_from_v0)
+
+include $(srcdir)/mk/vendor.mk
+
+test:
+ test "$(shell $(call dpkg_vendor_derives_from,debian))" = "yes"
diff --git a/scripts/t/mk/vendor-v1.mk b/scripts/t/mk/vendor-v1.mk
new file mode 100644
index 0000000..11c1314
--- /dev/null
+++ b/scripts/t/mk/vendor-v1.mk
@@ -0,0 +1,6 @@
+include $(srcdir)/mk/vendor.mk
+
+dpkg_vendor_derives_from = $(dpkg_vendor_derives_from_v1)
+
+test:
+ test "$(call dpkg_vendor_derives_from,debian)" = "yes"
diff --git a/scripts/t/mk/vendor.mk b/scripts/t/mk/vendor.mk
new file mode 100644
index 0000000..4e0d9ff
--- /dev/null
+++ b/scripts/t/mk/vendor.mk
@@ -0,0 +1,6 @@
+include $(srcdir)/mk/vendor.mk
+
+test:
+ test "$(DEB_VENDOR)" = "Debian"
+ test "$(DEB_PARENT_VENDOR)" = ""
+ test "$(shell $(call dpkg_vendor_derives_from,debian))" = "yes"
diff --git a/scripts/t/mock-bin/dpkg b/scripts/t/mock-bin/dpkg
new file mode 100755
index 0000000..fbfba35
--- /dev/null
+++ b/scripts/t/mock-bin/dpkg
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+set -e
+
+args="$@"
+
+while [ $# -gt 0 ]; do
+ opt="$1"
+ shift
+
+ case "$opt" in
+ --print-architecture)
+ echo amd64
+ exit 0
+ esac
+done
+
+# Otherwise fail hard.
+echo "$0: unsupported command ($args) in mock wrapper"
+exit 1
diff --git a/scripts/t/mock-bin/gcc b/scripts/t/mock-bin/gcc
new file mode 100755
index 0000000..0174f17
--- /dev/null
+++ b/scripts/t/mock-bin/gcc
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+set -e
+
+args="$@"
+
+while [ $# -gt 0 ]; do
+ opt="$1"
+ shift
+
+ case "$opt" in
+ -dumpmachine)
+ echo x86_64-linux-gnu
+ exit 0
+ esac
+done
+
+# Otherwise fail hard.
+echo "$0: unsupported command ($args) in mock wrapper"
+exit 1
diff --git a/scripts/t/origins/debian b/scripts/t/origins/debian
new file mode 100644
index 0000000..3b623d2
--- /dev/null
+++ b/scripts/t/origins/debian
@@ -0,0 +1,3 @@
+Vendor: Debian
+Vendor-URL: https://www.debian.org/
+Bugs: debbugs://bugs.debian.org
diff --git a/scripts/t/origins/default b/scripts/t/origins/default
new file mode 100644
index 0000000..3b623d2
--- /dev/null
+++ b/scripts/t/origins/default
@@ -0,0 +1,3 @@
+Vendor: Debian
+Vendor-URL: https://www.debian.org/
+Bugs: debbugs://bugs.debian.org
diff --git a/scripts/t/origins/devuan b/scripts/t/origins/devuan
new file mode 100644
index 0000000..5333148
--- /dev/null
+++ b/scripts/t/origins/devuan
@@ -0,0 +1,4 @@
+Vendor: Devuan
+Vendor-URL: https://www.devuan.org/
+Bugs: debbugs://bugs.devuan.org
+Parent: Debian
diff --git a/scripts/t/origins/gnewsense b/scripts/t/origins/gnewsense
new file mode 100644
index 0000000..e67f862
--- /dev/null
+++ b/scripts/t/origins/gnewsense
@@ -0,0 +1,4 @@
+Vendor: gNewSense
+Vendor-URL: http://www.gnewsense.org/
+Bugs: https://savannah.nongnu.org/bugs/?group=gnewsense
+Parent: Debian
diff --git a/scripts/t/origins/ubuntu b/scripts/t/origins/ubuntu
new file mode 100644
index 0000000..9ebae11
--- /dev/null
+++ b/scripts/t/origins/ubuntu
@@ -0,0 +1,4 @@
+Vendor: Ubuntu
+Vendor-URL: https://www.ubuntu.com/
+Bugs: https://bugs.launchpad.net/ubuntu/+filebug
+Parent: Debian