Combat [bogus] relocations in some assember modules.
authorAndy Polyakov <appro@openssl.org>
Thu, 22 Nov 2007 20:51:48 +0000 (20:51 +0000)
committerAndy Polyakov <appro@openssl.org>
Thu, 22 Nov 2007 20:51:48 +0000 (20:51 +0000)
crypto/aes/asm/aes-586.pl
crypto/perlasm/x86unix.pl

index b09bf02..5eaced5 100755 (executable)
@@ -2657,12 +2657,10 @@ sub enckey()
        &xor    ("eax",&DWP(1024-128,$tbl,"ecx",4));    # rcon
 }
 
-# int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
-#                        AES_KEY *key)
 &public_label("AES_Te");
-&function_begin("AES_set_encrypt_key");
-       &mov    ("esi",&wparam(0));             # user supplied key
-       &mov    ("edi",&wparam(2));             # private key schedule
+&function_begin("_x86_AES_set_encrypt_key");
+       &mov    ("esi",&wparam(1));             # user supplied key
+       &mov    ("edi",&wparam(3));             # private key schedule
 
        &test   ("esi",-1);
        &jz     (&label("badpointer"));
@@ -2685,7 +2683,7 @@ sub enckey()
        &mov    ("ecx",&DWP(192-128,$tbl));
        &mov    ("edx",&DWP(224-128,$tbl));
 
-       &mov    ("ecx",&wparam(1));             # number of bits in key
+       &mov    ("ecx",&wparam(2));             # number of bits in key
        &cmp    ("ecx",128);
        &je     (&label("10rounds"));
        &cmp    ("ecx",192);
@@ -2862,7 +2860,14 @@ sub enckey()
     &set_label("badpointer");
        &mov    ("eax",-1);
     &set_label("exit");
-&function_end("AES_set_encrypt_key");
+&function_end("_x86_AES_set_encrypt_key");
+
+# int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
+#                        AES_KEY *key)
+&function_begin_B("AES_set_encrypt_key");
+       &call   ("_x86_AES_set_encrypt_key");
+       &ret    ();
+&function_end_B("AES_set_encrypt_key");
 
 sub deckey()
 { my ($i,$key,$tp1,$tp2,$tp4,$tp8) = @_;
@@ -2921,18 +2926,8 @@ sub deckey()
 
 # int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
 #                        AES_KEY *key)
-&public_label("AES_Td");
-&public_label("AES_Te");
 &function_begin_B("AES_set_decrypt_key");
-       &mov    ("eax",&wparam(0));
-       &mov    ("ecx",&wparam(1));
-       &mov    ("edx",&wparam(2));
-       &sub    ("esp",12);
-       &mov    (&DWP(0,"esp"),"eax");
-       &mov    (&DWP(4,"esp"),"ecx");
-       &mov    (&DWP(8,"esp"),"edx");
-       &call   ("AES_set_encrypt_key");
-       &add    ("esp",12);
+       &call   ("_x86_AES_set_encrypt_key");
        &cmp    ("eax",0);
        &je     (&label("proceed"));
        &ret    ();
index 8e3e4bd..eb8d762 100644 (file)
@@ -115,12 +115,14 @@ sub ::file
 
 sub ::function_begin_B
 { my($func,$extra)=@_;
-  my $tmp;
+  my $begin;
 
     &::external_label($func);
+    $label{$func} = $begin = "${dot}L_${func}_begin";
     $func=$under.$func;
 
-    push(@out,".text\n.globl\t$func\n");
+    push(@out,".text\n");
+    push(@out,".globl\t$func\n") if ($func !~ /^${under}_/);
     if ($::coff)
     {  push(@out,".def\t$func;\t.scl\t2;\t.type\t32;\t.endef\n"); }
     elsif ($::aout and !$::pic)
@@ -129,18 +131,19 @@ sub ::function_begin_B
     {  push(@out,".type        $func,\@function\n"); }
     push(@out,".align\t$align\n");
     push(@out,"$func:\n");
+    push(@out,"$begin:\n");
     $::stack=4;
 }
 
 sub ::function_end_B
 { my($func)=@_;
+  my $i;
 
-    $func=$under.$func;
     push(@out,"${dot}L_${func}_end:\n");
     if ($::elf)
-    {  push(@out,".size\t$func,${dot}L_${func}_end-$func\n"); }
+    {  push(@out,".size\t$under$func,${dot}L_${func}_end-${dot}L_${func}_begin\n"); }
     $::stack=0;
-    %label=();
+    foreach $i (keys %label) { delete $label{$i} if ($label{$i} =~ /^${dot}L[0-9]{3}/); }
 }
 
 sub ::comment
@@ -162,8 +165,8 @@ sub ::comment
 
 sub islabel    # see is argument is a known label
 { my $i;
-    foreach $i (%label) { return $label{$i} if ($label{$i} eq $_[0]); }
-  undef;
+    foreach $i (values %label) { return $i if ($i eq $_[0]); }
+  $label{$_[0]};       # can be undef
 }
 
 sub ::external_label { push(@labels,@_); }