Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Unified Diff: tools/relocation_packer/src/elf_file.cc

Issue 474283002: Update DT_RELA* fields when packing relocations with addends. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/relocation_packer/test_data/elf_file_unittest_relocs_arm64_packed.so » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/relocation_packer/src/elf_file.cc
diff --git a/tools/relocation_packer/src/elf_file.cc b/tools/relocation_packer/src/elf_file.cc
index c874713396287af513727d90e641587166088a4a..35268c37a02dac4414ad9fbbe1e1ca7c0895cd26 100644
--- a/tools/relocation_packer/src/elf_file.cc
+++ b/tools/relocation_packer/src/elf_file.cc
@@ -392,17 +392,19 @@ void AdjustDynamicSectionForHole(Elf_Scn* dynamic_section,
if (!is_relocations_resize)
continue;
- // DT_RELSZ is the overall size of relocations. Adjust by hole size.
- if (tag == DT_RELSZ) {
+ // DT_RELSZ or DT_RELASZ indicate the overall size of relocations.
+ // Only one will be present. Adjust by hole size.
rmcilroy 2014/08/15 16:28:47 Should we assert that only one is present?
+ if (tag == DT_RELSZ || tag == DT_RELASZ) {
dynamic->d_un.d_val += hole_size;
VLOG(1) << "dynamic[" << i << "] " << dynamic->d_tag
<< " d_val adjusted to " << dynamic->d_un.d_val;
}
- // DT_RELCOUNT is the count of relative relocations. Packing reduces it
- // to the alignment padding, if any; unpacking restores it to its former
- // value. The crazy linker does not use it, but we update it anyway.
- if (tag == DT_RELCOUNT) {
+ // DT_RELCOUNT or DT_RELACOUNT hold the count of relative relocations.
+ // Only one will be present. Packing reduces it to the alignment
+ // padding, if any; unpacking restores it to its former value. The
+ // crazy linker does not use it, but we update it anyway.
+ if (tag == DT_RELCOUNT || tag == DT_RELACOUNT) {
// Cast sizeof to a signed type to avoid the division result being
// promoted into an unsigned size_t.
const ssize_t sizeof_rel = static_cast<ssize_t>(sizeof(Rel));
@@ -411,8 +413,9 @@ void AdjustDynamicSectionForHole(Elf_Scn* dynamic_section,
<< " d_val adjusted to " << dynamic->d_un.d_val;
}
- // DT_RELENT doesn't change, but make sure it is what we expect.
- if (tag == DT_RELENT) {
+ // DT_RELENT and DT_RELAENT don't change, but make sure they are what
+ // we expect. Only one will be present.
+ if (tag == DT_RELENT || tag == DT_RELAENT) {
CHECK(dynamic->d_un.d_val == sizeof(Rel));
}
}
@@ -519,8 +522,8 @@ void ResizeSection(Elf* elf, Elf_Scn* section, size_t new_size) {
return;
// Note if we are resizing the real dyn relocations. If yes, then we have
- // to massage d_un.d_val in the dynamic section where d_tag is DT_RELSZ and
- // DT_RELCOUNT.
+ // to massage d_un.d_val in the dynamic section where d_tag is DT_RELSZ or
+ // DT_RELASZ and DT_RELCOUNT or DT_RELACOUNT.
size_t string_index;
elf_getshdrstrndx(elf, &string_index);
const std::string section_name =
@@ -1082,7 +1085,7 @@ bool ElfFile::UnpackTypedRelocations(const std::vector<uint8_t>& packed,
// Retrieve the current dynamic relocations section data.
data = GetSectionData(relocations_section_);
- // Interpret data as Elf32 relocations.
+ // Interpret data as relocations.
const Rel* relocations_base = reinterpret_cast<Rel*>(data->d_buf);
std::vector<Rel> relocations(
relocations_base,
« no previous file with comments | « no previous file | tools/relocation_packer/test_data/elf_file_unittest_relocs_arm64_packed.so » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698