xref: /openbsd-src/usr.bin/libtool/LT/Archive.pm (revision f41ccc36c98bb70900c901ba8385dbb26f3cea97)
1# $OpenBSD: Archive.pm,v 1.8 2023/07/06 08:29:26 espie Exp $
2
3# Copyright (c) 2007-2010 Steven Mestdagh <steven@openbsd.org>
4# Copyright (c) 2012 Marc Espie <espie@openbsd.org>
5#
6# Permission to use, copy, modify, and distribute this software for any
7# purpose with or without fee is hereby granted, provided that the above
8# copyright notice and this permission notice appear in all copies.
9#
10# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18use v5.36;
19
20package LT::Archive;
21use LT::Trace;
22use LT::Exec;
23use LT::UList;
24use LT::Util;
25use File::Path;
26
27sub extract($self, $dir, $archive)
28{
29	if (! -d $dir) {
30		tsay {"mkdir -p $dir"};
31		File::Path::mkpath($dir);
32	}
33	LT::Exec->chdir($dir)->link('ar', 'x', $archive);
34}
35
36sub get_objlist($self, $a)
37{
38	open(my $arh, '-|', 'ar', 't', $a);
39	my @o = <$arh>;
40	close $arh;
41	map { chomp; } @o;
42	return @o;
43}
44
45sub get_symbollist($self, $filepath, $regex, $objlist)
46{
47
48	if (@$objlist == 0) {
49		die "get_symbollist: object list is empty\n";
50	}
51
52	tsay {"generating symbol list in file: $filepath"};
53	tsay {"object list is @$objlist" };
54	my $symbols = LT::UList->new;
55	open(my $sh, '-|', 'nm', '--', @$objlist) or
56	    die "Error running nm on object list @$objlist\n";
57	my $c = 0;
58	while (my $line = <$sh>) {
59		chomp $line;
60		tsay {"$c: $line"};
61		if ($line =~ m/\S+\s+[BCDEGRST]\s+(.*)/) {
62			my $s = $1;
63			if ($s =~ m/$regex/) {
64				push @$symbols, $s;
65				tsay {"matched"};
66			}
67		}
68		$c++;
69	}
70	open(my $fh, '>', $filepath) or die "Cannot open $filepath\n";
71	print $fh map { "$_\n" } sort @$symbols;
72}
73
741;
75