ZHCU875Z August 2001 – October 2023 SM320F28335-EP
自动生成复制表时,链接器提供了一种压缩加载空间数据的方法。这可以减少只读存储器占用空间。在将压缩的数据从加载空间复制到运行空间时可以解压缩此数据。
仅当通过指定 --abi=eabi 选项使用 EABI 对象模块时才支持对复制表进行压缩。对于 COFF 目标模块,此功能不受支持。
可通过两种方式指定压缩:
table( name, compression= compression_kind)
compression_kind 可以是以下类型之一:
不带 compression 关键字的 table() 运算符使用通过命令行选项 --copy_compression 指定的压缩类型。如果没有使用命令行选项指定 compression_kind,则默认为 LZSS 压缩。
选择压缩时,不能保证链接器将会压缩加载数据。仅当压缩会减小加载空间的整体大小时,链接器才会压缩加载数据。在某些情况下,即使压缩会使加载段大小变小,如果解压缩例程会抵消节省量,那么链接器也不会压缩数据。
例如,假设 RLE 压缩将 section1 的大小减少 30 个字节。此外,还假设 RLE 解压缩例程在加载空间中占用 40 字节。通过选择对 section1 进行压缩,加载空间将增加 10 个字节。因此,链接器不会压缩 section1。另一方面,如果有另一个段(比如 section2)可以从应用相同的压缩中受益超过 10 个字节,则可以压缩这两个段,使得整体加载空间减小。在此类情况下,链接器会压缩这两个段。
当这样做无法实现节省时,不能强制链接器压缩数据。
不能对解压缩例程或包含 .cinit 的 GROUP 中的任何成员进行压缩。