After upgrading to 12.1Stable as of June 11:
1) squid - fails with segmentation fault, ldd "Cannot load PIE binary"
2) gcc9 - suffers a cc1 internal compiler error
3) pkg-static - issues "failed" messages, unable to package or install
Environment Xeon E3, ufs2 only, previously running FreeBSD 12.1 dated
1st May (from kernel.old).
Prior to the upgrade all ports were rebuilt without issue, but NOT
installed as they were a fall-back, in the event that clang 10 caused
issues (the concern). There are multiple jails on this system, both
amd64 and i386 - some for building, testing and production use. One of
the production i386 jails runs squid, unchanged since Sept 2019.
/etc/src.conf contains
WITH_PIE=YES
WITH_BIND_NOW=YES
Most of our 1400+ ports are built and run with relro, now, pie and where
possible with noexecstack &/or no-common. These functioned in an ASLR
environment. (ASLR is only disabled during builds (gcc9 complains), or
when there's a problem, now).
Note: NONE of the ports were rebuilt after the upgrade. However as part
of resolution, beep and squid were rebuilt.
=== Sequence of thigns ==
Upgrade performed. System rebooted without incident to
FreeBSD 12.1-STABLE #0 r362003M: Thu Jun 11 23:07:00 AEST 2020 i386
hqdev-amd64-smp-vga 1201517 1201517
but some port/application failures:
Problem 1
---------
i386 jail demonstrated:
# /usr/local/etc/rc.d/squid start
Starting squid.
Segmentation fault
# ldd /usr/local/sbin/squid
/usr/local/sbin/squid:
ldd: /usr/local/sbin/squid: Cannot load PIE binary /usr/local/sbin/squid
as DSO
/usr/local/sbin/squid: exit status 1
Lets check some relevant sysctls:
~# sysctl kern.elf64
kern.elf64.aslr.stack_gap: 0
kern.elf64.aslr.honor_sbrk: 1
kern.elf64.aslr.pie_enable: 0
kern.elf64.aslr.enable: 0
kern.elf64.pie_base: 16912384
kern.elf64.nxstack: 0
kern.elf64.fallback_brand: -1
~# sysctl kern.elf32
kern.elf32.aslr.stack_gap: 0
kern.elf32.aslr.honor_sbrk: 1
kern.elf32.aslr.pie_enable: 0
kern.elf32.aslr.enable: 0
kern.elf32.pie_base: 16781312
kern.elf32.read_exec: 0
kern.elf32.nxstack: 0
kern.elf32.fallback_brand: -1
Perhaps this may be helpful to the reader?
# readelf -d /usr/local/sbin/squid
Dynamic section at offset 0x5ddddc contains 39 entries:
Tag Type Name/Value
0x00000001 NEEDED Shared library: [librt.so.1]
0x00000001 NEEDED Shared library: [libcrypt.so.5]
0x00000001 NEEDED Shared library: [libregex.so.1]
0x00000001 NEEDED Shared library: [libcrypto.so.11]
0x00000001 NEEDED Shared library: [libssl.so.11]
0x00000001 NEEDED Shared library: [libm.so.5]
0x00000001 NEEDED Shared library: [libpcreposix.so.0]
0x00000001 NEEDED Shared library: [libpcre.so.1]
0x00000001 NEEDED Shared library: [libkrb5.so.26]
0x00000001 NEEDED Shared library: [libgssapi.so.3]
0x00000001 NEEDED Shared library: [libc++.so.1]
0x00000001 NEEDED Shared library: [libcxxrt.so.1]
0x00000001 NEEDED Shared library: [libgcc_s.so.1]
0x00000001 NEEDED Shared library: [libthr.so.3]
0x00000001 NEEDED Shared library: [libc.so.7]
0x0000001d RUNPATH Library runpath:
[/usr/local/lib/heimdal:/usr/lib:/usr/local/lib]
0x0000000c INIT 0xfe0d8
0x0000000d FINI 0x45e0b0
0x00000019 INIT_ARRAY
0x0000001b INIT_ARRAYSZ 292 (bytes)
0x00000004 HASH 0x19c
0x00000005 STRTAB 0x4a520
0x00000006 SYMTAB 0x155c0
0x0000000a STRSZ 580827 (bytes)
0x0000000b SYMENT 16 (bytes)
0x00000015 DEBUG 0x0
0x00000003 PLTGOT 0x5e0c94
0x00000002 PLTRELSZ 4432 (bytes)
0x00000014 PLTREL REL
0x00000017 JMPREL 0xfcf88
0x00000011 REL 0xded48
0x00000012 RELSZ 123456 (bytes)
0x00000013 RELENT 8 (bytes)
0x6ffffffb FLAGS_1 unknown (0x8000000)
0x6ffffffe VERNEED 0xdebe8
0x6fffffff VERNEEDNUM 9
0x6ffffff0 VERSYM 0xd81fc
0x6ffffffa RELCOUNT 13575
0x00000000 NULL 0x0
Finding the "Cannont load PIE" string in
"/usr/src/libexec/rtld-elf/rtld.c"
So commented out the code:
if (obj->z_pie) {
_rtld_error("Cannot load PIE binary %s as DSO", obj->path);
goto errp;
just to get going...
# cd /usr/src/libexec/rtld-elf
# make -DUSE_K8 clean && make -DUSE_K8 && make -DUSE_K8 install
...
cc -O2 -pipe -g0 -ggdb0 -DSTRIP_FBSDID -UDEBUGGING -UDEBUG
-DUSB_HAVE_DISABLE_ENUM -O2 -fno-math-errno -fomit-frame-pointer
-Wno-error=unused-command-line-argument -Wl,--hash-style=sysv
-fno-common -march=haswell -Wall -DFREEBSD_ELF -DIN_RTLD -ffreestanding
-I/smallblocks/src/lib/csu/common
-I/smallblocks/src/libexec/rtld-elf/amd64
-I/smallblocks/src/libexec/rtld-elf -fpic -DPIC -fvisibility=hidden
-mno-mmx -mno-sse -mno-avx -mno-avx2 -msoft-float -DNDEBUG -std=gnu99
-Wsystem-headers -Wall -Wno-format-y2k -W -Wno-unused-parameter
-Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wreturn-type
-Wcast-qual -Wwrite-strings -Wswitch -Wshadow -Wunused-parameter
-Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls
-Wold-style-definition -Wno-pointer-sign -Wformat=2
-Wno-format-extra-args -Wmissing-variable-declarations -Wthread-safety
-Wno-empty-body -Wno-string-plus-int -Wno-unused-const-variable
-Qunused-arguments -nostdlib -e .rtld_start -shared -Wl,-Bsymbolic
-Wl,-z,defs -Wl,--version-script=Version.map -Wl,-znow -o ld-elf.so.1
rtld_start.o reloc.o rtld.o rtld_lock.o rtld_malloc.o rtld_printf.o
map_object.o xmalloc.o debug.o libmap.o
-L/usr/obj/smallblocks/src/amd64.amd64/lib/libc -lc_nossp_pic
ld: error: unable to find library -lc_nossp_pic
cc: error: linker command failed with exit code 1 (use -v to see invocation)
*** Error code 1
(Most likely need to build libc - lets skip ahead)
Resort to a previous build (tar file) and pull ONLY /libexec/ld-elf.so.
Installing this, into the i386 jails
-r-xr-xr-x 1 root wheel 134040 20 May 11:39 libexec/ld-elf.so.1
enabled ldd to provide details, the necessary libraries are reachable.
# /usr/local/etc/rc.d/squid start
Starting squid.
Segmentation fault
---
squid also fails in an amd64 jail - segmentation fault.
Problem 2 - gcc 9.3.0 problem cc1 internal compiler error
---------
OK lets try rebuilding the simplest port audio/beep, in an amd64 jail
--- beep.o ---
cc1: internal compiler error: Segmentation fault
libbacktrace could not find executable to open
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://gcc.gnu.org/bugs/> for instructions.
*** [beep.o] Error code 1
make[1]: stopped in /var/ports/usr/ports/audio/beep/work/beep
1 error
As I force a lot of ports to use gcc9, this was a surprise, especially
as gcc9 is one of the few ports that doesn't use esoteric flags like
pie, bind or noexecstack. Lets use clang 10 instead.
clang 10 builds beep and it runs from
/usr/ports/audio/beep/work/stage/usr/local/bin/beep
PS I use gcc9 due to the availability of -fstack-clash-protection (which
is also in clang 10.1; for another day)
Problem 3 - pkg neither installs nor packages
---------
====> Compressing man pages (compress-man)
===> Building package for beep-1.0_1
pkg-static: failed to get the note section
pkg-static: failed to get the note section
pkg-static: Unable to determine ABI
pkg-static: Cannot parse configuration file!
*** Error code 1
Stop.
This is going to be a problem, as "make -C www/squid clean package"
neither builds a package nor performs an installation. Need some
mechanism to build/install without the pkg infrastructure...
# pkg-static help
pkg-static: failed to get the note section
pkg-static: failed to get the note section
pkg-static: Unable to determine ABI
pkg-static: Cannot parse configuration file!
Rebuilding pkg with clang 10 and copying
/usr/ports/ports-mgmt/pkg/work/stage/usr/local/sbin/pkg-static to
/usr/local/sbin/pkg-static, made no difference.
Back to squid
-------------
OK - lets try a bare bones squid, strip out everything to get a mini-squid
(Modify Makefile - Remove all defaults from squid, except GSSAPI_NONE;
remove perl5 from USES)
Because we can't build a package or install, lets try:
# /usr/ports/www/squid/work/stage/usr/local/sbin/squid -h
YES!!! (remember though, this is the old /libexec/ld-elf.so.1)
The runtime dependencies for "reduced" squid match "fat"
squid! Comment
out the refresh_patterns in squid.conf (probably why perl is needed)
And...
squid runs! (Something from Galaxy Quest comes to mind)
Reinstate the original (ie recently updated) ld-elf.so.1. Yep squid
starts and functions properly, though its interesting that
# ldd /usr/local/sbin/squid
/usr/local/sbin/squid:
ldd: /usr/local/sbin/squid: Cannot load PIE binary /usr/local/sbin/squid
as DSO
/usr/local/sbin/squid: exit status 1
---
Conclusion
----------
Some folks, perhaps only those that use pie :
- an upgrade to 12.1S may cause applications to segfault on both i386
and amd64, these applications will require a rebuild
- pkg is problematic, and what in the OS upgrade is causing these
messages (& failure) that weren't there yesterday?
- gcc9 isn't going to be an easy rebuild as it depends on gmake et al,
which won't install...
- iterating through: relro, now, pie, noexecstack indicated no
contribution to the problem. Seems to be something in image
activation... ld-elf ?
Next steps: investigate
failed to get the note -
/usr/ports/ports-mgmt/pkg/work/pkg-1.13.2/libpkg/pkg_elf.c
Unable to determine ABI -
/var/ports/usr/ports/ports-mgmt/pkg/work/pkg-1.13.2/libpkg/pkg_config.c
Cannot parse conf -
/var/ports/usr/ports/ports-mgmt/pkg/work/pkg-1.13.2/src/main.c
PS Re-enabling kern.elf32 and kern.elf64 and restarting the production
applications are functioning happily. Most applications are ok, squid
and gcc9 stand out.