@@ -9451,6 +9451,11 @@ sort_relr (struct bfd_link_info *info,
9451
9451
return true;
9452
9452
}
9453
9453
9454
+ /* Size of a relr entry and a relocated location. */
9455
+ #define RELR_SZ (ARCH_SIZE / 8)
9456
+ /* Number of consecutive locations a relr bitmap entry references. */
9457
+ #define RELR_N (ARCH_SIZE - 1)
9458
+
9454
9459
/* Size .relr.dyn whenever the layout changes, the number of packed
9455
9460
relocs are unchanged but the packed representation can. */
9456
9461
@@ -9473,19 +9478,19 @@ elfNN_aarch64_size_relative_relocs (struct bfd_link_info *info,
9473
9478
{
9474
9479
bfd_vma base = addr [i ];
9475
9480
i ++ ;
9476
- srelrdyn -> size += 8 ;
9477
- base += 8 ;
9481
+ srelrdyn -> size += RELR_SZ ;
9482
+ base += RELR_SZ ;
9478
9483
for (;;)
9479
9484
{
9480
9485
bfd_size_type start_i = i ;
9481
9486
while (i < htab -> relr_count
9482
- && addr [i ] - base < 63 * 8
9483
- && (addr [i ] - base ) % 8 == 0 )
9487
+ && addr [i ] - base < RELR_N * RELR_SZ
9488
+ && (addr [i ] - base ) % RELR_SZ == 0 )
9484
9489
i ++ ;
9485
9490
if (i == start_i )
9486
9491
break ;
9487
- srelrdyn -> size += 8 ;
9488
- base += 63 * 8 ;
9492
+ srelrdyn -> size += RELR_SZ ;
9493
+ base += RELR_N * RELR_SZ ;
9489
9494
}
9490
9495
}
9491
9496
if (srelrdyn -> size != oldsize )
@@ -9522,34 +9527,34 @@ elfNN_aarch64_finish_relative_relocs (struct bfd_link_info *info)
9522
9527
{
9523
9528
bfd_vma base = addr [i ];
9524
9529
i ++ ;
9525
- bfd_put_64 (dynobj , base , loc );
9526
- loc += 8 ;
9527
- base += 8 ;
9530
+ bfd_put_NN (dynobj , base , loc );
9531
+ loc += RELR_SZ ;
9532
+ base += RELR_SZ ;
9528
9533
for (;;)
9529
9534
{
9530
9535
bfd_vma bits = 0 ;
9531
9536
while (i < htab -> relr_count )
9532
9537
{
9533
9538
bfd_vma delta = addr [i ] - base ;
9534
- if (delta >= 63 * 8 || delta % 8 != 0 )
9539
+ if (delta >= RELR_N * RELR_SZ || delta % RELR_SZ != 0 )
9535
9540
break ;
9536
- bits |= (bfd_vma ) 1 << (delta / 8 );
9541
+ bits |= (bfd_vma ) 1 << (delta / RELR_SZ );
9537
9542
i ++ ;
9538
9543
}
9539
9544
if (bits == 0 )
9540
9545
break ;
9541
- bfd_put_64 (dynobj , (bits << 1 ) | 1 , loc );
9542
- loc += 8 ;
9543
- base += 63 * 8 ;
9546
+ bfd_put_NN (dynobj , (bits << 1 ) | 1 , loc );
9547
+ loc += RELR_SZ ;
9548
+ base += RELR_N * RELR_SZ ;
9544
9549
}
9545
9550
}
9546
9551
free (addr );
9547
9552
htab -> relr_sorted = NULL ;
9548
9553
/* Pad any excess with 1's, a do-nothing encoding. */
9549
9554
while (loc < srelrdyn -> contents + srelrdyn -> size )
9550
9555
{
9551
- bfd_put_64 (dynobj , 1 , loc );
9552
- loc += 8 ;
9556
+ bfd_put_NN (dynobj , 1 , loc );
9557
+ loc += RELR_SZ ;
9553
9558
}
9554
9559
return true;
9555
9560
}
0 commit comments