Skip to content

Commit f6c2f92

Browse files
Dirrekepoliorcetics
authored andcommitted
elf: add support for csky arch (gimli-rs#561)
1 parent e72abc5 commit f6c2f92

File tree

5 files changed

+21
-0
lines changed

5 files changed

+21
-0
lines changed

src/common.rs

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ pub enum Architecture {
1010
Arm,
1111
Avr,
1212
Bpf,
13+
Csky,
1314
I386,
1415
X86_64,
1516
#[allow(non_camel_case_types)]
@@ -43,6 +44,7 @@ impl Architecture {
4344
Architecture::Arm => Some(AddressSize::U32),
4445
Architecture::Avr => Some(AddressSize::U8),
4546
Architecture::Bpf => Some(AddressSize::U64),
47+
Architecture::Csky => Some(AddressSize::U32),
4648
Architecture::I386 => Some(AddressSize::U32),
4749
Architecture::X86_64 => Some(AddressSize::U64),
4850
Architecture::X86_64_X32 => Some(AddressSize::U32),

src/read/elf/file.rs

+1
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ where
161161
(elf::EM_ARM, _) => Architecture::Arm,
162162
(elf::EM_AVR, _) => Architecture::Avr,
163163
(elf::EM_BPF, _) => Architecture::Bpf,
164+
(elf::EM_CSKY, _) => Architecture::Csky,
164165
(elf::EM_386, _) => Architecture::I386,
165166
(elf::EM_X86_64, false) => Architecture::X86_64_X32,
166167
(elf::EM_X86_64, true) => Architecture::X86_64,

src/read/elf/relocation.rs

+5
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,11 @@ fn parse_relocation<Elf: FileHeader>(
276276
elf::R_BPF_64_32 => (RelocationKind::Absolute, 32),
277277
r_type => (RelocationKind::Elf(r_type), 0),
278278
},
279+
elf::EM_CSKY => match reloc.r_type(endian, false) {
280+
elf::R_CKCORE_ADDR32 => (RelocationKind::Absolute, 32),
281+
elf::R_CKCORE_PCREL32 => (RelocationKind::Relative, 32),
282+
r_type => (RelocationKind::Elf(r_type), 0),
283+
},
279284
elf::EM_386 => match reloc.r_type(endian, false) {
280285
elf::R_386_32 => (RelocationKind::Absolute, 32),
281286
elf::R_386_PC32 => (RelocationKind::Relative, 32),

src/write/elf/object.rs

+12
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ impl<'a> Object<'a> {
126126
Architecture::Arm => false,
127127
Architecture::Avr => true,
128128
Architecture::Bpf => false,
129+
Architecture::Csky => true,
129130
Architecture::I386 => false,
130131
Architecture::X86_64 => true,
131132
Architecture::X86_64_X32 => true,
@@ -329,6 +330,7 @@ impl<'a> Object<'a> {
329330
Architecture::Arm => elf::EM_ARM,
330331
Architecture::Avr => elf::EM_AVR,
331332
Architecture::Bpf => elf::EM_BPF,
333+
Architecture::Csky => elf::EM_CSKY,
332334
Architecture::I386 => elf::EM_386,
333335
Architecture::X86_64 => elf::EM_X86_64,
334336
Architecture::X86_64_X32 => elf::EM_X86_64,
@@ -548,6 +550,16 @@ impl<'a> Object<'a> {
548550
return Err(Error(format!("unimplemented relocation {:?}", reloc)));
549551
}
550552
},
553+
Architecture::Csky => match (reloc.kind, reloc.encoding, reloc.size) {
554+
(RelocationKind::Absolute, _, 32) => elf::R_CKCORE_ADDR32,
555+
(RelocationKind::Relative, RelocationEncoding::Generic, 32) => {
556+
elf::R_CKCORE_PCREL32
557+
}
558+
(RelocationKind::Elf(x), _, _) => x,
559+
_ => {
560+
return Err(Error(format!("unimplemented relocation {:?}", reloc)));
561+
}
562+
},
551563
Architecture::I386 => match (reloc.kind, reloc.size) {
552564
(RelocationKind::Absolute, 32) => elf::R_386_32,
553565
(RelocationKind::Relative, 32) => elf::R_386_PC32,

tests/round_trip/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ fn elf_any() {
235235
(Architecture::Arm, Endianness::Little),
236236
(Architecture::Avr, Endianness::Little),
237237
(Architecture::Bpf, Endianness::Little),
238+
(Architecture::Csky, Endianness::Little),
238239
(Architecture::I386, Endianness::Little),
239240
(Architecture::X86_64, Endianness::Little),
240241
(Architecture::X86_64_X32, Endianness::Little),

0 commit comments

Comments
 (0)