#! /usr/bin/env perl # Copyright 2006-2026 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); # Check that object files exist foreach (@ARGV) { unless (-f $_ && -r $_) { die "Path is not a regular readable file: '$_'"; } } 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" !~ /^libcrypto-[1-9][0-9]*(-x64)?$/) { my $line = $_; $line =~ s/ [0-9a-fA-F]{1,2} /SYMBOL /; if (index($line, "SYMBOL") != -1) { $line =~ s/.*SYMBOL //; push(@symlist, $line); } } } close($OBJFH); ($? >> 8 == 0) or die "Command '$cmd' has failed."; my $ok = 1; foreach (@symlist) { chomp; if (index($exps, $_) < 0) { print "Symbol $_ not in the allowed platform symbols list\n"; $ok = 0; } } exit !$ok; } else { $cmd = "objdump -t " . $objfilelist . " | awk " . "'/\\\\*UND\\\\*/ {" . "split(\$NF, sym_lib, \"@\");" . "if (sym_lib[2] !~ \"OPENSSL_[1-9][0-9]*\\\\.[0-9]+\\\\.[0-9]+\$\")" . "syms[sym_lib[1]] = 1;" . "}" . "END { for (s in syms) print s; };'"; open $expsyms, '<', $expectedsyms or die; { local $/; $exps=<$expsyms>; } close($expsyms); open($OBJFH, "$cmd|") or die "Cannot open process: $!"; my $ok = 1; while (<$OBJFH>) { chomp; if (index($exps, $_) < 0) { print "Symbol $_ not in the allowed platform symbols list\n"; $ok = 0; } } close($OBJFH); exit !(!($? >> 8) || !$ok); }