blob: 8372a61e885f5f179ba3c5420f53b6c774bcbdf1 [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001#! /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}