kiwiyou/basm-rs

Immutable Borrow 형식의 const 변수 사용 시 오류

kiwiyou opened this issue · 3 comments

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에 저장된 문자열의 주소가 일치하지 않아 올바르지 않은 출력을 내게 됩니다.

재현용 스크립트

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

이 버그는 현재 아래 주소의 브랜치에서 해결된 상태입니다. 참고용으로 남깁니다.
https://github.com/kiwiyou/basm-rs/tree/attach-reloc

Fixed by #41