@@ -1390,6 +1390,7 @@ struct phdr_data {
1390
1390
u64 addr ;
1391
1391
u64 len ;
1392
1392
struct list_head node ;
1393
+ struct phdr_data * remaps ;
1393
1394
};
1394
1395
1395
1396
struct sym_data {
@@ -1597,16 +1598,62 @@ static int kcore_copy__read_maps(struct kcore_copy_info *kci, Elf *elf)
1597
1598
return 0 ;
1598
1599
}
1599
1600
1601
+ static void kcore_copy__find_remaps (struct kcore_copy_info * kci )
1602
+ {
1603
+ struct phdr_data * p , * k = NULL ;
1604
+ u64 kend ;
1605
+
1606
+ if (!kci -> stext )
1607
+ return ;
1608
+
1609
+ /* Find phdr that corresponds to the kernel map (contains stext) */
1610
+ kcore_copy__for_each_phdr (kci , p ) {
1611
+ u64 pend = p -> addr + p -> len - 1 ;
1612
+
1613
+ if (p -> addr <= kci -> stext && pend >= kci -> stext ) {
1614
+ k = p ;
1615
+ break ;
1616
+ }
1617
+ }
1618
+
1619
+ if (!k )
1620
+ return ;
1621
+
1622
+ kend = k -> offset + k -> len ;
1623
+
1624
+ /* Find phdrs that remap the kernel */
1625
+ kcore_copy__for_each_phdr (kci , p ) {
1626
+ u64 pend = p -> offset + p -> len ;
1627
+
1628
+ if (p == k )
1629
+ continue ;
1630
+
1631
+ if (p -> offset >= k -> offset && pend <= kend )
1632
+ p -> remaps = k ;
1633
+ }
1634
+ }
1635
+
1600
1636
static void kcore_copy__layout (struct kcore_copy_info * kci )
1601
1637
{
1602
1638
struct phdr_data * p ;
1603
1639
off_t rel = 0 ;
1604
1640
1641
+ kcore_copy__find_remaps (kci );
1642
+
1605
1643
kcore_copy__for_each_phdr (kci , p ) {
1606
- p -> rel = rel ;
1607
- rel += p -> len ;
1644
+ if (!p -> remaps ) {
1645
+ p -> rel = rel ;
1646
+ rel += p -> len ;
1647
+ }
1608
1648
kci -> phnum += 1 ;
1609
1649
}
1650
+
1651
+ kcore_copy__for_each_phdr (kci , p ) {
1652
+ struct phdr_data * k = p -> remaps ;
1653
+
1654
+ if (k )
1655
+ p -> rel = p -> offset - k -> offset + k -> rel ;
1656
+ }
1610
1657
}
1611
1658
1612
1659
static int kcore_copy__calc_maps (struct kcore_copy_info * kci , const char * dir ,
@@ -1821,6 +1868,8 @@ int kcore_copy(const char *from_dir, const char *to_dir)
1821
1868
kcore_copy__for_each_phdr (& kci , p ) {
1822
1869
off_t offs = p -> rel + offset ;
1823
1870
1871
+ if (p -> remaps )
1872
+ continue ;
1824
1873
if (copy_bytes (kcore .fd , p -> offset , extract .fd , offs , p -> len ))
1825
1874
goto out_extract_close ;
1826
1875
}
0 commit comments