mirror of
https://github.com/openssl/openssl.git
synced 2024-11-27 05:21:51 +08:00
VMS: ignore multiply defined symbols when linking programs
The Unix and Windows linkers appear to simply ignore if any symbol is defined multiple times in different object files and libraries. The VMS linker, on the other hand, warns about it, loud and clear. It will still create the executable, but does so screaming. So we complicate things by saving the linker output, look through all the errors and warnings, and if they are only made up of %LINK-W-MULDEF, we let it pass, otherwise we output the linker output and raise the same exit code we got from the linker. Reviewed-by: Emilia Käsper <emilia@openssl.org> (Merged from https://github.com/openssl/openssl/pull/1789)
This commit is contained in:
parent
b5b7c61fe3
commit
bbdec3f247
@ -751,13 +751,46 @@ EOF
|
||||
$x =~ s|(\.OLB)|$1/LIB|;
|
||||
"WRITE OPT_FILE \"$x\"" } @deps)
|
||||
|| "\@ !";
|
||||
# The linking commands looks a bit complex, but it's for good reason.
|
||||
# When you link, say, foo.obj, bar.obj and libsomething.exe/share, and
|
||||
# bar.obj happens to have a symbol that also exists in libsomething.exe,
|
||||
# the linker will warn about it, loudly, and will then choose to pick
|
||||
# the first copy encountered (the one in bar.obj in this example).
|
||||
# On Unix and on Windows, the corresponding maneuvre goes through
|
||||
# silently with the same effect.
|
||||
# With some test programs, made for checking the internals of OpenSSL,
|
||||
# we do this kind of linking deliberately, picking a few specific object
|
||||
# files from within [.crypto] or [.ssl] so we can reach symbols that are
|
||||
# otherwise unreachable (since the shareable images only exports the
|
||||
# symbols listed in [.util]*.num), and then with the shared libraries
|
||||
# themselves. So we need to silence the warning about multiply defined
|
||||
# symbols, to mimic the way linking work on Unix and Windows, and so
|
||||
# the build isn't interrupted (MMS stops when warnings are signaled,
|
||||
# by default), and so someone building doesn't have to worry where it
|
||||
# isn't necessary. If there are other warnings, however, we show them
|
||||
# and let it break the build.
|
||||
return <<"EOF";
|
||||
$bin.EXE : $deps
|
||||
OPEN/WRITE/SHARE=READ OPT_FILE $bin.OPT
|
||||
$write_opt1
|
||||
$write_opt2
|
||||
CLOSE OPT_FILE
|
||||
LINK/EXEC=$bin.EXE \$(LDFLAGS) $bin.OPT/OPT \$(EX_LIBS)
|
||||
- pipe SPAWN/WAIT/NOLOG/OUT=$bin.LINKLOG -
|
||||
LINK/EXEC=$bin.EXE \$(LDFLAGS) $bin.OPT/OPT \$(EX_LIBS) ; -
|
||||
link_status = \$status ; link_severity = link_status .AND. 7
|
||||
@ search_severity = 1
|
||||
-@ IF link_severity .EQ. 0 THEN -
|
||||
pipe SEARCH $bin.LINKLOG "%","-"/MATCH=AND | -
|
||||
SPAWN/WAIT/NOLOG/OUT=NLA0: -
|
||||
SEARCH SYS\$INPUT: "-W-MULDEF,"/MATCH=NOR ; -
|
||||
search_severity = \$severity
|
||||
@ ! search_severity is 3 when the last search didn't find any matching
|
||||
@ ! string: %SEARCH-I-NOMATCHES, no strings matched
|
||||
-@ IF search_severity .NE. 3 .OR. link_severity .NE. 1 THEN -
|
||||
TYPE $bin.LINKLOG
|
||||
-@ DELETE $bin.LINKLOG;*
|
||||
@ IF search_severity .NE. 3 .OR. link_severity .NE. 1 THEN -
|
||||
SPAWN/WAIT/NOLOG EXIT 'link_status'
|
||||
- PURGE $bin.EXE,$bin.OPT
|
||||
EOF
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user