|
Lines 697-703
unexec (new_name, old_name, data_start,
|
Link Here
|
|---|
|
ElfW(Addr) new_data2_addr; | ElfW(Addr) new_data2_addr; |
| |
int n, nn; | int n, nn; |
int old_bss_index, old_sbss_index; |
int old_bss_index, old_sbss_index, old_plt_index; |
int old_data_index, new_data2_index; | int old_data_index, new_data2_index; |
int old_mdebug_index; | int old_mdebug_index; |
struct stat stat_buf; | struct stat stat_buf; |
|
Lines 759-770
unexec (new_name, old_name, data_start,
|
Link Here
|
|---|
|
if (OLD_SECTION_H (old_sbss_index).sh_type == SHT_PROGBITS) | if (OLD_SECTION_H (old_sbss_index).sh_type == SHT_PROGBITS) |
old_sbss_index = -1; | old_sbss_index = -1; |
| |
if (old_sbss_index == -1) |
/* PowerPC64 has .plt in the BSS section. */ |
|
old_plt_index = find_section (".plt", old_section_names, |
|
old_name, old_file_h, old_section_h, 1); |
|
if (old_plt_index != -1) |
|
if (OLD_SECTION_H (old_plt_index).sh_type != SHT_NOBITS) |
|
old_plt_index = -1; |
|
|
|
if (old_sbss_index == -1 && old_plt_index == -1) |
{ | { |
old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr; | old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr; |
old_bss_size = OLD_SECTION_H (old_bss_index).sh_size; | old_bss_size = OLD_SECTION_H (old_bss_index).sh_size; |
new_data2_index = old_bss_index; | new_data2_index = old_bss_index; |
} | } |
|
else if (old_plt_index != -1 |
|
&& (old_sbss_index == -1 |
|
|| (OLD_SECTION_H (old_sbss_index).sh_addr |
|
> OLD_SECTION_H (old_plt_index).sh_addr))) |
|
{ |
|
old_bss_addr = OLD_SECTION_H (old_plt_index).sh_addr; |
|
old_bss_size = OLD_SECTION_H (old_bss_index).sh_size |
|
+ OLD_SECTION_H (old_plt_index).sh_size; |
|
if (old_sbss_index != -1) |
|
old_bss_size += OLD_SECTION_H (old_sbss_index).sh_size; |
|
new_data2_index = old_plt_index; |
|
} |
else | else |
{ | { |
old_bss_addr = OLD_SECTION_H (old_sbss_index).sh_addr; | old_bss_addr = OLD_SECTION_H (old_sbss_index).sh_addr; |
|
Lines 955-961
unexec (new_name, old_name, data_start,
|
Link Here
|
|---|
|
if (n == old_bss_index | if (n == old_bss_index |
/* The new bss and sbss section's size is zero, and its file offset | /* The new bss and sbss section's size is zero, and its file offset |
and virtual address should be off by NEW_DATA2_SIZE. */ | and virtual address should be off by NEW_DATA2_SIZE. */ |
|| n == old_sbss_index |
|| n == old_sbss_index || n == old_plt_index |
) | ) |
{ | { |
/* NN should be `old_s?bss_index + 1' at this point. */ | /* NN should be `old_s?bss_index + 1' at this point. */ |
|
Lines 986-994
unexec (new_name, old_name, data_start,
|
Link Here
|
|---|
|
>= OLD_SECTION_H (old_bss_index-1).sh_offset) | >= OLD_SECTION_H (old_bss_index-1).sh_offset) |
NEW_SECTION_H (nn).sh_offset += new_data2_size; | NEW_SECTION_H (nn).sh_offset += new_data2_size; |
#else | #else |
if (round_up (NEW_SECTION_H (nn).sh_offset, |
if (NEW_SECTION_H (nn).sh_offset + NEW_SECTION_H (nn).sh_size |
OLD_SECTION_H (old_bss_index).sh_addralign) |
> new_data2_offset) |
>= new_data2_offset) |
|
NEW_SECTION_H (nn).sh_offset += new_data2_size; | NEW_SECTION_H (nn).sh_offset += new_data2_size; |
#endif | #endif |
/* Any section that was originally placed after the section | /* Any section that was originally placed after the section |