Skip to content

Commit 12034a5

Browse files
authored
[RISCV] Add GNU note property and CFI support (#587)
* RISCV: add GNU property note support Signed-off-by: Jerry Zhang Jian <jerry.zhangjian@sifive.com> * RISCV: add Zicfiss and Zicfilp as GNU properties Signed-off-by: Jerry Zhang Jian <jerry.zhangjian@sifive.com> * RISCV: add support to describe gnu notes Signed-off-by: Jerry Zhang Jian <jerry.zhangjian@sifive.com> --------- Signed-off-by: Jerry Zhang Jian <jerry.zhangjian@sifive.com>
1 parent 2e70218 commit 12034a5

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

elftools/elf/descriptions.py

+11
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,12 @@ def describe_note_gnu_properties(properties, machine):
320320
prop_desc = ' <corrupt length: 0x%x>' % sz
321321
else:
322322
prop_desc = describe_note_gnu_property_bitmap_and(_DESCR_NOTE_GNU_PROPERTY_AARCH64_FEATURE_1_AND, 'aarch64 feature', d)
323+
elif t == 'GNU_PROPERTY_AARCH64_FEATURE_1_AND' and machine == 'EM_RISCV':
324+
# RISC-V shares the same bit-mask with AArch64
325+
if sz != 4:
326+
prop_desc = ' <corrupt length: 0x%x>' % sz
327+
else:
328+
prop_desc = describe_note_gnu_property_bitmap_and(_DESCR_NOTE_GNU_PROPERTY_RISCV_FEATURE_1_AND, 'RISC-V AND feature', d)
323329
elif _DESCR_NOTE_GNU_PROPERTY_TYPE_LOPROC <= t <= _DESCR_NOTE_GNU_PROPERTY_TYPE_HIPROC:
324330
prop_desc = '<processor-specific type 0x%x data: %s >' % (t, bytes2hex(d, sep=' '))
325331
elif _DESCR_NOTE_GNU_PROPERTY_TYPE_LOUSER <= t <= _DESCR_NOTE_GNU_PROPERTY_TYPE_HIUSER:
@@ -675,6 +681,11 @@ def describe_note_gnu_properties(properties, machine):
675681
(2, 'pac'),
676682
)
677683

684+
_DESCR_NOTE_GNU_PROPERTY_RISCV_FEATURE_1_AND = (
685+
(1, 'ZICFILP'),
686+
(2, 'ZICFISS'),
687+
)
688+
678689
def _reverse_dict(d, low_priority=()):
679690
"""
680691
This is a tiny helper function to "reverse" the keys/values of a dictionary

elftools/elf/structs.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,9 @@ def classify_pr_data(ctx):
407407
if ctx.pr_type.startswith('GNU_PROPERTY_X86_'):
408408
return ('GNU_PROPERTY_X86_*', 4, 0)
409409
elif ctx.pr_type.startswith('GNU_PROPERTY_AARCH64_'):
410-
return ('GNU_PROPERTY_AARCH64_*', 4, 0)
410+
return ('GNU_PROPERTY_AARCH64_*', 4, 0)
411+
elif ctx.pr_type.startswith('GNU_PROPERTY_RISCV_'):
412+
return ('GNU_PROPERTY_RISCV_*', 4, 0)
411413
return (ctx.pr_type, ctx.pr_datasz, self.elfclass)
412414

413415
self.Elf_Prop = Struct('Elf_Prop',
@@ -418,6 +420,7 @@ def classify_pr_data(ctx):
418420
('GNU_PROPERTY_STACK_SIZE', 8, 64): self.Elf_word64('pr_data'),
419421
('GNU_PROPERTY_X86_*', 4, 0): self.Elf_word('pr_data'),
420422
('GNU_PROPERTY_AARCH64_*', 4, 0): self.Elf_word('pr_data'),
423+
('GNU_PROPERTY_RISCV_*', 4, 0): self.Elf_word('pr_data'),
421424
},
422425
default=Field('pr_data', lambda ctx: ctx.pr_datasz)
423426
),

0 commit comments

Comments
 (0)