| #! /usr/bin/env perl |
| # Copyright 2006-2023 The OpenSSL Project Authors. All Rights Reserved. |
| # |
| # Licensed under the Apache License 2.0 (the "License"). You may not use |
| # this file except in compliance with the License. You can obtain a copy |
| # in the file LICENSE in the source distribution or at |
| # https://www.openssl.org/source/license.html |
| |
| use warnings; |
| use strict; |
| use Config; |
| |
| my $expectedsyms=$ARGV[0]; |
| |
| shift(@ARGV); |
| |
| my $objlist; |
| my $objfilelist = join(" ", @ARGV); |
| my $expsyms; |
| my $exps; |
| my $OBJFH; |
| my $cmd; |
| |
| if ($Config{osname} eq "MSWin32") { |
| my $currentdll = ""; |
| $cmd = "dumpbin /imports " . $objfilelist; |
| my @symlist; |
| open $expsyms, '<', $expectedsyms or die; |
| { |
| local $/; |
| $exps=<$expsyms>; |
| } |
| close($expsyms); |
| open($OBJFH, "$cmd|") or die "Cannot open process: $!"; |
| while (<$OBJFH>) |
| { |
| chomp; |
| my $dllfile = $_; |
| $dllfile =~ s/( +)(.*)(\.dll)(.*)/DLLFILE \2/; |
| if (index($dllfile, "DLLFILE") >= 0) { |
| $currentdll = substr($dllfile, 8); |
| $currentdll =~ s/^\s+|s+$//g; |
| } |
| # filter imports from our own library |
| if ("$currentdll" ne "libcrypto-3-x64") { |
| my $line = $_; |
| $line =~ s/ [0-9a-fA-F]{1,2} /SYMBOL /; |
| if (index($line, "SYMBOL") != -1) { |
| $line =~ s/.*SYMBOL //; |
| push(@symlist, $line); |
| } |
| } |
| } |
| foreach (@symlist) { |
| if (index($exps, $_) < 0) { |
| print "Symbol $_ not in the allowed platform symbols list\n"; |
| exit 1; |
| } |
| } |
| exit 0; |
| } |
| else { |
| $cmd = "objdump -t " . $objfilelist . " | grep UND | grep -v \@OPENSSL"; |
| $cmd = $cmd . " | awk '{print \$NF}' |"; |
| $cmd = $cmd . " sed -e\"s/@.*\$//\" | sort | uniq"; |
| |
| open $expsyms, '<', $expectedsyms or die; |
| { |
| local $/; |
| $exps=<$expsyms>; |
| } |
| close($expsyms); |
| |
| open($OBJFH, "$cmd|") or die "Cannot open process: $!"; |
| while (<$OBJFH>) |
| { |
| if (index($exps, $_) < 0) { |
| print "Symbol $_ not in the allowed platform symbols list\n"; |
| exit 1; |
| } |
| } |
| close($OBJFH); |
| exit 0; |
| } |