freebsd kernel with SKQ
Go to file
Alex Richardson 0e1e341b48 Stop using lorder and ranlib when building libraries
Use of ranlib or lorder is no longer necessary with current linkers
(probably anything newer than ~1990) and ar's ability to create an object
index and symbol table in the archive.
Currently the build system uses lorder+tsort to sort the .o files in
dependency order so that a single-pass linker can use them. However,
we can use the -s flag to ar to add an index to the .a file which makes
lorder unnecessary.
Running ar -s is equivalent to running ranlib afterwards, so we can also
skip the ranlib invocation.

Similarly, we don't have to pass the .o files for shared libraries in
dependency order since both ld.bfd and ld.lld will correctly resolve
references between the .o files.

This removes many fork()+execve calls for each library so should speed up
builds a bit. Additionally lorder.sh uses a regular expression that is not
supported by the macOS libc or glibc and results in many warnings when
cross-building (see D25989).

There is one functional change: lorder.sh removed duplicated .o files
from the linker command line which now no longer happens. I fixed the duplicates
in the base system in r364649. I also checked the ports tree for uses of
bsd.lib.mk and found one duplicate source file which I fixed in r548168.
Most ports use CMake/autotools rather than bsd.lib.mk but if this breaks any
ports that I missed in my search please let me know.

Avoiding the shell script actually speeds up the linking step noticeably: I
measured how long it takes to rebuild the .a and .so files for lib/libc using a
basic benchmark: `rm $LIBC_OBJDIR/*.so* $LIBC_OBJDIR/*.a* && /usr/bin/time make -DWITHOUT_TESTS -s > /dev/null`
Without this change ~4.5 seconds and afterwards ~3.1 seconds.
Looking at truss -cf output we can see that the number fork() system
calls goes down from 27 to 12 (and the speedup while tracing is more
noticeable: 81 seconds -> 65 seconds).

See also https://www.gnu.org/software/coreutils/manual/html_node/tsort-background.html
for some more background:
This whole procedure has been obsolete since about 1980, because Unix
archives now contain a symbol table (traditionally built by ranlib, now
generally built by ar itself), and the Unix linker uses the symbol table
to effectively make multiple passes over an archive file.

Or alternatively https://www.unix.com/man-page/osf1/1/lorder/:
The lorder command is essentially obsolete.  Use the following command in
its place: % ar -ts file.a

Reviewed By:	 emaste, imp, dim
Differential Revision: https://reviews.freebsd.org/D26044
2020-09-17 15:07:25 +00:00
bin cp: fall back to read/write if copy_file_range fails 2020-09-11 20:49:36 +00:00
cddl Use MACHINE_CPUARCH when checking for arm64 2020-09-14 16:12:28 +00:00
contrib Revert r249362, atime update in tmpfs is fixed in r365810 2020-09-17 07:13:41 +00:00
crypto Fix Clang version detection. 2020-08-26 16:55:28 +00:00
etc Merge ^/head r364082 through r364250. 2020-08-15 11:49:31 +00:00
gnu Remove now-unused GNU as build infrastructure 2020-06-07 13:53:23 +00:00
include [PowerPC64LE] Ensure nvram is built on powerpc64le. 2020-09-13 18:24:15 +00:00
kerberos5 Fix a noisy -Wundef warning when bootstrapping tools 2020-09-10 15:37:15 +00:00
lib Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp 2020-09-16 16:58:29 +00:00
libexec ftpd: Exit during authentication if an error occurs after chroot(). 2020-09-15 20:54:18 +00:00
release Fix setting RELENGDIR when release.sh is called from an external 2020-09-14 15:58:10 +00:00
rescue libifconfig now depends on libm due to usage of log10(). 2020-09-02 22:10:08 +00:00
sbin Skip armv7 bectl tests on CI; they deadlock (""KSTACK_PAGES is 2"). 2020-09-14 10:35:39 +00:00
secure caroot: properly remove old distrusted roots 2020-09-02 12:57:34 +00:00
share Stop using lorder and ranlib when building libraries 2020-09-17 15:07:25 +00:00
stand [PowerPC] Remove obsolete MK_LOADER_FORCE_LE 2020-09-15 04:22:28 +00:00
sys Add dtb/sifive module 2020-09-17 14:58:30 +00:00
targets Add WITH_CLANG_FORMAT option 2020-06-24 17:03:42 +00:00
tests Use MACHINE_CPUARCH when checking for arm64 2020-09-14 16:12:28 +00:00
tools Add descriptions of the WITH_(OUT)_GH_BC options that exist in -CURRENT 2020-09-15 16:22:05 +00:00
usr.bin Fix some posixshmcontrol nits. 2020-09-15 13:36:19 +00:00
usr.sbin certctl: fix unprivileged mode 2020-09-15 17:13:29 +00:00
.arcconfig
.arclint arc lint: ignore /tests/ in chmod 2017-12-19 03:38:06 +00:00
.cirrus.yml Cirrus-CI: increase timeout to 120m 2020-02-19 15:56:40 +00:00
.clang-format Set AlignTrailingComments in the clang-format config 2020-09-10 14:11:29 +00:00
.gitattributes Add a basic clang-format configuration file 2019-06-07 15:23:52 +00:00
.gitignore .gitignore: Add LINT kernel configurations generated into SRCDIR 2019-08-10 18:22:22 +00:00
COPYRIGHT Happy New Year 2020! 2019-12-31 16:01:36 +00:00
LOCKS LOCKS: update current locks 2018-06-09 03:08:04 +00:00
MAINTAINERS Add a pointer to csprng@ for the CSPRNG driver. This is enforced anyway by 2020-09-01 08:02:12 +00:00
Makefile Fix typo in r364325 that broke tinderbox with -DBUILD_WITH_STRICT_TMPPATH 2020-08-25 13:30:19 +00:00
Makefile.inc1 installworld: run certctl rehash after installation completes 2020-09-17 02:18:21 +00:00
Makefile.libcompat Add WITH_/WITHOUT_CLEAN option to replace NO_CLEAN 2020-09-08 00:44:35 +00:00
Makefile.sys.inc AUTO_OBJ: For all top-level targets enforce using an OBJDIR. 2017-12-05 21:29:47 +00:00
ObsoleteFiles.inc Remove vm_map_create(9) KPI's manpage according to r364302 2020-09-10 06:32:25 +00:00
README README: add generic notes about GENERIC and NOTES 2018-06-17 19:44:24 +00:00
README.md README: add generic notes about GENERIC and NOTES 2018-06-17 19:44:24 +00:00
RELNOTES Add an entry to RELNOTES for the NFS over TLS kernel support. 2020-08-30 21:46:29 +00:00
UPDATING Turn MALLOC_PRODUCTION into a regular src.conf(5) option 2020-09-05 23:30:17 +00:00

FreeBSD Source:

This is the top level of the FreeBSD source directory. This file was last revised on: FreeBSD

FreeBSD is an operating system used to power modern servers, desktops, and embedded platforms. A large community has continually developed it for more than thirty years. Its advanced networking, security, and storage features have made FreeBSD the platform of choice for many of the busiest web sites and most pervasive embedded networking and storage devices.

For copyright information, please see the file COPYRIGHT in this directory. Additional copyright information also exists for some sources in this tree - please see the specific source directories for more information.

The Makefile in this directory supports a number of targets for building components (or all) of the FreeBSD source tree. See build(7), config(8), https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html, and https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html for more information, including setting make(1) variables.

Source Roadmap:

bin		System/user commands.

cddl		Various commands and libraries under the Common Development
		and Distribution License.

contrib		Packages contributed by 3rd parties.

crypto		Cryptography stuff (see crypto/README).

etc		Template files for /etc.

gnu		Various commands and libraries under the GNU Public License.
		Please see gnu/COPYING* for more information.

include		System include files.

kerberos5	Kerberos5 (Heimdal) package.

lib		System libraries.

libexec		System daemons.

release		Release building Makefile & associated tools.

rescue		Build system for statically linked /rescue utilities.

sbin		System commands.

secure		Cryptographic libraries and commands.

share		Shared resources.

stand		Boot loader sources.

sys		Kernel sources.

sys/<arch>/conf Kernel configuration files. GENERIC is the configuration
		used in release builds. NOTES contains documentation of
		all possible entries.

tests		Regression tests which can be run by Kyua.  See tests/README
		for additional information.

tools		Utilities for regression testing and miscellaneous tasks.

usr.bin		User commands.

usr.sbin	System administration commands.

For information on synchronizing your source tree with one or more of the FreeBSD Project's development branches, please see:

https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/current-stable.html