ld: Use correct types for crc64 calculations
authorNick Clifton <nickc@redhat.com>
Wed, 8 Mar 2023 13:11:37 +0000 (13:11 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 8 Mar 2023 13:11:37 +0000 (13:11 +0000)
ld/ld.texi
ld/lddigest.c
ld/lddigest.h
ld/ldgram.y
ld/testsuite/ld-scripts/crc64-poly.d
ld/testsuite/ld-scripts/crc64-poly.t

index c21d849fe243b59b0e8df9dc017d949f91dc57a4..207ac98126bc3a113b9a0c7baf3fac01229b3b88 100644 (file)
@@ -5581,6 +5581,10 @@ The parameters are explained in detail in
 
 Some of the predefined polynomes are the same, but differs in the other
 parameters.
+
+Note - the generation of 64-bit polynomes on 32-bit hosts for 32-bit
+targets is not supported.
+
 @page
 The 32-bit <polynome> command defines the following global symbols.
 
index d0bb4db73ab7f83fd1c6481f28e9626cfdfe0a3f..a2d7460e56a36da1a8da5d225512fd97262e2e1a 100644 (file)
@@ -115,7 +115,7 @@ lang_add_crc32_table (bool big_endian)
        }
       local_table = true;
     }
-  for (bfd_vma i = 0; i < 256; i++)
+  for (int i = 0; i < 256; i++)
     {
       uint32_t elem = crc32_table[i];
       if (big_endian)
@@ -137,7 +137,10 @@ lang_add_crc64_syndrome (algorithm_desc_t * a)
   CRC_START = CRC64_START;
   CRC_END = CRC64_END;
   CRC_TABLE = CRC64_TABLE;
-  lang_add_data (QUAD, exp_intop (0)); /* Reserve room for the ECC value */
+
+  /* Reserve room for the ECC value.  */
+  lang_add_data (QUAD, exp_intop (0));
+
   a->crc_tab = init_crc64_tab (a);
   if (a->crc_tab == NULL)
     {
@@ -181,10 +184,13 @@ print_hash64_table (algorithm_desc_t * a)
 static void
 lang_add_crc64_table (bool big_endian)
 {
-  bfd_vma *crc64_table = algorithm.crc_tab;    /* Use a precomputed, if it exists */
+  /* Use a precomputed table, if one exists.  */
+  uint64_t *crc64_table = algorithm.crc_tab;
   bool local_table = false;
+
   if (crc64_table == NULL)
-    {                          /* No luck, create a table */
+    {
+      /* No luck, create a table.  */
       crc64_table = init_crc64_tab (&algorithm);
       if (crc64_table == NULL)
        {
@@ -193,21 +199,28 @@ lang_add_crc64_table (bool big_endian)
        }
       local_table = true;
     }
+
   print_hash64_table (&algorithm);
-  for (bfd_vma i = 0; i < 256; i++)
+
+  for (int i = 0; i < 256; i++)
     {
-      bfd_vma elem = crc64_table[i];
+      uint64_t elem = crc64_table[i];
+
       if (big_endian)
-       {
-         elem = __builtin_bswap64 (elem);
-       }
+       elem = __builtin_bswap64 (elem);
+
       if (link_info.big_endian)
+       elem = __builtin_bswap64 (elem);
+
+      if (sizeof (bfd_vma) >= QUAD_SIZE)
+       lang_add_data (QUAD, exp_intop (elem));
+      else
        {
-         elem = __builtin_bswap64 (elem);
+         lang_add_data (LONG, exp_intop (elem >> 32));
+         lang_add_data (LONG, exp_intop (elem));
        }
-
-      lang_add_data (QUAD, exp_intop (elem));
     }
+
   if (local_table)
     free (crc64_table);
 }
@@ -219,7 +232,9 @@ lang_add_digest (bfd_vma size,
                 bfd_vma poly,
                 bfd_vma initial,
                 bfd_vma xor_val,
-                bfd_vma ireflect, bfd_vma oreflect, bfd_vma reciprocal)
+                bfd_vma ireflect,
+                bfd_vma oreflect,
+                bfd_vma reciprocal)
 {
   if (algorithm.crc_algo != no_algo)   /* We only allow one CRC <polynom> */
     {
@@ -578,7 +593,7 @@ get_text_section_contents (void)
                                   text_section->output_section,
                                   (bfd_byte **) & text_contents))
     {
-      einfo (_("%X%P: '&s' section contents unavailable\n"
+      einfo (_("%X%P: '%s' section contents unavailable\n"
               "CRC generation aborted\n"), digest_section);
       return false;
     }
@@ -660,7 +675,7 @@ set_crc64_checksum (uint64_t crc, bfd_vma addr)
 }
 
 static bool
-set_crc_checksum (bfd_vma crc, bfd_vma addr, bfd_vma size)
+set_crc_checksum (uint64_t crc, bfd_vma addr, bfd_vma size)
 {
   bool status;
   if (size == 64)
@@ -700,7 +715,7 @@ symbol_lookup (char *name, bfd_vma * val)
  * Multiplexing function for calculating CRC with different algorithms
  * 'algorithm.crc_algo'
  */
-static bfd_vma
+static uint64_t
 calculate_crc (const unsigned char *input_str, size_t num_bytes)
 {
   if (algorithm.crc_algo == crc_algo_64)
@@ -723,7 +738,8 @@ calculate_crc (const unsigned char *input_str, size_t num_bytes)
 
 static bool
 invalid_crc_parameters (bfd_vma crc_addr,
-                       bfd_vma crc_area_start, bfd_vma crc_area_end)
+                       bfd_vma crc_area_start,
+                       bfd_vma crc_area_end)
 {
   bool crc_in_section;
   bfd_vma crc_size = algorithm.crc_size / 8;
@@ -782,7 +798,7 @@ void
 lang_generate_crc (void)
 {
   bfd_vma crc_addr, crc_area_start, crc_area_end;
-  bfd_vma crc;
+  uint64_t crc;
   bool can_do_crc;
 
   /* Return immediately, if CRC is not requested */
index 9f5e5f3fbda32abe569436d56d486703b442803d..a1eeb022d00ba66ca1d9fbcec954283ed469be86 100755 (executable)
@@ -156,28 +156,34 @@ extern const char *digest_label;
 extern bool digest_big_endian;
 extern bool polynome_valid;
 
-/* CRC-32 */
-extern uint32_t *init_crc32_tab (algorithm_desc_t * dsc);
+/* In ldcrc32.c.  */
+extern uint32_t * init_crc32_tab
+  (algorithm_desc_t *);
 extern uint32_t calc_crc32
-  (algorithm_desc_t * dsc, const unsigned char *input_str, size_t num_bytes);
-extern void lang_add_crc32_syndrome (algorithm_desc_t * a);
-
-/* CR-64 */
-extern bfd_vma *init_crc64_tab (algorithm_desc_t * dsc);
-extern bfd_vma calc_crc64
-  (algorithm_desc_t * dsc, const unsigned char *input_str, size_t num_bytes);
-extern void lang_add_crc64_syndrome (algorithm_desc_t * a);
-
-extern void lang_add_digest (bfd_vma size,
-                            bfd_vma poly,
-                            bfd_vma initial,
-                            bfd_vma xor_val,
-                            bfd_vma ireflect,
-                            bfd_vma oreflect, bfd_vma reciprocal);
-extern bool lang_set_digest (char *digest);
-extern void lang_add_digest_table (bool big_endian);
-extern const char *lang_get_label (const char *label, bool *big_endian);
-extern void lang_generate_crc (void);
-extern void lang_generate_digest (void);
+  (algorithm_desc_t *, const unsigned char *, size_t);
+extern void lang_add_crc32_syndrome
+  (algorithm_desc_t *);
+
+/* In ldcrc64.c.  */
+extern uint64_t * init_crc64_tab
+  (algorithm_desc_t *);
+extern uint64_t calc_crc64
+  (algorithm_desc_t *, const unsigned char *, size_t);
+extern void lang_add_crc64_syndrome
+  (algorithm_desc_t * );
+
+/* In lddigest.c  */
+extern void lang_add_digest
+  (bfd_vma, bfd_vma, bfd_vma, bfd_vma, bfd_vma, bfd_vma, bfd_vma);
+extern bool lang_set_digest
+  (char *);
+extern void lang_add_digest_table
+  (bool);
+extern const char * lang_get_label
+  (const char *, bool *);
+extern void lang_generate_crc
+  (void);
+extern void lang_generate_digest
+  (void);
 
 #endif /* LDDIGEST_H */
index ea0c569279afc81bb9d5adeb4b51b23da8da1968..54bf8e0f908e46cda6867804b7e5ca36e1ee5186 100644 (file)
@@ -691,7 +691,7 @@ statement:
                }
        | DIGEST NAME
                { /* CRC_ADDRESS is set in <polynome>, but polynome reserves space, so we use a temporary */
-                 digest_label = lang_get_label($2, &digest_big_endian);
+                 digest_label = lang_get_label ($2, &digest_big_endian);
                  lang_add_assignment (exp_assign (digest_label, exp_nameop (NAME, "."), false));
                }
                polynome '(' mustbe_exp ',' mustbe_exp ')'
@@ -740,7 +740,7 @@ statement:
 polynome:
        NAME
                {
-                 polynome_valid = lang_set_digest($1);
+                 polynome_valid = lang_set_digest ($1);
                }
        | POLY '(' mustbe_exp ','
                   mustbe_exp ',' mustbe_exp ',' mustbe_exp ','
index b54ac47e448fd02fd9c44b2cfbdbbb1a9de91023..a1e6eb8f1506afb731e1527364a7c2c02f44dc2c 100644 (file)
@@ -9,7 +9,7 @@
 Contents of section .text:
  1200 434f4445 deadbeef 00000000 00000000  CODE............
  1210 6c40df5f 0b497347 00000000 00000000  l@._.IsG........
- 1220 6c40df5f 0b497347 00000000 00000000  l@._.IsG........
+ 1220 ee5e1ecd 02f31206 00000000 00000000  ................
  1230 00000000 00000000 deadbeef 434f4445  ............CODE
  1240 31323334 35363738 3900ffff ffffffff  123456789.......
  1250 434f4445 00000000 00000000 00000000  CODE............
index fb357caedf9dd89802649a936354a007ed44b442..00a21557827ee1cbffbec767d4ca0ee93f24e6dd 100644 (file)
@@ -26,7 +26,7 @@ SECTIONS
       QUAD(0x0);
 
       crc64 = .;
-      DIGEST "_CRC64#BE" POLY(64,0x42F0E1EBA9EA3693,0,0,0,0,0)(ecc_start , ecc_end)
+      DIGEST "_CRC64#BE" POLY(64,0xA9EA3693,0,0,0,0,0)(ecc_start , ecc_end)
       QUAD(0x0);
 
       INCLUDE "end_tag.inc"