RE: Build src tree in Develop/Debug mode
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 07 Dec 2023 03:39:22 UTC
Farhan Khan <farhan_at_farhan.codes> wrote on Date: Wed, 06 Dec 2023 17:09:59 UTC : > Is there a build-in-debug-mode flag I can run when building the kernel (or world)? > > I was tinkering through the build system and saw that the optimization is hardcoded to -O2 and objcopy strips debugging symbols. This means even with "CFLAGS+=-g -O0 -fno-inline-functions" in my /etc/make.conf I am still losing symbols and sometimes getting unwanted optimizations. The result is that `kgdb` often does not know what line a crash took place in. > > Is there an option to disable all optimizations, optimizations and symbol stripping? If not, IMO, this would be a good candidate for an option to add. > > I briefly wrote about this a few years back: https://blog.farhan.codes/2018/08/16/including-optimized-out-kernel-symbols-in-dtrace-on-freebsd/ References to get you started for where to look about various controls relative to how debug builds are handled and where(/if) debug information is placed . . . man src.conf reports : WITHOUT_ASSERT_DEBUG Compile programs and libraries without the assert(3) checks. . . . WITHOUT_DEBUG_FILES Avoid building or installing standalone debug files for each executable binary and shared library. . . . WITHOUT_SPLIT_KERNEL_DEBUG Do not build standalone kernel debug files. Debug data (if enabled by the kernel configuration file) will be included in the kernel and modules. When set, it enforces these options: WITHOUT_KERNEL_SYMBOLS . . . Also : WITHOUT_KERNEL_SYMBOLS Do not install standalone kernel debug symbol files. This option has no effect at build time. . . . man make.conf reports : BUILDING THE KERNEL . . . COPTFLAGS (str) Controls the compiler settings when building the kernel. Optimization levels above [-O (-O2, ...)] are not guaranteed to work. . . . BUILDING THE WORLD . . . WANT_FORCE_OPTIMIZATION_DOWNGRADE (int) Causes the system compiler to be built such that it forces high optimization levels to a lower one. cc(1) -O2 and above is known to trigger known optimizer bugs at various times. The value assigned is the highest optimization value used. . . . share/mk/bsd.README : STRIP The flag passed to the install program to cause the binary to be stripped. This is to be used when building your own install script so that the entire system can be made stripped/not-stripped using a single nob. sys/conf/NOTES : . . . # # The `makeoptions' parameter allows variables to be passed to the # generated Makefile in the build area. # # CONF_CFLAGS gives some extra compiler flags that are added to ${CFLAGS} # after most other flags. Here we use it to inhibit use of non-optimal # gcc built-in functions (e.g., memcmp). # # DEBUG happens to be magic. # The following is equivalent to 'config -g KERNELNAME' and creates # 'kernel.debug' compiled with -g debugging as well as a normal # 'kernel'. Use 'make install.debug' to install the debug kernel # but that isn't normally necessary as the debug symbols are not loaded # by the kernel and are not useful there anyway. # # KERNEL can be overridden so that you can change the default name of your # kernel. # # MODULES_OVERRIDE can be used to limit modules built to a specific list. # makeoptions CONF_CFLAGS=-fno-builtin #Don't allow use of memcmp, etc. #makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols . . . share/mk/bsd.sys.mk : # Additional flags passed in CFLAGS and CXXFLAGS when MK_DEBUG_FILES is # enabled. DEBUG_FILES_CFLAGS?= -g -gz=zlib share/mk/bsd.lib.mk : .if defined(DEBUG_FLAGS) CFLAGS+= ${DEBUG_FLAGS} .if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != "" CTFFLAGS+= -g .endif .else STRIP?= -s .endif . . . .if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \ empty(DEBUG_FLAGS:M-gdwarf*) .if !${COMPILER_FEATURES:Mcompressed-debug} CFLAGS+= ${DEBUG_FILES_CFLAGS:N-gz*} CXXFLAGS+= ${DEBUG_FILES_CFLAGS:N-gz*} .else CFLAGS+= ${DEBUG_FILES_CFLAGS} CXXFLAGS+= ${DEBUG_FILES_CFLAGS} .endif CTFFLAGS+= -g .endif share/mk/bsd.prog.mk : .if defined(DEBUG_FLAGS) CFLAGS+=${DEBUG_FLAGS} CXXFLAGS+=${DEBUG_FLAGS} .if ${MK_CTF} != "no" && ${DEBUG_FLAGS:M-g} != "" CTFFLAGS+= -g .endif .endif . . . .if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \ empty(DEBUG_FLAGS:M-gdwarf-*) .if !${COMPILER_FEATURES:Mcompressed-debug} CFLAGS+= ${DEBUG_FILES_CFLAGS:N-gz*} .else CFLAGS+= ${DEBUG_FILES_CFLAGS} .endif CTFFLAGS+= -g .endif . . . .if !defined(DEBUG_FLAGS) STRIP?= -s .endif . . . share/mk/bsd.own.mk : # Common variables .if !defined(DEBUG_FLAGS) STRIP?= -s .endif It may be that all this is familar. If so: Sorry for the noise. === Mark Millard marklmi at yahoo.com