1#! /usr/bin/env perl 2# Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. 3# 4# Licensed under the OpenSSL license (the "License"). You may not use 5# this file except in compliance with the License. You can obtain a copy 6# in the file LICENSE in the source distribution or at 7# https://www.openssl.org/source/license.html 8 9use OpenSSL::Test qw/:DEFAULT bldtop_dir bldtop_file/; 10use OpenSSL::Test::Utils; 11use File::Temp qw(tempfile); 12 13#Load configdata.pm 14 15BEGIN { 16 setup("test_shlibload"); 17} 18use lib bldtop_dir('.'); 19use configdata; 20 21plan skip_all => "Test only supported in a shared build" if disabled("shared"); 22plan skip_all => "Test is disabled on AIX" if config('target') =~ m|^aix|; 23plan skip_all => "Test is disabled on VMS" if config('target') =~ m|^vms|; 24plan skip_all => "Test only supported in a dso build" if disabled("dso"); 25 26plan tests => 10; 27 28# When libssl and libcrypto are compiled on Linux with "-rpath", but not 29# "--enable-new-dtags", the RPATH takes precedence over LD_LIBRARY_PATH, 30# and we end up running with the wrong libraries. This is resolved by 31# using paths to the shared objects, not just the names. 32 33my $libcrypto = bldtop_file(shlib('libcrypto')); 34my $libssl = bldtop_file(shlib('libssl')); 35 36(my $fh, my $filename) = tempfile(); 37ok(run(test(["shlibloadtest", "-crypto_first", $libcrypto, $libssl, $filename])), 38 "running shlibloadtest -crypto_first $filename"); 39ok(check_atexit($fh)); 40unlink $filename; 41($fh, $filename) = tempfile(); 42ok(run(test(["shlibloadtest", "-ssl_first", $libcrypto, $libssl, $filename])), 43 "running shlibloadtest -ssl_first $filename"); 44ok(check_atexit($fh)); 45unlink $filename; 46($fh, $filename) = tempfile(); 47ok(run(test(["shlibloadtest", "-just_crypto", $libcrypto, $libssl, $filename])), 48 "running shlibloadtest -just_crypto $filename"); 49ok(check_atexit($fh)); 50unlink $filename; 51($fh, $filename) = tempfile(); 52ok(run(test(["shlibloadtest", "-dso_ref", $libcrypto, $libssl, $filename])), 53 "running shlibloadtest -dso_ref $filename"); 54ok(check_atexit($fh)); 55unlink $filename; 56($fh, $filename) = tempfile(); 57ok(run(test(["shlibloadtest", "-no_atexit", $libcrypto, $libssl, $filename])), 58 "running shlibloadtest -no_atexit $filename"); 59ok(!check_atexit($fh)); 60unlink $filename; 61 62sub shlib { 63 my $lib = shift; 64 $lib = $unified_info{rename}->{$lib} 65 if defined $unified_info{rename}->{$lib}; 66 $lib = $unified_info{sharednames}->{$lib} 67 . ($target{shlib_variant} || "") 68 . ($target{shared_extension} || ".so"); 69 $lib =~ s|\.\$\(SHLIB_VERSION_NUMBER\) 70 |.$config{shlib_version_number}|x; 71 return $lib; 72} 73 74sub check_atexit { 75 my $fh = shift; 76 my $data = <$fh>; 77 78 return 1 if (defined $data && $data =~ m/atexit\(\) run/); 79 80 return 0; 81} 82