On macOS, strip=symbols
results in "error: symbols referenced by indirect symbol table entries that can't be stripped in <file>.dylib" #93988
Description
When the new strip
codegen option is used on OS X with mode "symbols"
(which is the highest strip mode, and what is used when strip=true
is passed to Cargo), the build emits the following warning for the testcase below:
Compiling libcnb-proc-macros v0.1.1 (/Users/emorley/src/libcnb.rs/libcnb-proc-macros)
warning: stripping debug info with `strip` failed: exit status: 1
|
= note: /Library/Developer/CommandLineTools/usr/bin/strip: error: symbols referenced by indirect symbol table entries that can't be stripped in: /Users/emorley/src/testcase/target/release/deps/liblibcnb_proc_macros-5b9f8927d4ae103e.dylib
Doing any of the following stops the warning from appearing (see the workarounds section below for more details):
- Setting
strip
to"debuginfo"
instead of"symbols"
(globally). - Setting a
build-override
forstrip
, to turn it off for proc-macros/... only, whilst leaving it set to"symbols"
for everything else. - Changing the dependency in the testcase below from a local
path
reference to the published crate. (The published crate is identical to the local version, so this seems significant?)
This potentially seems like fallout from #88137 - cc @joshtriplett
Steps to reproduce
git clone https://github.com/Malax/libcnb.rs
(currently at11bdefc02d649fdde3ac5c1404e7d8d5f8f2681c
)cargo new testcase && cd $_
cargo add ../libcnb.rs/libcnb-proc-macros
CARGO_PROFILE_RELEASE_STRIP=symbols cargo build --release
Expected
The cargo build completes successfully (exit code 0), with no warnings/errors seen in the build output.
Actual
Whilst the build completes successfully (exit code 0), there is a warning/error about stripping in the build output. Ideally rustc would configure stripping so it "just works" with one of the presets like "symbols", or else suppress warnings if they are deemed expected in certain scenarios.
$ CARGO_PROFILE_RELEASE_STRIP=symbols cargo build --release
Compiling memchr v2.4.1
Compiling proc-macro2 v1.0.36
Compiling unicode-xid v0.2.2
Compiling syn v1.0.86
Compiling regex-syntax v0.6.25
Compiling bit-vec v0.6.3
Compiling bit-set v0.5.2
Compiling aho-corasick v0.7.18
Compiling quote v1.0.15
Compiling regex v1.5.4
Compiling fancy-regex v0.7.1
Compiling libcnb-proc-macros v0.1.1 (/Users/emorley/src/libcnb.rs/libcnb-proc-macros)
warning: stripping debug info with `strip` failed: exit status: 1
|
= note: /Library/Developer/CommandLineTools/usr/bin/strip: error: symbols referenced by indirect symbol table entries that can't be stripped in: /Users/emorley/src/testcase/target/release/deps/liblibcnb_proc_macros-5b9f8927d4ae103e.dylib
__NSGetArgc
__NSGetArgv
__NSGetEnviron
__NSGetExecutablePath
__Unwind_Backtrace
__Unwind_DeleteException
__Unwind_GetCFA
__Unwind_GetDataRelBase
__Unwind_GetIP
__Unwind_GetIPInfo
__Unwind_GetLanguageSpecificData
__Unwind_GetRegionStart
__Unwind_GetTextRelBase
__Unwind_RaiseException
__Unwind_Resume
__Unwind_SetGR
__Unwind_SetIP
___bzero
___error
__dyld_get_image_header
__dyld_get_image_name
__dyld_get_image_vmaddr_slide
__dyld_image_count
__exit
__tlv_atexit
_abort
_accept
_bind
_calloc
_chdir
_chmod
_chown
_chroot
_close$NOCANCEL
_closedir
_connect
_copyfile_state_alloc
_copyfile_state_free
_copyfile_state_get
_dlsym
_dup2
_execvp
_exit
_fchmod
_fchown
_fcntl
_fcopyfile
_fork
_free
_freeaddrinfo
_fstat$INODE64
_ftruncate
_gai_strerror
_getaddrinfo
_getcwd
_getenv
_getpeereid
_getpeername
_getpid
_getppid
_getpwuid_r
_getsockname
_getsockopt
_gettimeofday
_getuid
_ioctl
_kill
_lchown
_link
_listen
_lseek
_lstat$INODE64
_mach_absolute_time
_mach_timebase_info
_malloc
_memchr
_memcmp
_memcpy
_memmove
_memset
_mkdir
_mmap
_mprotect
_munmap
_nanosleep
_open
_opendir$INODE64
_pipe
_poll
_posix_memalign
_posix_spawn_file_actions_adddup2
_posix_spawn_file_actions_destroy
_posix_spawn_file_actions_init
_posix_spawnattr_destroy
_posix_spawnattr_init
_posix_spawnattr_setflags
_posix_spawnattr_setsigdefault
_posix_spawnattr_setsigmask
_posix_spawnp
_pread
_pthread_attr_destroy
_pthread_attr_init
_pthread_attr_setstacksize
_pthread_cond_broadcast
_pthread_cond_destroy
_pthread_cond_signal
_pthread_cond_timedwait
_pthread_cond_wait
_pthread_create
_pthread_detach
_pthread_get_stackaddr_np
_pthread_get_stacksize_np
_pthread_join
_pthread_key_create
_pthread_key_delete
_pthread_mutex_destroy
_pthread_mutex_init
_pthread_mutex_lock
_pthread_mutex_trylock
_pthread_mutex_unlock
_pthread_mutexattr_destroy
_pthread_mutexattr_init
_pthread_mutexattr_settype
_pthread_rwlock_destroy
_pthread_rwlock_rdlock
_pthread_rwlock_unlock
_pthread_rwlock_wrlock
_pthread_self
_pthread_setname_np
_pthread_sigmask
_pwrite
_read
_readdir_r$INODE64
_readlink
_readv
_realloc
_realpath$DARWIN_EXTSN
_recv
_recvfrom
_rename
_rmdir
_sched_yield
_send
_sendto
_setenv
_setgid
_setgroups
_setsockopt
_setuid
_shutdown
_sigaction
_sigaddset
_sigaltstack
_sigemptyset
_signal
_socket
_socketpair
_stat$INODE64
_strerror_r
_strlen
_symlink
_sysconf
_unlink
_unsetenv
_waitpid
_write
_writev
Workarounds
The warning does not appear if...
- Mode
debuginfo
is used instead (ie: step 4 replaced withCARGO_PROFILE_RELEASE_STRIP=debuginfo cargo build --release
). - Strip is switched off for proc-macros (ie: step 4 replaced with
CARGO_PROFILE_RELEASE_STRIP=symbols CARGO_PROFILE_RELEASE_BUILD_OVERRIDE=none cargo build --release
) - The
libcnb-proc-macros
dependency is changed from a local path reference to the published crate (ie: step 3 changed tocargo add libcnb-proc-macros@0.1.1
) - even though the published crate is identical to the local version?!
Meta
rustc --version --verbose
:
rustc 1.60.0-nightly (1e12aef3f 2022-02-13)
binary: rustc
commit-hash: 1e12aef3fab243407f9d71ba9956cb2a1bf105d5
commit-date: 2022-02-13
host: x86_64-apple-darwin
release: 1.60.0-nightly
LLVM version: 13.0.0