- The article explains why the –compress-debug-sections=zstd option with binutils causes a fatal error on some Linux systems, and how to fix it by upgrading binutils or using a different compression algorithm.
- The article also discusses the benefits and drawbacks of using compressed debug sections, such as reducing the size of binary files, improving performance, and enhancing security, but also increasing CPU usage, complexity, and compatibility issues.
- The article concludes with some frequently asked questions and answers related to compressed debug sections, such as how to check, decompress, or compress a binary file that has compressed debug sections.
If you are using binutils to manipulate binary files on Linux, you may encounter an error like this:
Fatal error: Invalid --compress-debug-sections option: `zstd'
This error occurs when you try to use the –compress-debug-sections=zstd option with binutils, which is supposed to compress the debug sections of an ELF file with the Zstandard algorithm. However, this option is not supported by all versions of binutils, and may cause compatibility issues with other tools that consume the compressed debug sections.
In this article, I will explain why this error happens, how to fix it, and what are the benefits and drawbacks of using compressed debug sections. I will also answer some frequently asked questions related to this topic.
Why does this error happen?
Table of Contents
The –compress-debug-sections=zstd option was introduced in binutils 2.37, which was released in July 2021. This option implements the ELFCOMPRESS_ZSTD format, which was standardized in the generic System V Application Binary Interface (ABI) in July 2021 as well. This format uses the Zstandard compression algorithm, which is a modern and efficient algorithm that offers better compression ratio and speed than zlib, the previous standard for compressing debug sections.
However, not all Linux distributions have updated their binutils packages to version 2.37 or higher. For example, as of October 2021, Ubuntu 21.04 still uses binutils 2.36.1, which does not support the –compress-debug-sections=zstd option. Therefore, if you try to use this option on such a system, you will get the fatal error mentioned above.
Moreover, even if you have binutils 2.37 or higher installed on your system, you may still encounter compatibility issues with other tools that consume the compressed debug sections. For example, gdb, the GNU debugger, only added support for ELFCOMPRESS_ZSTD in version 11.1, which was released in September 2021. Therefore, if you try to debug a binary file that has compressed debug sections with Zstandard using an older version of gdb, you will get an error like this:
BFD: /path/to/binary: unknown compression algorithm 3
This error means that gdb does not recognize the compression algorithm used by the binary file, and cannot decompress the debug sections.
How to fix it?
There are two possible ways to fix this error:
- Upgrade your binutils package to version 2.37 or higher, and make sure that other tools that consume the compressed debug sections also support ELFCOMPRESS_ZSTD. This may require adding a third-party repository or compiling from source code, depending on your Linux distribution and package manager. You can check the version of binutils by running ld –version or objcopy –version. You can check the version of gdb by running gdb –version.
- Use a different compression algorithm for compressing debug sections, such as zlib or none. You can specify the compression algorithm by using the –compress-debug-sections option with binutils tools such as ld or objcopy. For example, to compress debug sections with zlib, you can use –compress-debug-sections=zlib. To disable compression altogether, you can use –compress-debug-sections=none. Note that zlib is supported by most versions of binutils and gdb, but it may not offer the same compression ratio and speed as Zstandard.
What are the benefits and drawbacks of using compressed debug sections?
Compressing debug sections can reduce the size of binary files significantly, especially for large projects that contain a lot of debugging information. For example, according to this blog post, compressing debug sections with Zstandard can reduce the size of clang by 68%, compared to uncompressed debug sections.
Reducing the size of binary files can have several advantages, such as:
- Saving disk space and bandwidth
- Improving loading time and memory usage
- Enhancing security and privacy by making reverse engineering harder
However, compressing debug sections also has some drawbacks, such as:
- Increasing CPU usage and complexity
- Reducing compatibility and portability
- Requiring decompression support by consumers
Therefore, whether to use compressed debug sections or not depends on your use case and trade-offs. If you need to distribute your binary files to other users or systems, you may want to avoid compressing debug sections with Zstandard until it becomes more widely supported. If you only need to use your binary files locally or for debugging purposes, you may benefit from compressing debug sections with Zstandard to save space and improve performance.
Frequently Asked Questions
Here are some common questions and answers related to compressed debug sections.
Question: How can I check if a binary file has compressed debug sections?
Answer: You can use the readelf tool to inspect the section headers of a binary file. For example, to list the section headers of a binary file named a.out, you can run readelf -S a.out. If a section has the SHF_COMPRESSED flag, it means that it is compressed. You can also use the -t option to show the compression type and size. For example, to show the compression type and size of a section named .debug_info, you can run readelf -t -x .debug_info a.out.
Question: How can I decompress a binary file that has compressed debug sections?
Answer: You can use the objcopy tool to decompress a binary file that has compressed debug sections. For example, to decompress a binary file named a.out and create a new file named b.out, you can run objcopy –decompress-debug-sections a.out b.out. This will decompress all the debug sections in the binary file, regardless of the compression algorithm used.
Question: How can I compress a binary file that has uncompressed debug sections?
Answer: You can use the objcopy tool to compress a binary file that has uncompressed debug sections. For example, to compress a binary file named a.out with Zstandard and create a new file named b.out, you can run objcopy –compress-debug-sections=zstd a.out b.out. This will compress all the debug sections in the binary file with Zstandard, if they are not already compressed.
This article is for informational purposes only and does not constitute professional advice. The author is not responsible for any consequences or damages resulting from following or applying the information in this article. The user should always verify the information and consult with their own experts before using any tools or techniques mentioned in this article.