提交 6f7ac8e1 编写于 作者: A Andy Polyakov

IA-32 assembler modules (primarily DES) PIC-ification. Idea is to keep

shared libraries shared.
上级 a1457874
...@@ -1104,6 +1104,11 @@ if ($no_asm) ...@@ -1104,6 +1104,11 @@ if ($no_asm)
$sha1_obj=$md5_obj=$rmd160_obj=""; $sha1_obj=$md5_obj=$rmd160_obj="";
} }
if (!$no_shared)
{
$cast_obj=""; # CAST assembler is not PIC
}
if ($threads) if ($threads)
{ {
$cflags=$thread_cflags; $cflags=$thread_cflags;
...@@ -1119,20 +1124,16 @@ if ($zlib) ...@@ -1119,20 +1124,16 @@ if ($zlib)
# You will find shlib_mark1 and shlib_mark2 explained in Makefile.org # You will find shlib_mark1 and shlib_mark2 explained in Makefile.org
my $shared_mark = ""; my $shared_mark = "";
if ($shared_target ne "") if ($shared_target eq "")
{
$no_shared = 1;
}
if (!$no_shared)
{ {
if ($shared_cflag ne "") if ($shared_cflag ne "")
{ {
$cflags = "$shared_cflag $cflags"; $cflags = "$shared_cflag $cflags";
} }
if (!$no_shared)
{
#$shared_mark = "\$(SHARED_LIBS)";
}
}
else
{
$no_shared = 1;
} }
if ($no_shared) if ($no_shared)
......
...@@ -67,19 +67,27 @@ des: des.o cbc3_enc.o lib ...@@ -67,19 +67,27 @@ des: des.o cbc3_enc.o lib
# elf # elf
asm/dx86-elf.o: asm/dx86unix.cpp asm/dx86-elf.o: asm/dx86unix.cpp
$(CPP) -DELF -x c asm/dx86unix.cpp | as -o asm/dx86-elf.o $(CPP) -DELF \
`(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
-x c asm/dx86unix.cpp | as -o asm/dx86-elf.o
asm/yx86-elf.o: asm/yx86unix.cpp asm/yx86-elf.o: asm/yx86unix.cpp
$(CPP) -DELF -x c asm/yx86unix.cpp | as -o asm/yx86-elf.o $(CPP) -DELF \
`(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
-x c asm/yx86unix.cpp | as -o asm/yx86-elf.o
# solaris # solaris
asm/dx86-sol.o: asm/dx86unix.cpp asm/dx86-sol.o: asm/dx86unix.cpp
$(CC) -E -DSOL asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s $(CC) -E -DSOL \
`(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
asm/dx86unix.cpp | sed 's/^#.*//' > asm/dx86-sol.s
as -o asm/dx86-sol.o asm/dx86-sol.s as -o asm/dx86-sol.o asm/dx86-sol.s
rm -f asm/dx86-sol.s rm -f asm/dx86-sol.s
asm/yx86-sol.o: asm/yx86unix.cpp asm/yx86-sol.o: asm/yx86unix.cpp
$(CC) -E -DSOL asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s $(CC) -E -DSOL \
`(echo $(CFLAGS) | egrep -ie '-[fK]PIC') > /dev/null 2>&1 && echo -DPIC`\
asm/yx86unix.cpp | sed 's/^#.*//' > asm/yx86-sol.s
as -o asm/yx86-sol.o asm/yx86-sol.s as -o asm/yx86-sol.o asm/yx86-sol.s
rm -f asm/yx86-sol.s rm -f asm/yx86-sol.s
......
...@@ -26,11 +26,17 @@ sub fcrypt_body ...@@ -26,11 +26,17 @@ sub fcrypt_body
&comment(""); &comment("");
&comment("Load the 2 words"); &comment("Load the 2 words");
$ks="ebp"; $trans="ebp";
&xor( $L, $L); &xor( $L, $L);
&xor( $R, $R); &xor( $R, $R);
&mov($ks,&wparam(1));
# PIC-ification:-)
if ($cpp) { &picmeup("edx","DES_SPtrans"); }
else { &lea("edx",&DWP("DES_SPtrans")); }
&push("edx"); # becomes &swtmp(1)
#
&mov($trans,&wparam(1)); # reloaded with DES_SPtrans in D_ENCRYPT
&push(&DWC(25)); # add a variable &push(&DWC(25)); # add a variable
...@@ -39,11 +45,11 @@ sub fcrypt_body ...@@ -39,11 +45,11 @@ sub fcrypt_body
{ {
&comment(""); &comment("");
&comment("Round $i"); &comment("Round $i");
&D_ENCRYPT($i,$L,$R,$i*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx"); &D_ENCRYPT($i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx");
&comment(""); &comment("");
&comment("Round ".sprintf("%d",$i+1)); &comment("Round ".sprintf("%d",$i+1));
&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx"); &D_ENCRYPT($i+1,$R,$L,($i+1)*2,$trans,"eax","ebx","ecx","edx");
} }
&mov("ebx", &swtmp(0)); &mov("ebx", &swtmp(0));
&mov("eax", $L); &mov("eax", $L);
...@@ -61,14 +67,14 @@ sub fcrypt_body ...@@ -61,14 +67,14 @@ sub fcrypt_body
&mov(&DWP(0,"edx","",0),"eax"); &mov(&DWP(0,"edx","",0),"eax");
&mov(&DWP(4,"edx","",0),$L); &mov(&DWP(4,"edx","",0),$L);
&pop("ecx"); # remove variable &add("esp",8); # remove variables
&function_end($name); &function_end($name);
} }
sub D_ENCRYPT sub D_ENCRYPT
{ {
local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_; local($r,$L,$R,$S,$trans,$u,$tmp1,$tmp2,$t)=@_;
&mov( $u, &wparam(2)); # 2 &mov( $u, &wparam(2)); # 2
&mov( $t, $R); &mov( $t, $R);
...@@ -85,9 +91,9 @@ sub D_ENCRYPT ...@@ -85,9 +91,9 @@ sub D_ENCRYPT
&shl( $tmp2, 16); # 1 &shl( $tmp2, 16); # 1
&xor( $u, $tmp1); # 2 &xor( $u, $tmp1); # 2
&xor( $t, $tmp2); # 2 &xor( $t, $tmp2); # 2
&mov( $tmp1, &DWP(&n2a($S*4),$ks,"",0)); # 2 &mov( $tmp1, &DWP(&n2a($S*4),$trans,"",0)); # 2
&xor( $u, $tmp1); &xor( $u, $tmp1);
&mov( $tmp2, &DWP(&n2a(($S+1)*4),$ks,"",0)); # 2 &mov( $tmp2, &DWP(&n2a(($S+1)*4),$trans,"",0)); # 2
&xor( $u, $R); &xor( $u, $R);
&xor( $t, $R); &xor( $t, $R);
&xor( $t, $tmp2); &xor( $t, $tmp2);
...@@ -99,31 +105,28 @@ sub D_ENCRYPT ...@@ -99,31 +105,28 @@ sub D_ENCRYPT
&movb( &LB($tmp1), &LB($u) ); &movb( &LB($tmp1), &LB($u) );
&movb( &LB($tmp2), &HB($u) ); &movb( &LB($tmp2), &HB($u) );
&rotr( $t, 4 ); &rotr( $t, 4 );
&mov( $ks, &DWP(" $desSP",$tmp1,"",0)); &mov( $trans, &swtmp(1));
&xor( $L, &DWP(" ",$trans,$tmp1,0));
&movb( &LB($tmp1), &LB($t) ); &movb( &LB($tmp1), &LB($t) );
&xor( $L, $ks); &xor( $L, &DWP("0x200",$trans,$tmp2,0));
&mov( $ks, &DWP("0x200+$desSP",$tmp2,"",0));
&xor( $L, $ks);
&movb( &LB($tmp2), &HB($t) ); &movb( &LB($tmp2), &HB($t) );
&shr( $u, 16); &shr( $u, 16);
&mov( $ks, &DWP("0x100+$desSP",$tmp1,"",0)); &xor( $L, &DWP("0x100",$trans,$tmp1,0));
&xor( $L, $ks);
&movb( &LB($tmp1), &HB($u) ); &movb( &LB($tmp1), &HB($u) );
&shr( $t, 16); &shr( $t, 16);
&mov( $ks, &DWP("0x300+$desSP",$tmp2,"",0)); &xor( $L, &DWP("0x300",$trans,$tmp2,0));
&xor( $L, $ks);
&mov( $ks, &wparam(1));
&movb( &LB($tmp2), &HB($t) ); &movb( &LB($tmp2), &HB($t) );
&and( $u, "0xff" ); &and( $u, "0xff" );
&and( $t, "0xff" ); &and( $t, "0xff" );
&mov( $tmp1, &DWP("0x600+$desSP",$tmp1,"",0)); &mov( $tmp1, &DWP("0x600",$trans,$tmp1,0));
&xor( $L, $tmp1); &xor( $L, $tmp1);
&mov( $tmp1, &DWP("0x700+$desSP",$tmp2,"",0)); &mov( $tmp1, &DWP("0x700",$trans,$tmp2,0));
&xor( $L, $tmp1); &xor( $L, $tmp1);
&mov( $tmp1, &DWP("0x400+$desSP",$u,"",0)); &mov( $tmp1, &DWP("0x400",$trans,$u,0));
&xor( $L, $tmp1); &xor( $L, $tmp1);
&mov( $tmp1, &DWP("0x500+$desSP",$t,"",0)); &mov( $tmp1, &DWP("0x500",$trans,$t,0));
&xor( $L, $tmp1); &xor( $L, $tmp1);
&mov( $trans, &wparam(1));
} }
sub n2a sub n2a
......
...@@ -40,7 +40,7 @@ sub DES_encrypt ...@@ -40,7 +40,7 @@ sub DES_encrypt
&comment(""); &comment("");
&comment("Load the 2 words"); &comment("Load the 2 words");
$ks="ebp"; $trans="ebp";
if ($do_ip) if ($do_ip)
{ {
...@@ -72,7 +72,11 @@ sub DES_encrypt ...@@ -72,7 +72,11 @@ sub DES_encrypt
&rotl($L,3); &rotl($L,3);
} }
&mov( $ks, &wparam(1) ); # PIC-ification:-)
if ($cpp) { &picmeup($trans,"DES_SPtrans"); }
else { &lea($trans,&DWP("DES_SPtrans")); }
&mov( "ecx", &wparam(1) );
&cmp("ebx","0"); &cmp("ebx","0");
&je(&label("start_decrypt")); &je(&label("start_decrypt"));
...@@ -80,11 +84,11 @@ sub DES_encrypt ...@@ -80,11 +84,11 @@ sub DES_encrypt
{ {
&comment(""); &comment("");
&comment("Round $i"); &comment("Round $i");
&D_ENCRYPT($i,$L,$R,$i*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx"); &D_ENCRYPT($i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx");
&comment(""); &comment("");
&comment("Round ".sprintf("%d",$i+1)); &comment("Round ".sprintf("%d",$i+1));
&D_ENCRYPT($i+1,$R,$L,($i+1)*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx"); &D_ENCRYPT($i+1,$R,$L,($i+1)*2,$trans,"eax","ebx","ecx","edx");
} }
&jmp(&label("end")); &jmp(&label("end"));
...@@ -94,10 +98,10 @@ sub DES_encrypt ...@@ -94,10 +98,10 @@ sub DES_encrypt
{ {
&comment(""); &comment("");
&comment("Round $i"); &comment("Round $i");
&D_ENCRYPT(15-$i,$L,$R,$i*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx"); &D_ENCRYPT(15-$i,$L,$R,$i*2,$trans,"eax","ebx","ecx","edx");
&comment(""); &comment("");
&comment("Round ".sprintf("%d",$i-1)); &comment("Round ".sprintf("%d",$i-1));
&D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$ks,"DES_SPtrans","eax","ebx","ecx","edx"); &D_ENCRYPT(15-$i+1,$R,$L,($i-1)*2,$trans,"eax","ebx","ecx","edx");
} }
&set_label("end"); &set_label("end");
...@@ -134,43 +138,36 @@ sub DES_encrypt ...@@ -134,43 +138,36 @@ sub DES_encrypt
sub D_ENCRYPT sub D_ENCRYPT
{ {
local($r,$L,$R,$S,$ks,$desSP,$u,$tmp1,$tmp2,$t)=@_; local($r,$L,$R,$S,$trans,$u,$tmp1,$tmp2,$t)=@_;
&mov( $u, &DWP(&n2a($S*4),$ks,"",0)); &mov( $u, &DWP(&n2a($S*4),$tmp2,"",0));
&xor( $tmp1, $tmp1); &xor( $tmp1, $tmp1);
&mov( $t, &DWP(&n2a(($S+1)*4),$ks,"",0)); &mov( $t, &DWP(&n2a(($S+1)*4),$tmp2,"",0));
&xor( $u, $R); &xor( $u, $R);
&xor( $tmp2, $tmp2);
&xor( $t, $R); &xor( $t, $R);
&and( $u, "0xfcfcfcfc" ); &and( $u, "0xfcfcfcfc" );
&and( $t, "0xcfcfcfcf" ); &and( $t, "0xcfcfcfcf" );
&movb( &LB($tmp1), &LB($u) ); &movb( &LB($tmp1), &LB($u) );
&movb( &LB($tmp2), &HB($u) ); &movb( &LB($tmp2), &HB($u) );
&rotr( $t, 4 ); &rotr( $t, 4 );
&mov( $ks, &DWP(" $desSP",$tmp1,"",0)); &xor( $L, &DWP(" ",$trans,$tmp1,0));
&movb( &LB($tmp1), &LB($t) ); &movb( &LB($tmp1), &LB($t) );
&xor( $L, $ks); &xor( $L, &DWP("0x200",$trans,$tmp2,0));
&mov( $ks, &DWP("0x200+$desSP",$tmp2,"",0));
&xor( $L, $ks); ######
&movb( &LB($tmp2), &HB($t) ); &movb( &LB($tmp2), &HB($t) );
&shr( $u, 16); &shr( $u, 16);
&mov( $ks, &DWP("0x100+$desSP",$tmp1,"",0)); &xor( $L, &DWP("0x100",$trans,$tmp1,0));
&xor( $L, $ks); ######
&movb( &LB($tmp1), &HB($u) ); &movb( &LB($tmp1), &HB($u) );
&shr( $t, 16); &shr( $t, 16);
&mov( $ks, &DWP("0x300+$desSP",$tmp2,"",0)); &xor( $L, &DWP("0x300",$trans,$tmp2,0));
&xor( $L, $ks);
&mov( $ks, &wparam(1) );
&movb( &LB($tmp2), &HB($t) ); &movb( &LB($tmp2), &HB($t) );
&and( $u, "0xff" ); &and( $u, "0xff" );
&and( $t, "0xff" ); &and( $t, "0xff" );
&mov( $tmp1, &DWP("0x600+$desSP",$tmp1,"",0)); &xor( $L, &DWP("0x600",$trans,$tmp1,0));
&xor( $L, $tmp1); &xor( $L, &DWP("0x700",$trans,$tmp2,0));
&mov( $tmp1, &DWP("0x700+$desSP",$tmp2,"",0)); &mov( $tmp2, &wparam(1) );
&xor( $L, $tmp1); &xor( $L, &DWP("0x400",$trans,$u,0));
&mov( $tmp1, &DWP("0x400+$desSP",$u,"",0)); &xor( $L, &DWP("0x500",$trans,$t,0));
&xor( $L, $tmp1);
&mov( $tmp1, &DWP("0x500+$desSP",$t,"",0));
&xor( $L, $tmp1);
} }
sub n2a sub n2a
......
...@@ -146,9 +146,15 @@ sub cbc ...@@ -146,9 +146,15 @@ sub cbc
&mov($count, &wparam(2)); # length &mov($count, &wparam(2)); # length
&and($count, 7); &and($count, 7);
&jz(&label("finish")); &jz(&label("finish"));
&call(&label("PIC_point"));
&set_label("PIC_point");
&blindpop("edx");
&lea("ecx",&DWP(&label("cbc_enc_jmp_table")."-".&label("PIC_point"),"edx"));
&mov($count,&DWP(0,"ecx",$count,4))
&add($count,"edx");
&xor("ecx","ecx"); &xor("ecx","ecx");
&xor("edx","edx"); &xor("edx","edx");
&mov($count,&DWP(&label("cbc_enc_jmp_table"),"",$count,4)); #&mov($count,&DWP(&label("cbc_enc_jmp_table"),"",$count,4));
&jmp_ptr($count); &jmp_ptr($count);
&set_label("ej7"); &set_label("ej7");
...@@ -318,22 +324,23 @@ sub cbc ...@@ -318,22 +324,23 @@ sub cbc
&set_label("cbc_enc_jmp_table",1); &set_label("cbc_enc_jmp_table",1);
&data_word("0"); &data_word("0");
&data_word(&label("ej1")); &data_word(&label("ej1")."-".&label("PIC_point"));
&data_word(&label("ej2")); &data_word(&label("ej2")."-".&label("PIC_point"));
&data_word(&label("ej3")); &data_word(&label("ej3")."-".&label("PIC_point"));
&data_word(&label("ej4")); &data_word(&label("ej4")."-".&label("PIC_point"));
&data_word(&label("ej5")); &data_word(&label("ej5")."-".&label("PIC_point"));
&data_word(&label("ej6")); &data_word(&label("ej6")."-".&label("PIC_point"));
&data_word(&label("ej7")); &data_word(&label("ej7")."-".&label("PIC_point"));
&set_label("cbc_dec_jmp_table",1); # not used
&data_word("0"); #&set_label("cbc_dec_jmp_table",1);
&data_word(&label("dj1")); #&data_word("0");
&data_word(&label("dj2")); #&data_word(&label("dj1")."-".&label("PIC_point"));
&data_word(&label("dj3")); #&data_word(&label("dj2")."-".&label("PIC_point"));
&data_word(&label("dj4")); #&data_word(&label("dj3")."-".&label("PIC_point"));
&data_word(&label("dj5")); #&data_word(&label("dj4")."-".&label("PIC_point"));
&data_word(&label("dj6")); #&data_word(&label("dj5")."-".&label("PIC_point"));
&data_word(&label("dj7")); #&data_word(&label("dj6")."-".&label("PIC_point"));
#&data_word(&label("dj7")."-".&label("PIC_point"));
&function_end_B($name); &function_end_B($name);
......
...@@ -363,3 +363,5 @@ sub out1p ...@@ -363,3 +363,5 @@ sub out1p
push(@out,"\t$name\t ".&conv($p1)."\n"); push(@out,"\t$name\t ".&conv($p1)."\n");
} }
sub main'blindpop { &out1("pop",@_); }
...@@ -340,3 +340,5 @@ sub out1p ...@@ -340,3 +340,5 @@ sub out1p
push(@out,"\t$name\t ".&conv($p1)."\n"); push(@out,"\t$name\t ".&conv($p1)."\n");
} }
sub main'blindpop { &out1("pop",@_); }
...@@ -87,12 +87,12 @@ sub main'DWP ...@@ -87,12 +87,12 @@ sub main'DWP
$ret.=$addr if ($addr ne "") && ($addr ne 0); $ret.=$addr if ($addr ne "") && ($addr ne 0);
if ($reg2 ne "") if ($reg2 ne "")
{ {
if($idx ne "") if($idx ne "" && $idx != 0)
{ $ret.="($reg1,$reg2,$idx)"; } { $ret.="($reg1,$reg2,$idx)"; }
else else
{ $ret.="($reg1,$reg2)"; } { $ret.="($reg1,$reg2)"; }
} }
else elsif ($reg1 ne "")
{ $ret.="($reg1)" } { $ret.="($reg1)" }
return($ret); return($ret);
} }
...@@ -542,3 +542,22 @@ sub popvars ...@@ -542,3 +542,22 @@ sub popvars
&main'pop("edx"); &main'pop("edx");
&main'popf(); &main'popf();
} }
sub main'picmeup
{
local($dst,$sym)=@_;
local($tmp)=<<___;
#if (defined(ELF) || defined(SOL)) && defined(PIC)
.align 8
call 1f
1: popl $regs{$dst}
addl \$_GLOBAL_OFFSET_TABLE_+[.-1b],$regs{$dst}
movl $sym\@GOT($regs{$dst}),$regs{$dst}
#else
movl \$$sym,$regs{$dst}
#endif
___
push(@out,$tmp);
}
sub main'blindpop { &out1("popl",@_); }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册