madler / zlib

A massively spiffy yet delicately unobtrusive compression library.
http://zlib.net/
Other
5.55k stars 2.42k forks source link

Fix building with `z_` prefix #936

Open DenizThatMenace opened 6 months ago

DenizThatMenace commented 6 months ago

This PR fixes a problem with the version-script (zlib.map) when also building with enabled z_ prefix for the function names.

Without the changes from this PR the version-script did not properly assign version numbers to the function symbols in zlib.so (using GCC or Clang) if the function symbols are prefixed with z_!


Background

Most linkers silently ignored this error and just generated a zlib.so without any version numbers attached. Starting with lld 17 (or was it 16?), however, linking even fails with the following errors:

ld.lld-17: error: version script assignment of 'ZLIB_1.2.0' to symbol 'compressBound' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.0' to symbol 'deflateBound' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.0' to symbol 'inflateBack' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.0' to symbol 'inflateBackEnd' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.0' to symbol 'inflateBackInit_' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.0' to symbol 'inflateCopy' failed: symbol not defined
ld.lld-17: error: version script assignment of 'local' to symbol 'deflate_copyright' failed: symbol not defined
ld.lld-17: error: version script assignment of 'local' to symbol 'inflate_copyright' failed: symbol not defined
ld.lld-17: error: version script assignment of 'local' to symbol 'inflate_fast' failed: symbol not defined
ld.lld-17: error: version script assignment of 'local' to symbol 'inflate_table' failed: symbol not defined
ld.lld-17: error: version script assignment of 'local' to symbol 'zcalloc' failed: symbol not defined
ld.lld-17: error: version script assignment of 'local' to symbol 'zcfree' failed: symbol not defined
ld.lld-17: error: version script assignment of 'local' to symbol 'gz_error' failed: symbol not defined
ld.lld-17: error: version script assignment of 'local' to symbol 'gz_intmax' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.0.2' to symbol 'gzclearerr' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.0.2' to symbol 'gzungetc' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.0.2' to symbol 'zlibCompileFlags' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.0.8' to symbol 'deflatePrime' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.2' to symbol 'adler32_combine' failed: symbol not defined
ld.lld-17: error: version script assignment of 'ZLIB_1.2.2' to symbol 'crc32_combine' failed: symbol not defined
ld.lld-17: error: too many errors emitted, stopping now (use --error-limit=0 to see all errors)

The reason is that zlib.map did not care whether the z_ prefix is used or not.

Neustradamus commented 2 months ago

@madler: Have you seen this PR?

DenizThatMenace commented 1 month ago

@madler, do you mind having a look at this PR?

Merging this would fix versioned symbols in the built shared object (zlib.so).

Without the change from this PR using the version-script (zlib.map) has no effect when the z_ prefix is used on function names! (Even worse, with newer lld linkers it will no longer build.)