Immutable Borrow 형식의 const 변수 사용 시 오류
kiwiyou opened this issue · 3 comments
kiwiyou commented
const LIST: [&[u8]; 2] = [b"Hello World!", b"Bye"];
write(&LIST[n]);
위와 같은 코드를 사용할 시에 n이 동적으로 정해질 경우, .data.rel.ro 섹션에 문자열이 저장되고 .rodata에 문자열의 주소가 저장되면서 objcopy -j .rodata로 문자열이 복사되지 않습니다.
단순히 -j .data.rel.ro를 사용할 경우 중간에 있는 .eh_frame 섹션 등으로 인해 기존 .rodata에 저장된 주소와 .data.rel.ro에 저장된 문자열의 주소가 일치하지 않아 올바르지 않은 출력을 내게 됩니다.
falsetru commented
재현용 스크립트
diff --git a/tests/bug-7.rs b/tests/bug-7.rs
new file mode 100644
index 0000000..619098e
--- /dev/null
+++ b/tests/bug-7.rs
@@ -0,0 +1,17 @@
+use basm::io;
+
+#[inline(always)]
+pub fn main() {
+ const LIST: [&[u8]; 2] = [b"ki", b"wi"];
+ let buf = [0u8; 1];
+ let n = buf.as_ptr() as usize;
+ let mut writer = io::Writer::<{ 1 << 15 }>::new();
+ let mut i = n % 2;
+ let mut j = 1 - i;
+ if i > j {
+ (i, j) = (j, i);
+ }
+ writer.write(LIST[i]);
+ writer.write(LIST[j]);
+ writer.write(b"\n");
+}
diff --git a/tests/bug-7.sh b/tests/bug-7.sh
new file mode 100755
index 0000000..5bef64b
--- /dev/null
+++ b/tests/bug-7.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# Temporary solution.rs replacement
+cp src/solution.rs /tmp/solution.rs.bak
+trap "cp /tmp/solution.rs.bak src/solution.rs" EXIT
+cp tests/bug-7.rs src/solution.rs
+
+ret=0
+
+# Run Rust version for reference
+echo '---- Rust ----'
+diff <(cargo +nightly run --release --quiet) <(echo kiwi) || ret=1
+
+# Run C versions
+echo '---- C ----'
+./release.sh > /tmp/bug.c
+cc -w /tmp/bug.c -o /tmp/bug
+diff <(/tmp/bug) <(echo kiwi) || ret=1
+
+echo '---- C (no-probe) ----'
+./release.sh --features no-probe > /tmp/bug.c
+cc -w /tmp/bug.c -o /tmp/bug
+diff <(/tmp/bug) <(echo kiwi) || ret=1
+
+exit $ret
$ ./tests/bug-7.sh
---- Rust ----
---- C ----
Finished release [optimized] target(s) in 0.00s
1c1
<
---
> kiwi
---- C (no-probe) ----
Compiling basm-rs v0.1.0 (/home/falsetru/h/basm-rs)
Finished release [optimized] target(s) in 0.38s
./tests/bug-7.sh: line 23: 259754 Segmentation fault (core dumped) /tmp/bug
0a1
> kiwi
byeongkeunahn commented
이 버그는 현재 아래 주소의 브랜치에서 해결된 상태입니다. 참고용으로 남깁니다.
https://github.com/kiwiyou/basm-rs/tree/attach-reloc