I was trying to debug a WIP port, so I compiled it with '-g -O0' on my
amd64 laptop. When trying to execute the binary, I got
$ ./lean
ksh: ./lean: Cannot allocate memory
mpi was able to pinpoint this to the following check in exec_elf.c:
699 case PT_OPENBSD_RANDOMIZE:
700 if (ph[i].p_memsz > randomizequota) {
701 error = ENOMEM;
702 goto bad;
703 }
so we got ENOMEM because some of the the program headers are too large.
$ readelf -l ./lean
Elf file type is DYN (Shared object file)
Entry point 0x4f4000
There are 11 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040
0x0000000000000268 0x0000000000000268 R 8
INTERP 0x00000000000002a8 0x00000000000002a8 0x00000000000002a8
0x0000000000000013 0x0000000000000013 R 1
[Requesting program interpreter: /usr/libexec/ld.so]
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x00000000004f3e24 0x00000000004f3e24 R 100000
LOAD 0x00000000004f4000 0x00000000004f4000 0x00000000004f4000
0x0000000000c8da80 0x0000000000c8da80 R E 100000
LOAD 0x0000000001182000 0x0000000001182000 0x0000000001182000
0x000000000014fae0 0x0000000000152030 RW 100000
DYNAMIC 0x00000000012cd008 0x00000000012cd008 0x00000000012cd008
0x0000000000000160 0x0000000000000160 RW 8
GNU_RELRO 0x0000000001185000 0x0000000001185000 0x0000000001185000
0x000000000014cae0 0x000000000014cae0 R 10
GNU_EH_FRAME 0x000000000014c9c0 0x000000000014c9c0 0x000000000014c9c0
0x00000000000aba8c 0x00000000000aba8c R 4
OPENBSD_RANDOM 0x0000000001185000 0x0000000001185000 0x0000000001185000
0x000000000012c1a0 0x000000000012c1a0 RW 8
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 8
NOTE 0x00000000000002bc 0x00000000000002bc 0x00000000000002bc
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 .gcc_except_table .rodata .eh_frame_hdr .eh_frame
03 .text .init .fini .plt
04 .data .openbsd.randomdata .jcr .ctors .dtors .data.rel.ro .dynamic
.got .got.plt .bss
05 .dynamic
06 .openbsd.randomdata .jcr .ctors .dtors .data.rel.ro .dynamic .got
.got.plt
07 .eh_frame_hdr
08 .openbsd.randomdata
09
10 .note.openbsd.ident
I'm not sure if this a bug or a feature, but if it happens to be a bug, the
binary (compiled with -current) and the ports makefile available under
cvs:~tb:lean/{lean,lean.tgz}