Bug 253942 - clang -gz=zlib does not pass --compress-debug-sections to linker
Summary: clang -gz=zlib does not pass --compress-debug-sections to linker
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: bin (show other bugs)
Version: CURRENT
Hardware: Any Any
: --- Affects Only Me
Assignee: Ed Maste
Depends on:
Reported: 2021-03-01 17:54 UTC by Ed Maste
Modified: 2021-03-09 14:48 UTC (History)
0 users

See Also:


Note You need to log in before you can comment on or make changes to this bug.
Description Ed Maste freebsd_committer 2021-03-01 17:54:30 UTC
-gz=zlib compiler flag should enable compressed debug sections. It works as expected for object files, but does not pass the required flag to the linker to have them compressed in the final library/binary.


FreeBSD clang version 11.0.1 (git@github.com:llvm/llvm-project.git llvmorg-11.0.1-0-g43ff75f2c3fe)

Object file has the 'C' flag:

% cc -c -g -gz=zlib hello.c
% readelf -S hello.o | grep -A1 ' .debug_info'
  [ 6] .debug_info       PROGBITS         0000000000000000  000000c7
       0000000000000055  0000000000000000   C       0     0     8

Linked binary does not have the 'C' flag:

% cc -g -gz=zlib  hello.c -o hello
% readelf -S hello | grep -A1 ' .debug_info'
  [28] .debug_info       PROGBITS         0000000000000000  00001520
       0000000000000a91  0000000000000000           0     0     1

% Using gcc, the linked binary does have 'C' flag:

% gcc10 -g -gz=zlib  hello.c -o hello
% readelf -S hello | grep -A1 ' .debug_info'
  [24] .debug_info       PROGBITS         0000000000000000  0000150a
       00000000000004de  0000000000000000   C       0     0     1

Using -v to see the command line, gcc is automatically adding `-compress-debug-sections=zlib` to the linker invocation.
Comment 1 Ed Maste freebsd_committer 2021-03-01 18:15:48 UTC
It appears that clang 11 in the base system has this issue on Linux and FreeBSD.

Testing upstream I see that the flag is passed to the linker for --target=x86_64-unknown-linux-gnu but not for --target=x86_64-unknown-freebsd.

Compare upstream

freebsd::Linker::ConstructJob() needs to have added

  AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
Comment 3 Ed Maste freebsd_committer 2021-03-02 03:24:30 UTC
Comment 4 Ed Maste freebsd_committer 2021-03-02 13:47:57 UTC
Now committed as https://reviews.llvm.org/rG462cf39a5c180621b56f7602270ce33eb7b68d23
Comment 5 commit-hook freebsd_committer 2021-03-09 14:30:05 UTC
A commit in branch stable/13 references this bug:

URL: https://cgit.FreeBSD.org/src/commit/?id=c4dbe899aa08f60b66426ecf63b1346bffe25ed8

commit c4dbe899aa08f60b66426ecf63b1346bffe25ed8
Author:     Ed Maste <emaste@FreeBSD.org>
AuthorDate: 2021-03-03 01:35:57 +0000
Commit:     Ed Maste <emaste@FreeBSD.org>
CommitDate: 2021-03-09 14:28:54 +0000

    clang: Fix -gz=zlib options for linker

    Clang commit ccb4124a4172bf2cb2e1cd7c253f0f1654fce294:

    Fix -gz=zlib options for linker

    gcc translates -gz=zlib to --compress-debug-options=zlib for both
    assembler and linker but clang only does this for assembler.

    The linker needs --compress-debug-options=zlib option to compress the
    debug sections in the generated executable or shared library.

    Due to this bug, -gz=zlib has no effect on the generated executable or
    shared library.

    This patch fixes that.

    Clang commit 462cf39a5c180621b56f7602270ce33eb7b68d23:

    [Driver] Fix -gz=zlib options for linker also on FreeBSD

    ccb4124a4172 fixed translating -gz=zlib to --compress-debug-sections for
    linker invocation for several ToolChains, but omitted FreeBSD.

    PR:             253942
    Approved by:    dim
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D29028

    (cherry picked from commit 19587d742264c5caec33d218e9cea6eb78f6c6bb)

 .../clang/lib/Driver/ToolChains/AMDGPU.cpp             |  1 +
 .../clang/lib/Driver/ToolChains/CommonArgs.cpp         | 18 ++++++++++++++++++
 .../clang/lib/Driver/ToolChains/CommonArgs.h           |  4 ++++
 .../clang/lib/Driver/ToolChains/FreeBSD.cpp            |  1 +
 .../llvm-project/clang/lib/Driver/ToolChains/Gnu.cpp   |  1 +
 .../llvm-project/clang/lib/Driver/ToolChains/HIP.cpp   |  2 ++
 6 files changed, 27 insertions(+)