On Mon, Oct 09, 2023 at 01:29:52PM -0700, Philip Guenther wrote: > On Mon, Oct 9, 2023 at 11:21 AM Lorenz (xha) <m...@xha.li> 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 ```