[Issue 22483] New: DMD generates invalid string sections that work by coincidence
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Fri Nov 5 06:18:23 UTC 2021
https://issues.dlang.org/show_bug.cgi?id=22483
Issue ID: 22483
Summary: DMD generates invalid string sections that work by
coincidence
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: enhancement
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: default_357-line at yahoo.de
See https://github.com/rui314/mold/issues/126
DMD generates .rodata.str1.1 string sections (for char[] strings) with a
sh_entsize of 0, when it should be 1. Linkers apparently react to this by not
treating the section as mergeable at all.
You can confirm this:
```
echo 'string foo() { return "Hello World"; }' > a.d
echo 'string bar() { return "Hello World"; }' > b.d
echo 'import a, b; void main() { assert(foo.ptr is bar.ptr); }' > c.d
# force creating separate string sections
dmd a.d -c -ofa.o
dmd b.d -c -ofb.o
dmd a.o b.o c.d -ofstrsectiontest
# will fail
./strsectiontest
```
Patch:
```
diff --git a/src/dmd/backend/elfobj.d b/src/dmd/backend/elfobj.d
index b555b01e0..02e888e8d 100644
--- a/src/dmd/backend/elfobj.d
+++ b/src/dmd/backend/elfobj.d
@@ -630,6 +630,7 @@ int ElfObj_string_literal_segment(uint sz)
const int i = (sz == 4) ? 2 : sz - 1;
const IDXSEC seg =
ElfObj_getsegment(".rodata.str".ptr, name[i].ptr, SHT_PROGBITS,
SHF_ALLOC | SHF_MERGE | SHF_STRINGS, sz);
+ MAP_SEG2SEC(seg).sh_entsize = sz;
return seg;
}
```
But with this applied, DMD generates invalid revocations:
/usr/bin/ld: a.o: access beyond end of merged section (-4)
/usr/bin/ld: b.o: access beyond end of merged section (-4)
/usr/bin/ld: strsectiontest.o: access beyond end of merged section (-4)
Afaics, the revocations were always invalid, but section merging didn't happen
for the .rodata.str, so we didn't notice. How to fix that is beyond me though.
--
More information about the Digitalmars-d-bugs
mailing list