You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Found during ongoing attempts to link the FreeBSD base system with lld.
For processing .text relocations the runtime loader temporarily maps the segment with write permission. I discovered that we have an issue in FreeBSD's runtime loader: it expects the first PT_LOAD segment to be .text, and unprotects only that one. (That issue is tracked in http://bugs.freebsd.org/207631.)
This uncovered two lld issues, however.
First, lld should set DT_TEXTREL or DF_TEXTREL if the output contains relocations in non-writable segments.
DF_TEXTREL
If this flag is not set, no relocation entry should cause a modification to a non-writable segment, as specified by the segment permissions in the program header table. If this flag is set, one or more relocation entries might request modifications to a non-writable segment, and the dynamic linker can prepare accordingly.
The real issue here though is that the relocation exists at all.
We have a workaround (PR 26814 or hack to FreeBSD rtld) to continue with the FreeBSD buildworld testing, and there's nothing specific to do for this PR.
*** This bug has been marked as a duplicate of bug llvm/llvm-bugzilla-archive#23231 ***
Extended Description
Found during ongoing attempts to link the FreeBSD base system with lld.
For processing .text relocations the runtime loader temporarily maps the segment with write permission. I discovered that we have an issue in FreeBSD's runtime loader: it expects the first PT_LOAD segment to be .text, and unprotects only that one. (That issue is tracked in http://bugs.freebsd.org/207631.)
This uncovered two lld issues, however.
First, lld should set DT_TEXTREL or DF_TEXTREL if the output contains relocations in non-writable segments.
DF_TEXTREL
If this flag is not set, no relocation entry should cause a modification to a non-writable segment, as specified by the segment permissions in the program header table. If this flag is set, one or more relocation entries might request modifications to a non-writable segment, and the dynamic linker can prepare accordingly.
The real issue here though is that the relocation exists at all.
feynman% findtextrel lib/libc.so.7 | head
lib/libc.so.7: ELF object contains text relocation records:
lib/libc.so.7: off: 0x9d0ac, func: __sys_numa_setaffinity
lib/libc.so.7: off: 0x9d0cc, func: __sys_numa_getaffinity
lib/libc.so.7: off: 0x9d0ec, func: _procctl
...
feynman% readelf -r lib/libc.so.7 | grep 9d0ac
00000009d0ac 09ab00000002 R_X86_64_PC32 00000000001a62c4 .cerror + fffffffffffffffc
These all come from the autogenerated libc syscall wrappers.
#define RSYSCALL(name) ENTRY(_sys##name); \
WEAK_REFERENCE(_sys##name, name); \
WEAK_REFERENCE(_sys##name, ##name); \
mov $SYS##name,%eax; KERNCALL; \
jb HIDENAME(cerror); ret; \
END(_sys##name)
The text was updated successfully, but these errors were encountered: