diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2017-11-24 14:49:36 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2017-11-24 14:52:15 -0800 |
commit | 276da9b31bd6e3eb8d1dd814c867266f59f29093 (patch) | |
tree | 1acbee1595881224123021036356e0d43316ccf3 /include | |
parent | e547c119d043f2ecffb70452020ab9150d083a91 (diff) | |
download | gdb-276da9b31bd6e3eb8d1dd814c867266f59f29093.zip gdb-276da9b31bd6e3eb8d1dd814c867266f59f29093.tar.gz gdb-276da9b31bd6e3eb8d1dd814c867266f59f29093.tar.bz2 |
Re-apply "elf: Properly compute offsets of note descriptor and next note"
CORE PT_NOTE segments may have p_align values of 0 or 1. gABI specifies
that PT_NOTE alignment should be aligned to 4 bytes for 32-bit objects
and to 8 bytes for 64-bit objects. If segment alignment is less than 4,
we use 4 byte alignment.
Diffstat (limited to 'include')
-rw-r--r-- | include/ChangeLog | 7 | ||||
-rw-r--r-- | include/elf/external.h | 16 |
2 files changed, 23 insertions, 0 deletions
diff --git a/include/ChangeLog b/include/ChangeLog index 670456c..a766867 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,10 @@ +2017-11-24 H.J. Lu <hongjiu.lu@intel.com> + + PR binutils/22444 + * elf/external.h (ELF_ALIGN_UP): New. + (ELF_NOTE_DESC_OFFSET): Likewise. + (ELF_NOTE_NEXT_OFFSET): Likewise. + 2017-11-16 Tamar Christina <tamar.christina@arm.com> * opcode/aarch64.h: (AARCH64_FEATURE_F16_FML): New. diff --git a/include/elf/external.h b/include/elf/external.h index d65bae0..eb0a53a 100644 --- a/include/elf/external.h +++ b/include/elf/external.h @@ -183,6 +183,22 @@ typedef struct { char name[1]; /* Start of the name+desc data */ } Elf_External_Note; +/* Align an address upward to a boundary, expressed as a number of bytes. + E.g. align to an 8-byte boundary with argument of 8. */ +#define ELF_ALIGN_UP(addr, boundary) \ + (((bfd_vma) (addr) + ((boundary) - 1)) & ~ (bfd_vma) ((boundary) -1)) + +/* Compute the offset of the note descriptor from size of note entry's + owner string and note alignment. */ +#define ELF_NOTE_DESC_OFFSET(namesz, align) \ + ELF_ALIGN_UP (offsetof (Elf_External_Note, name) + (namesz), (align)) + +/* Compute the offset of the next note entry from size of note entry's + owner string, size of the note descriptor and note alignment. */ +#define ELF_NOTE_NEXT_OFFSET(namesz, descsz, align) \ + ELF_ALIGN_UP (ELF_NOTE_DESC_OFFSET ((namesz), (align)) + (descsz), \ + (align)) + /* Relocation Entries */ typedef struct { unsigned char r_offset[4]; /* Location at which to apply the action */ |