xref: /freebsd/crypto/openssl/util/checkplatformsyms.pl (revision e7be843b4a162e68651d3911f0357ed464915629)
1*e7be843bSPierre Pronchery#! /usr/bin/env perl
2*e7be843bSPierre Pronchery# Copyright 2006-2023 The OpenSSL Project Authors. All Rights Reserved.
3*e7be843bSPierre Pronchery#
4*e7be843bSPierre Pronchery# Licensed under the Apache License 2.0 (the "License").  You may not use
5*e7be843bSPierre Pronchery# this file except in compliance with the License.  You can obtain a copy
6*e7be843bSPierre Pronchery# in the file LICENSE in the source distribution or at
7*e7be843bSPierre Pronchery# https://www.openssl.org/source/license.html
8*e7be843bSPierre Pronchery
9*e7be843bSPierre Proncheryuse warnings;
10*e7be843bSPierre Proncheryuse strict;
11*e7be843bSPierre Proncheryuse Config;
12*e7be843bSPierre Pronchery
13*e7be843bSPierre Proncherymy $expectedsyms=$ARGV[0];
14*e7be843bSPierre Pronchery
15*e7be843bSPierre Proncheryshift(@ARGV);
16*e7be843bSPierre Pronchery
17*e7be843bSPierre Proncherymy $objlist;
18*e7be843bSPierre Proncherymy $objfilelist = join(" ", @ARGV);
19*e7be843bSPierre Proncherymy $expsyms;
20*e7be843bSPierre Proncherymy $exps;
21*e7be843bSPierre Proncherymy $OBJFH;
22*e7be843bSPierre Proncherymy $cmd;
23*e7be843bSPierre Pronchery
24*e7be843bSPierre Proncheryif ($Config{osname} eq "MSWin32") {
25*e7be843bSPierre Pronchery        my $currentdll = "";
26*e7be843bSPierre Pronchery        $cmd = "dumpbin /imports " . $objfilelist;
27*e7be843bSPierre Pronchery        my @symlist;
28*e7be843bSPierre Pronchery        open $expsyms, '<', $expectedsyms or die;
29*e7be843bSPierre Pronchery        {
30*e7be843bSPierre Pronchery            local $/;
31*e7be843bSPierre Pronchery            $exps=<$expsyms>;
32*e7be843bSPierre Pronchery        }
33*e7be843bSPierre Pronchery        close($expsyms);
34*e7be843bSPierre Pronchery        open($OBJFH, "$cmd|") or die "Cannot open process: $!";
35*e7be843bSPierre Pronchery        while (<$OBJFH>)
36*e7be843bSPierre Pronchery        {
37*e7be843bSPierre Pronchery            chomp;
38*e7be843bSPierre Pronchery            my $dllfile = $_;
39*e7be843bSPierre Pronchery            $dllfile =~ s/( +)(.*)(\.dll)(.*)/DLLFILE \2/;
40*e7be843bSPierre Pronchery            if (index($dllfile, "DLLFILE") >= 0) {
41*e7be843bSPierre Pronchery                $currentdll = substr($dllfile, 8);
42*e7be843bSPierre Pronchery                $currentdll =~ s/^\s+|s+$//g;
43*e7be843bSPierre Pronchery            }
44*e7be843bSPierre Pronchery            # filter imports from our own library
45*e7be843bSPierre Pronchery            if ("$currentdll" ne "libcrypto-3-x64") {
46*e7be843bSPierre Pronchery                my $line = $_;
47*e7be843bSPierre Pronchery                $line =~ s/                          [0-9a-fA-F]{1,2} /SYMBOL /;
48*e7be843bSPierre Pronchery                if (index($line, "SYMBOL") != -1) {
49*e7be843bSPierre Pronchery                    $line =~ s/.*SYMBOL //;
50*e7be843bSPierre Pronchery                    push(@symlist, $line);
51*e7be843bSPierre Pronchery                }
52*e7be843bSPierre Pronchery            }
53*e7be843bSPierre Pronchery        }
54*e7be843bSPierre Pronchery        foreach (@symlist) {
55*e7be843bSPierre Pronchery            if (index($exps, $_) < 0) {
56*e7be843bSPierre Pronchery                print "Symbol $_ not in the allowed platform symbols list\n";
57*e7be843bSPierre Pronchery                exit 1;
58*e7be843bSPierre Pronchery            }
59*e7be843bSPierre Pronchery        }
60*e7be843bSPierre Pronchery        exit 0;
61*e7be843bSPierre Pronchery    }
62*e7be843bSPierre Proncheryelse {
63*e7be843bSPierre Pronchery        $cmd = "objdump -t " . $objfilelist . " | grep UND | grep -v \@OPENSSL";
64*e7be843bSPierre Pronchery        $cmd = $cmd . " | awk '{print \$NF}' |";
65*e7be843bSPierre Pronchery        $cmd = $cmd . " sed -e\"s/@.*\$//\" | sort | uniq";
66*e7be843bSPierre Pronchery
67*e7be843bSPierre Pronchery        open $expsyms, '<', $expectedsyms or die;
68*e7be843bSPierre Pronchery        {
69*e7be843bSPierre Pronchery            local $/;
70*e7be843bSPierre Pronchery            $exps=<$expsyms>;
71*e7be843bSPierre Pronchery        }
72*e7be843bSPierre Pronchery        close($expsyms);
73*e7be843bSPierre Pronchery
74*e7be843bSPierre Pronchery        open($OBJFH, "$cmd|") or die "Cannot open process: $!";
75*e7be843bSPierre Pronchery        while (<$OBJFH>)
76*e7be843bSPierre Pronchery        {
77*e7be843bSPierre Pronchery                if (index($exps, $_) < 0) {
78*e7be843bSPierre Pronchery                    print "Symbol $_ not in the allowed platform symbols list\n";
79*e7be843bSPierre Pronchery                    exit 1;
80*e7be843bSPierre Pronchery                }
81*e7be843bSPierre Pronchery        }
82*e7be843bSPierre Pronchery        close($OBJFH);
83*e7be843bSPierre Pronchery        exit 0;
84*e7be843bSPierre Pronchery    }
85