Chapter 7. Compilers and development tools
The following chapter contains the most notable changes to compilers and development tools between RHEL 8 and RHEL 9.
7.1. Notable changes to LLVM, Rust, and Go
LLVM Toolset updated to 19.1.7
LLVM Toolset has been updated to version 19.1.7.
Notable changes of the LLVM compiler:
- LLVM now uses debug records, a more efficient representation for debug information.
Notable updates of the Clang:
- C++14 sized deallocation is now enabled by default.
- C++17 support has been completed.
- Improvements to C++20 support, especially around modules, concepts, and Class Template Argument Deduction (CTAD) have been added.
- Improvements to C23, C2c, C23, and C2y support have been added.
For more information, see the LLVM release notes and Clang release notes.
LLVM Toolset is a rolling Application Stream, and only the latest version is supported. For more information, see the Red Hat Enterprise Linux Application Streams Life Cycle document.
Rust Toolset rebased to version 1.84.0
Rust Toolset has been updated to version 1.84.0. Notable enhancements since the previously available version 1.79.0 include:
-
The new
LazyCell
andLazyLock
types delay the initialization until the first use. These extend the earlierOnceCell
andOnceLock
types with the initialization function included in each instance. - The new sort implementations in the standard library improve the runtime performance and compile times. They also try to detect cases where a comparator is not producing a total order, making that panic instead of returning unsorted data.
-
Precise capturing for opaque return types have been added. The new
use<..>
syntax specifies the generic parameters and lifetimes used in animpl Trait
return type. Many new features for
const
code have been added, for example:- Floating point support
-
const
immediates for inline assembly - References to statics
- Mutable reference and pointers
Many new features for
unsafe
code have been added, for example:- Strict provenance APIs
-
&raw
pointer syntax - Safely addressing statics
-
Declaring safe items in unsafe
extern
blocks
-
The Cargo dependency resolver is now version aware. If a dependency crate specifies its minimum supported Rust version, Cargo uses this information when it resolves the dependency graph instead of using the latest
semver
-compatible crate version.
Compatibility notes:
-
The WebAssembly System Interface (WASI) target is changed from
rust-std-static-wasm32-wasi
torust-std-static-wasm32-wasip1
. You can select the WASI target also by using the--target wasm32-wasip1
parameter on the command line. For more information, see the Changes to Rust’s WASI targets upstream blog post. -
The split panic hook and panic handler arguments
core::panic::PanicInfo
andstd::panic::PanicInfo
are now different types. -
extern "C"
functions now abort on uncaught panics. Useextern "C-unwind"
instead to allow unwinding across ABI boundaries.
Rust Toolset is a rolling Application Stream, and Red Hat only supports the latest version. For more information, see the Red Hat Enterprise Linux Application Streams Life Cycle document.
Go Toolset rebased to version 1.23
Go Toolset has been updated to version 1.23. Notable enhancements include:
The
for-range
loop accepts iterator functions of the following types:-
func(func() bool)
-
func(func(K) bool)
func(func(K, V) bool)
Calls of the iterator argument function create the iteration values for the
for-range
loop. For reference links, see the upstream release notes.
-
- The Go Toolchain can collect usage and breakage statistics to help the Go team to understand how the Go Toolchain is used and working. By default, Go Telemetry does not upload telemetry data and stores it only locally. For further information, see the upstream Go Telemetry documentation.
-
The
go vet
sub-command includes thestdversion
analyzer which flags references to symbols that are too new for the version of Go you use in the referring file. -
The
cmd
andcgo
features support the-ldflags
option to pass flags to the C linker. Thego
command uses this flag automatically to avoidargument list too long
errors when you use a very largeCGO_LDFLAGS
environment variable. -
The
trace
utility tolerates partially broken traces and attempts to recover the trace data. This is especially useful in case of crashes, because you can get the trace leading up to the crash. -
The traceback printed by the runtime after an unhandled panic or other fatal error carries indentation to distinguish the stack trace of the
goroutine
from the firstgoroutine
. - The compiler build time overhead of using profile-guided optimization was reduced to single-digit percentage.
-
The new
-bindnow
linker flag enables immediate function binding when building a dynamically-linked ELF binary. -
The
//go:linkname
linker directive no longer refers to internal symbols in the standard library and the runtime that are not marked with//go:linkname
on their definition. -
If a program no longer refers to a
Timer
orTicker
, garbage collection cleans them up immediately even if theirStop
method has not been called. The timer channel associated with aTimer
orTicker
is now unbuffered with capacity 0. This ensures that, every time aReset
orStop
method is called, no stale values are not sent or received after the call. -
The new
unique
package provides facilities for canonicalizing values, such asinterning
orhash-consing
. -
The new
iter
package provides the basic definitions to work with user-defined iterators. -
The
slices
andmaps
packages introduce several new functions that work with iterators. -
The new
structs
package provides types for struct fields that modify properties of the containing struct type, such as memory layout. Minor changes are made in the following packages:
-
archive/tar
-
crypto/tls
-
crypto/x509
-
database/sql
-
debug/elf
-
encoding/binary
-
go/ast
-
go/types
-
math/rand/v2
-
net
-
net/http
-
net/http/httptest
-
net/netips
-
path/filepath
-
reflect
-
runtime/debug
-
runtime/pprof
-
runtime/trace
-
slices
-
sync
-
sync/atomic
-
syscall
-
testing/fstest
-
text/template
-
time
-
unicode/utf16
-
For more information, see the upstream release notes.
Go Toolset is a rolling Application Stream, and Red Hat supports only the latest version. For more information, see the Red Hat Enterprise Linux Application Streams Life Cycle document.
7.2. Notable changes to performance tools and debuggers
valgrind
rebased to version 3.24.0
The valgrind
suite has been updated to version 3.24.0. Notable enhancements include:
-
The
--track-fds=yes
option now shows suppressible errors when using bad file descriptors, and the errors are written to the XML output. The warnings shown, if you do not use the option, are deprecated and will be removed in a future version. - Error messages now support Ada name demangling.
-
The
deflate-conversion
facility (z15/arch13) now supports the deflate compression call (DFLTCC) instruction on the IBM Z platform. -
On the IBM Z platform,
Valgrind
now supports the instructions provided by the message security assist (MSA) facility and its 1-9 extensions. Valgrind
now supports the following new Linux system calls:-
open_tree
-
move_mount
-
fsopen
-
fsconfig
-
fsmount
-
fspick
-
landlock_create_ruleset
-
landlock_add_rule
-
landlock_restrict_self
-
libabigail
rebased to version 2.6
The libabigail
library has been updated to version 2.6. Notable changes include:
- Better support for Linux kernel module analysis by using the BPF Type Format (BTF) and Common Trace Format (CTF).
- Improved internal type comparison algorithms in the middle end.
-
Improved logging in
abipkgdiff
,abidw
, andabilint
utilities. - Numerous bug fixes.
For further changes, see the upstream release notes.
elfutils
rebased to version 0.192
The elfutils
package has been updated to version 0.192. Notable improvements include:
-
The
debuginfod
service can now perform a per-file signature verification to check the integrity by using the RPM Integrity Measurement Architecture (IMA) scheme from RHEL. -
A new
debuginfod
API was added to query server metadata, such as querying the build ID from a file name. -
Debuginfod
server-side extraction of files from kerneldebuginfo
packages is now significantly faster. -
The
dwfl_set_sysroot
,dwfl_frame_unwound_source
, anddwfl_unwound_source_str
functions were added to thelibdw
library. -
The
eu-stacktrace
utility is available as a Technology Preview. For details, see xref:[Jira-RHELDOCS-19072].
SystemTap
rebased to version 5.2
The SystemTap
tracing and probing tool has been updated to version 5.2.
A notable enhancement is the full activation of debuginfod-metadata
based probes, based on elfutils
0.192. With this feature, you can write a systemtap
script to target a full range of versions of a given binary or library by searching a debuginfod
server for all matching names.
7.3. Notable changes to glibc
All threading APIs now merged into libc.so.6
In RHEL 8, the system threading library, libpthread.so
, was a distinct library. In RHEL 9, all threading APIs have been merged into the core C library libc.so.6
. Moving threading into the core C library enables the library to support threads by default. With a single file the in-place upgrade process is also made smoother since the thread APIs and core C, POSIX and BSD APIs are all updated at the same time (no distinct libraries).
Developers can continue to use the -lpthread
option when linking threaded applications, but it is no longer necessary.
Historically, libraries used a weak reference to pthread_create
or pthread_cancel
to detect if processes could possibly be multi-threaded. Since this check now always succeeds, because libpthread.so
is now in the core C library, libraries should use the __libc_single_threaded
symbol for this instead.
The libdl
library now merged into libc.so.6
In RHEL 8, the libdl
library was a distinct library. In RHEL 9, the libdl
library has been merged into the core C library libc.so.6
. This means that interposing the dlsym
function is now much more difficult. Applications that need to control the way how symbol resolution works should switch to the auditor (LD_AUDIT
) interfaces.
Name Service Switch service plugins for dns
and files
now merged into libc.so.6
In RHEL 8, the Name Service Switch (NSS) services for files
and dns
, which provides data to user and group identity management APIs, was a distinct plugin. In RHEL 9, the plugins have been merged into the core C library libc.so.6.
Moving the files
and dns
service providers ensures that applications that need to cross a mount namespace boundary (for example, enter a container) can do so knowing that NSS files
and dns
access services are always loaded at process startup.
When calling user and group APIs, where those APIs depend on an nsswitch.conf
that references files
or dns
, developers can expect those services to always be present and provide the underlying service data.
7.4. Red Hat build of OpenJDK
Red Hat build of OpenJDK 17 is the default Java implementation since RHEL 9.5
The default RHEL 9 Java implementation is being changed from OpenJDK 11, which has reached its End Of Life (EOL), to OpenJDK 17. After this update, the java-17-openjdk
packages, which provide the OpenJDK 17 Java Runtime Environment and the OpenJDK 17 Java Software Development Kit, will also provide the java
and java-devel
packages. For more information, see the OpenJDK documentation.
Existing packages in RHEL 9 that call java/bin
or java-openjdk/bin
directly will be immediately able to use OpenJDK 17.
Existing packages in RHEL 9 that require the java
or java-devel
packages directly, namely tomcat
and systemtap-runtime-java
, will pull the appropriate dependency automatically.
Ant, Maven, and packages that are using Java indirectly through the javapackages-tools
package will be fully transitioned in an asynchronous update shortly after the general availability of RHEL 9.5.
If you need to install OpenJDK for the first time or if the default package is not installed through a dependency chain, use DNF:
dnf install java-17-openjdk-devel
# dnf install java-17-openjdk-devel
For more information, see Installing multiple minor versions of Red Hat build of OpenJDK on RHEL by using yum.
The current java-11-openjdk
packages in RHEL 9 will not receive any further updates. However, Red Hat will provide Extended Life Cycle support (ELS) phase 1 with updates for Red Hat build of OpenJDK 11 until October 31, 2027. See Red Hat build of OpenJDK 11 Extended Lifecycle Support (ELS-1) Availability for details.
For information specific to the OpenJDK ELS program and the OpenJDK lifecycle, see the OpenJDK Life Cycle and Support Policy.
If you have the alternatives
command set to manual
mode for java
and related components, OpenJDK 11 will still be used after the update. To use OpenJDK 17 in this case, change the alternatives
setting to auto
, for example:
alternatives --auto java alternatives --auto javac
# alternatives --auto java
# alternatives --auto javac
Use the alternatives --list
command to verify the settings.
7.5. .NET on RHEL 9
.NET 7.0 is no longer supported
.NET 7.0 reached its End Of Life (EOL) in May 2024. Use .NET 8.0 or later instead. For details about usage, see .NET 8.0 documentation. For information about the length of support, see the Red Hat Enterprise Linux Application Streams Life Cycle.