[llvm-bugs] [Bug 26813] New: lld-linked FreeBSD libc contains .text relocations

via llvm-bugs llvm-bugs at lists.llvm.org
Wed Mar 2 07:33:44 PST 2016


https://llvm.org/bugs/show_bug.cgi?id=26813

            Bug ID: 26813
           Summary: lld-linked FreeBSD libc contains .text relocations
           Product: lld
           Version: unspecified
          Hardware: PC
                OS: FreeBSD
            Status: NEW
          Severity: normal
          Priority: P
         Component: All Bugs
          Assignee: unassignedbugs at nondot.org
          Reporter: emaste at freebsd.org
                CC: llvm-bugs at lists.llvm.org
            Blocks: 23214
    Classification: Unclassified

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)

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160302/7d2019d7/attachment.html>


More information about the llvm-bugs mailing list