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 and LazyLock types delay the initialization until the first use. These extend the earlier OnceCell and OnceLock 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 an impl 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 to rust-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 and std::panic::PanicInfo are now different types.
  • extern "C" functions now abort on uncaught panics. Use extern "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 the stdversion analyzer which flags references to symbols that are too new for the version of Go you use in the referring file.
  • The cmd and cgo features support the -ldflags option to pass flags to the C linker. The go command uses this flag automatically to avoid argument list too long errors when you use a very large CGO_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 first goroutine.
  • 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 or Ticker, garbage collection cleans them up immediately even if their Stop method has not been called. The timer channel associated with a Timer or Ticker is now unbuffered with capacity 0. This ensures that, every time a Reset or Stop method is called, no stale values are not sent or received after the call.
  • The new unique package provides facilities for canonicalizing values, such as interning or hash-consing.
  • The new iter package provides the basic definitions to work with user-defined iterators.
  • The slices and maps 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, and abilint 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 kernel debuginfo packages is now significantly faster.
  • The dwfl_set_sysroot, dwfl_frame_unwound_source, and dwfl_unwound_source_str functions were added to the libdw 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:

Copy to Clipboard Toggle word wrap
# 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.

Important

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.

Note

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:

Copy to Clipboard Toggle word wrap
# 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.

Back to top
Red Hat logoGithubredditYoutubeTwitter

Learn

Try, buy, & sell

Communities

About Red Hat Documentation

We help Red Hat users innovate and achieve their goals with our products and services with content they can trust. Explore our recent updates.

Making open source more inclusive

Red Hat is committed to replacing problematic language in our code, documentation, and web properties. For more details, see the Red Hat Blog.

About Red Hat

We deliver hardened solutions that make it easier for enterprises to work across platforms and environments, from the core datacenter to the network edge.

Theme

© 2025 Red Hat, Inc.