X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=Configurations%2Fdescrip.mms.tmpl;fp=Configurations%2Fdescrip.mms.tmpl;h=2de2d6d633f53edda6cc1349cdb58a3e257626ae;hp=b73db70c7da8cd4a9c63a788074f48800251b59d;hb=c62a9cd720eccdbb388890ee4a36801d01315be4;hpb=0b3867634f74f6cb7b60b3a0adde396421207214 diff --git a/Configurations/descrip.mms.tmpl b/Configurations/descrip.mms.tmpl index b73db70c7d..2de2d6d633 100644 --- a/Configurations/descrip.mms.tmpl +++ b/Configurations/descrip.mms.tmpl @@ -1270,16 +1270,28 @@ EOF # previous line's file spec as default, so if no directory spec # is present in the current line and the previous line has one that # doesn't apply, you're in for a surprise. + # Furthermore, we collect all object files and static libraries in + # an explicit cluster, to make it clear to the linker that these files + # shall be processed before shareable images. + # The shareable images are used with /SELECTIVE, to avoid warnings of + # multiply defined symbols when the module object files override some + # symbols that are present in the shareable image. my $write_opt1 = - join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_; - "WRITE OPT_FILE \"$x" } @objs). - "\""; + join(",-\"\n\t", + "\@ WRITE OPT_FILE \"CLUSTER=_,,", + (map { my $x = $_ =~ /\[/ ? $_ : "[]".$_; + "\@ WRITE OPT_FILE \"$x" } @objs), + (map { my $x = ($_->{lib} =~ /\[/) ? $_->{lib} : "[]".$_->{lib}; + "\@ WRITE OPT_FILE \"$x/LIB" } + grep { $_->{lib} =~ m|\.OLB$| } + @deps)) + ."\""; my $write_opt2 = - join("\n\t", map { my $x = $_->{lib} =~ /\[/ - ? $_->{lib} : "[]".$_->{lib}; - $x =~ s|(\.EXE)|$1/SHARE|; - $x =~ s|(\.OLB)|$1/LIB|; - "WRITE OPT_FILE \"$x\"" } @deps) + join("\n\t", + (map { my $x = ($_->{lib} =~ /\[/) ? $_->{lib} : "[]".$_->{lib}; + "\@ WRITE OPT_FILE \"$x/SHARE/SELECTIVE\"" } + grep { $_->{lib} =~ m|\.EXE$| } + @deps)) || "\@ !"; return <<"EOF" $dso : $deps @@ -1334,30 +1346,29 @@ EOF # is present in the current line and the previous line has one that # doesn't apply, you're in for a surprise. my $write_opt1 = - join(",-\"\n\t", map { my $x = $_ =~ /\[/ ? $_ : "[]".$_; - "\@ WRITE OPT_FILE \"$x" } @objs). - "\""; + "\@ WRITE OPT_FILE \"CASE_SENSITIVE=YES\"\n\t" + .join(",-\"\n\t", + "\@ WRITE OPT_FILE \"CLUSTER=_,,", + (map { my $x = $_ =~ /\[/ ? $_ : "[]".$_; + "\@ WRITE OPT_FILE \"$x" } @objs), + (map { my $x = ($_->{lib} =~ /\[/) ? $_->{lib} : "[]".$_->{lib}; + # Special hack to include the MAIN object + # module explicitly. This will only be done + # if there isn't a 'main' in the program's + # object modules already. + my $main = $_->{attrs}->{has_main} + ? '/INCLUDE=main' : ''; + ( "\@ IF nomain THEN WRITE OPT_FILE \"$x/LIB$main", + "\@ IF .NOT. nomain THEN WRITE OPT_FILE \"$x/LIB" ) } + grep { $_->{lib} =~ m|\.OLB$| } + @deps)) + ."\""; my $write_opt2 = - join("\n\t", "WRITE OPT_FILE \"CASE_SENSITIVE=YES\"", - map { my @lines = (); - use Data::Dumper; - my $x = $_->{lib} =~ /\[/ - ? $_->{lib} : "[]".$_->{lib}; - if ($x =~ m|\.EXE$|) { - push @lines, "\@ WRITE OPT_FILE \"$x/SHARE\""; - } elsif ($x =~ m|\.OLB$|) { - # Special hack to include the MAIN object - # module explicitly. This will only be done - # if there isn't a 'main' in the program's - # object modules already. - my $main = $_->{attrs}->{has_main} - ? '/INCLUDE=main' : ''; - push @lines, - "\@ IF nomain THEN WRITE OPT_FILE \"$x/LIB$main\"", - "\@ IF .NOT. nomain THEN WRITE OPT_FILE \"$x/LIB\"" - } - @lines - } @deps) + join("\n\t", + (map { my $x = $_->{lib} =~ /\[/ ? $_->{lib} : "[]".$_->{lib}; + "\@ WRITE OPT_FILE \"$x/SHARE/SELECTIVE\"" } + grep { $_->{lib} =~ m|\.EXE$| } + @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