On Mon, Oct 09, 2023 at 01:29:52PM -0700, Philip Guenther wrote:
> On Mon, Oct 9, 2023 at 11:21 AM Lorenz (xha) <[email protected]> wrote:
>
> > hi misc@,
> >
> > i'm currently porting the hare programming language to openbsd and i am
> > having quite a few problems trying to use a linker script. i am always
> > getting a "/bin/ksh: .bin/hare: Invalid argument" error.
> >
> > so far i tried a lot of stuff like comparing a working version without a
> > linker script, looking if any of the programm headers are missing, etc.
> >
>
> So you have a working binary (w/o linker script) and a not-working binary
> (w/linker script) and you've even done the comparison of the program
> headers of the two...and you're not going to show those but rather ask
> what, in general, could be wrong? Oooookay.
i am pretty sure that it woudln't have been helpful since i don't know
what i am doing (yet). nothing's working
> Read /usr/src/sys/kern/*exec* and review the logic around the 10
> occurrences of EINVAL in that code. Presumably the differences you
> identified will point to one or more of them
found it: PT_PHDRS is missing. i didn't identify that difference at
first tho. it's needeed for PIE if i understand correctly.
why is ld not adding a PT_PHDR programm header? as far as i undestand,
PT_PHDR are the programm headers themselfs?
this is my linker script (kind of mess right now because of debugging).
it is supposed to link with libc. i am moving the init functions in a
different section so that the hare runtime can execute them and not
libc. that should have nothing to do with the problems i am having,
however. am i missing something?
```
ENTRY(__start)
SECTIONS {
.text : {
KEEP (*(.text))
*(.text.*)
}
.data : {
KEEP (*(.data))
*(.data.*)
}
.init_array : {
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(.init_array))
PROVIDE_HIDDEN (__init_array_end = .);
}
.fini_array : {
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(.fini_array))
PROVIDE_HIDDEN (__fini_array_end = .);
} :data
.test_array : {
PROVIDE_HIDDEN (__test_array_start = .);
KEEP (*(.test_array))
PROVIDE_HIDDEN (__test_array_end = .);
} :data
.note.openbsd.ident : {
KEEP (*(.note.openbsd.ident))
*(.note.openbsd.*)
}
.bss : {
KEEP (*(.bss))
*(.bss.*)
}
}
```
this is the readelf --headers of the programm produced with the linker
script:
```
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
INTERP 0x0000000000001000 0x0000000000000000 0x0000000000000000
0x0000000000000013 0x0000000000000013 R 1
[Requesting program interpreter: /usr/libexec/ld.so]
LOAD 0x0000000000001000 0x0000000000000000 0x0000000000000000
0x000000000000b47c 0x000000000000b47c R 1000
LOAD 0x000000000000c480 0x000000000000b480 0x000000000000b480
0x00000000001356d0 0x00000000001356d0 E 1000
LOAD 0x0000000000141b50 0x0000000000140b50 0x0000000000140b50
0x00000000000211e8 0x00000000000211e8 RW 1000
LOAD 0x0000000000162d38 0x0000000000161d38 0x0000000000161d38
0x0000000000000018 0x0000000000000018 R 1000
LOAD 0x0000000000162d50 0x0000000000161d50 0x0000000000161d50
0x0000000000000000 0x00000000000009b0 RW 1000
DYNAMIC 0x0000000000162ab0 0x0000000000161ab0 0x0000000000161ab0
0x0000000000000160 0x0000000000000160 RW 8
GNU_RELRO 0x0000000000162a40 0x0000000000161a40 0x0000000000161a40
0x00000000000002f8 0x00000000000005c0 R 1
GNU_EH_FRAME 0x000000000000c390 0x000000000000b390 0x000000000000b390
0x000000000000002c 0x000000000000002c R 4
OPENBSD_RANDOM 0x0000000000162aa8 0x0000000000161aa8 0x0000000000161aa8
0x0000000000000008 0x0000000000000008 RW 8
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0
OPENBSD_NOBTCF 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 E 0
NOTE 0x0000000000162d38 0x0000000000161d38 0x0000000000161d38
0x0000000000000018 0x0000000000000018 R 4
Section to Segment mapping:
Segment Sections...
00 .interp
01 .interp .dynsym .gnu.hash .hash .dynstr .rela.dyn .rela.plt .rodata
.eh_frame_hdr .eh_frame
02 .text .init .fini .plt
03 .data .openbsd.randomdata.retguard.1205
.openbsd.randomdata.retguard.2473 .openbsd.randomdata.retguard.1471
.openbsd.randomdata.retguard.1773 .init_array .fini_array .jcr .ctors .dtors
.openbsd.randomdata .dynamic .got .got.plt
04 .note.openbsd.ident
05 .bss
06 .dynamic
07 .init_array .fini_array .jcr .ctors .dtors .openbsd.randomdata
.dynamic .got .got.plt .note.openbsd.ident
08 .eh_frame_hdr
09 .openbsd.randomdata
10
11
12 .note.openbsd.ident
```
and without the linker script, but this is segfaulting because libc is
running the @init functions:
```
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040
0x00000000000002d8 0x00000000000002d8 R 8
INTERP 0x0000000000000318 0x0000000000000318 0x0000000000000318
0x0000000000000013 0x0000000000000013 R 1
[Requesting program interpreter: /usr/libexec/ld.so]
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x000000000000b7dc 0x000000000000b7dc R 1000
LOAD 0x000000000000b7e0 0x000000000000c7e0 0x000000000000c7e0
0x00000000001356e0 0x00000000001356e0 E 1000
LOAD 0x0000000000140ec0 0x0000000000142ec0 0x0000000000142ec0
0x0000000000000318 0x0000000000000318 RW 1000
LOAD 0x00000000001411d8 0x00000000001441d8 0x00000000001441d8
0x0000000000020ed0 0x0000000000021880 RW 1000
DYNAMIC 0x0000000000140f50 0x0000000000142f50 0x0000000000142f50
0x0000000000000160 0x0000000000000160 RW 8
GNU_RELRO 0x0000000000140ec0 0x0000000000142ec0 0x0000000000142ec0
0x0000000000000318 0x0000000000001140 R 1
GNU_EH_FRAME 0x000000000000b6f0 0x000000000000b6f0 0x000000000000b6f0
0x000000000000002c 0x000000000000002c R 4
OPENBSD_RANDOM 0x0000000000140ec0 0x0000000000142ec0 0x0000000000142ec0
0x0000000000000028 0x0000000000000028 RW 8
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0
OPENBSD_NOBTCF 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 E 0
NOTE 0x000000000000032c 0x000000000000032c 0x000000000000032c
0x0000000000000018 0x0000000000000018 R 4
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.openbsd.ident .dynsym .gnu.hash .hash .dynstr .rela.dyn
.rela.plt .rodata .eh_frame_hdr .eh_frame
03 .text .init .fini .plt
04 .openbsd.randomdata .jcr .ctors .dtors .fini_array .init_array
.dynamic .got .got.plt
05 .data .bss
06 .dynamic
07 .openbsd.randomdata .jcr .ctors .dtors .fini_array .init_array
.dynamic .got .got.plt
08 .eh_frame_hdr
09 .openbsd.randomdata
10
11
12 .note.openbsd.ident
```