summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2017-11-24 14:49:36 -0800
committerH.J. Lu <hjl.tools@gmail.com>2017-11-24 14:52:15 -0800
commit276da9b31bd6e3eb8d1dd814c867266f59f29093 (patch)
tree1acbee1595881224123021036356e0d43316ccf3 /include
parente547c119d043f2ecffb70452020ab9150d083a91 (diff)
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/ChangeLog7
-rw-r--r--include/elf/external.h16
2 files changed, 23 insertions, 0 deletions
diff --git a/include/ChangeLog b/include/ChangeLog
index 670456cece..a7668678f8 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 d65bae0b21..eb0a53a9a9 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 */