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