Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rust programs require recent glibc due to __cxa_thread_atexit_impl #36826

Closed
Timmmm opened this issue Sep 29, 2016 · 6 comments
Closed

Rust programs require recent glibc due to __cxa_thread_atexit_impl #36826

Timmmm opened this issue Sep 29, 2016 · 6 comments
Labels
A-linkage Area: linking into static, shared libraries and binaries C-bug Category: This is a bug. O-linux Operating system: Linux

Comments

@Timmmm
Copy link
Contributor

Timmmm commented Sep 29, 2016

I think this is a bug but I'm not 100% sure. Anyway, I have cross-compiled a simple Rust program with the toolchain stable-x86_64-pc-windows-gnu and the target armv7-unknown-linux-gnueabihf, using this GCC cross compiler from Linaro.

However when I run it on a reasonably old system I get:

./foo: /lib/libc.so.6: version `GLIBC_2.18' not found (required by ./foo)

objdump -T foo reveals that this is the only symbol that needs glibc 2.18. The others all need 2.4.

00000000  w   DF *UND*  00000000  GLIBC_2.18  __cxa_thread_atexit_impl

The symbol is weakly defined, however the dependency on glibc 2.18 is still strong:

$ readelf -V foo
...
Version needs section '.gnu.version_r' contains 5 entries:
 Addr: 0x0000000000001e4c  Offset: 0x001e4c  Link: 6 (.dynstr)
  000000: Version: 1  File: ld-linux-armhf.so.3  Cnt: 1
  0x0010:   Name: GLIBC_2.4  Flags: none  Version: 9
  0x0020: Version: 1  File: librt.so.1  Cnt: 1
  0x0030:   Name: GLIBC_2.4  Flags: none  Version: 5
  0x0040: Version: 1  File: libgcc_s.so.1  Cnt: 4
  0x0050:   Name: GCC_4.3.0  Flags: none  Version: 10
  0x0060:   Name: GCC_3.0  Flags: none  Version: 7
  0x0070:   Name: GCC_3.5  Flags: none  Version: 6
  0x0080:   Name: GCC_3.3.1  Flags: none  Version: 4
  0x0090: Version: 1  File: libc.so.6  Cnt: 2
  0x00a0:   Name: GLIBC_2.18  Flags: none  Version: 8
  0x00b0:   Name: GLIBC_2.4  Flags: none  Version: 3
  0x00c0: Version: 1  File: libpthread.so.0  Cnt: 1
  0x00d0:   Name: GLIBC_2.4  Flags: none  Version: 2

I found a site where they should how to hex edit the binary so it shows this:

 0x00a0:   Name: GLIBC_2.18  Flags: WEAK   Version: 8

However it still doesn't work:

./foo: /lib/libc.so.6: weak version `GLIBC_2.18' not found (required by ./foo)
./foo: relocation error: ./foo: symbol __cxa_thread_atexit_impl, version GLIBC_2.18 not defined in file libc.so.6 with link time reference

Now, I wouldn't have thought this was a bug, except that the code that uses __cxa_thread_atexit_impl seems to have been written intending it to be a weak reference so it seems like a bug.

I'm not an expert on glibc's insanity though so I could be wrong. I posted a SO question but no answers yet. :-/

@nagisa
Copy link
Member

nagisa commented Sep 29, 2016

Seems like an unintended behaviour indeed, though I feel like solving it is not something we can easily do! Probably the best way to crosscompile a rustc in a way which does not introduce a dependency on GLIBC_2.18 is to crosscompile from a system with glibc older than 2.18 as well.

http://stackoverflow.com/questions/6136423/how-can-i-avoid-dependency-on-glibc-x-y-when-using-weak-symbols#6139218 describes the same problem. I wonder what is meant by weak alias in the answer.

cc @alexcrichton

EDIT: less relevant: https://web.archive.org/web/20160107032111/http://www.trevorpounds.com/blog/?p=103 and http://stackoverflow.com/questions/2856438/how-can-i-link-to-a-specific-glibc-version.

@Timmmm
Copy link
Contributor Author

Timmmm commented Sep 29, 2016

This page describes weak aliases. I don't think the alias is important - probably it is the fact that he provided a default implementation, so GCC doesn't try very hard to find another. I wonder if the code were reworked somewhat like this it would work:

#[cfg(target_os = "linux")]
unsafe fn register_dtor(t: *mut u8, dtor: unsafe extern fn(*mut u8)) {

    extern {
        #[linkage = "extern_weak"]
        static __dso_handle: *mut u8;
    }

    __cxa_thread_atexit_impl(dtor, t, &__dso_handle as *const _ as *mut _);
}

#[cfg(target_os = "linux")]
#[linkage = "weak"]
extern "C" unsafe fn __cxa_thread_atexit_impl(dtor: unsafe extern fn(*mut u8),
                                  t: *mut u8,
                                  dso_handle: *mut u8) -> libc::c_int {

    use mem;
    use libc;
    use sys_common::thread_local as os;

    // The fallback implementation uses a vanilla OS-based TLS key to track
    // the list of destructors that need to be run for this thread. The key
    // then has its own destructor which runs all the other destructors.
    //
    // The destructor for DTORS is a little special in that it has a `while`
    // loop to continuously drain the list of registered destructors. It
    // *should* be the case that this loop always terminates because we
    // provide the guarantee that a TLS key cannot be set after it is
    // flagged for destruction.
    static DTORS: os::StaticKey = os::StaticKey::new(Some(run_dtors));
    type List = Vec<(*mut u8, unsafe extern fn(*mut u8))>;
    if DTORS.get().is_null() {
        let v: Box<List> = box Vec::new();
        DTORS.set(Box::into_raw(v) as *mut u8);
    }
    let list: &mut List = &mut *(DTORS.get() as *mut List);
    list.push((t, dtor));

    unsafe extern fn run_dtors(mut ptr: *mut u8) {
        while !ptr.is_null() {
            let list: Box<List> = Box::from_raw(ptr as *mut List);
            for &(ptr, dtor) in list.iter() {
                dtor(ptr);
            }
            ptr = DTORS.get();
            DTORS.set(ptr::null_mut());
        }
    }
}

I am a Rust beginner thought so kind of out of my depth with this code!

@alexcrichton
Copy link
Member

I've always personally been under the impression that if you want compatibility with glibc version X+ then you must compile against version X. I think I've seen problems like where you compile against glibc Y and because you called memcpy you now can't work with glibc X where X < Y.

I'm not currently sure whether having a weak definition of __cxa_thread_atexit_impl would work or not, but in any case this is at least expected behavior to me in the sense that it should be fixed by compiling against an older glibc version.

@Timmmm
Copy link
Contributor Author

Timmmm commented Sep 30, 2016

Sorry I'm a bit confused - did you change your mind since writing "we run on lots older linuxes, as well as cross compiling from a newer linux to an older linux, so we also have a fallback implementation to use as well."? That suggests to me that you thought this should work at one time.

Anyway, compiling against an old version of glibc is a massive pain. The oldest version of GCC that Linaro provide still uses glibc 2.19.

I'm willing to try the above code but to be honest I have no idea how to cross-compile a new version of libstd.so from Windows. If you can give me a hint of the steps I will give it a go and see if it works!

@alexcrichton
Copy link
Member

So that comment isn't really related to this scenario, compiling against a newer linux and then running on an older one. Once you've compiled for a particular glibc version you can never take that binary backwards (in theory).

Yeah it's true though that if you're compiling from Windows to Linux you'll basically just have to figure out how to get your hands on an older glibc. If you're on Linux you can typically use docker to achieve this easily, but that may not be too applicable to you unfortunately :(

@steveklabnik steveklabnik added the A-linkage Area: linking into static, shared libraries and binaries label Oct 7, 2016
@Mark-Simulacrum Mark-Simulacrum added the C-bug Category: This is a bug. label Jul 26, 2017
@sanxiyn sanxiyn added the O-linux Operating system: Linux label Jan 16, 2019
kodiakhq bot pushed a commit to vercel/next.js that referenced this issue Feb 18, 2022
Fix `GLIBC` compatible issues:

- Fixes #33854
- All `CentOS 7` related issues in #30468

Should also fix:

- #33530

Refactored jobs tested in https://github.com/Brooooooklyn/next.js/runs/5233199833?check_suite_focus=true

### `objdump` in `[email protected]`

<details>
  <summary>Symbols</summary>
node_modules/@next/swc-linux-x64-gnu/next-swc.linux-x64-gnu.node:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000000000      D  *UND*	0000000000000000              napi_resolve_deferred
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.4 __xpg_strerror_r
0000000000000000      D  *UND*	0000000000000000              napi_typeof
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_setspecific
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.2 pthread_cond_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.4   __stack_chk_fail
0000000000000000      DF *UND*	0000000000000000  GCC_3.0     _Unwind_GetRegionStart
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memset
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fputs
0000000000000000      DF *UND*	0000000000000000  GCC_3.3     _Unwind_FindEnclosingFunction
0000000000000000      DF *UND*	0000000000000000  GCC_3.0     _Unwind_GetTextRelBase
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 setgroups
0000000000000000      DO *UND*	0000000000000000  GLIBC_2.2.5 stdout
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 madvise
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3   realpath
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawn_file_actions_adddup2
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pow
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sigaltstack
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_self
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 trunc
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.4 __strncat_chk
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_attr_setstacksize
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sigemptyset
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_detach
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 __fxstat64
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.2 pthread_cond_broadcast
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strtol
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 __cxa_atexit
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 round
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sigaddset
0000000000000000      DF *UND*	0000000000000000  GCC_3.0     _Unwind_RaiseException
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.15  posix_spawnp
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memcmp
0000000000000000      D  *UND*	0000000000000000              napi_queue_async_work
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_rwlock_wrlock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 floor
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.4 __vsnprintf_chk
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_key_create
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 close
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutexattr_destroy
0000000000000000      D  *UND*	0000000000000000              napi_throw_error
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3   __ctype_toupper_loc
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 poll
0000000000000000      D  *UND*	0000000000000000              napi_reject_deferred
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 signal
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 getcwd
0000000000000000  w   D  *UND*	0000000000000000              __gmon_start__
0000000000000000      D  *UND*	0000000000000000              napi_get_value_string_utf8
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnattr_setsigmask
0000000000000000      D  *UND*	0000000000000000              napi_create_promise
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 dup2
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_attr_getguardsize
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 __xstat64
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_attr_getstack
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strerror
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 getenv
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 read
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memrchr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_rwlock_rdlock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fmod
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fork
0000000000000000      DF *UND*	0000000000000000  GCC_3.3     _Unwind_Backtrace
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawn_file_actions_destroy
0000000000000000      D  *UND*	0000000000000000              napi_get_value_bool
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 setuid
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.9   pipe2
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.4 __snprintf_chk
0000000000000000      DF *UND*	0000000000000000  GCC_3.0     _Unwind_SetIP
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 dlsym
0000000000000000      D  *UND*	0000000000000000              napi_create_error
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutex_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 access
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 ioctl
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strncpy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 localtime_r
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memmove
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 syscall
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 readlink
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fma
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 getuid
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sin
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutex_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strlen
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnattr_setflags
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawn_file_actions_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strstr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_key_delete
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_getattr_np
0000000000000000      D  *UND*	0000000000000000              napi_get_buffer_info
0000000000000000      DO *UND*	0000000000000000  GLIBC_2.2.5 stderr
0000000000000000      DF *UND*	0000000000000000  GCC_3.0     _Unwind_Resume
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnattr_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.2 pthread_cond_signal
0000000000000000  w   DF *UND*	0000000000000000  GLIBC_2.18  __cxa_thread_atexit_impl
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutex_trylock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 writev
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 clock_gettime
0000000000000000      D  *UND*	0000000000000000              napi_delete_async_work
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_getspecific
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_condattr_destroy
0000000000000000      DF *UND*	0000000000000000  GCC_3.0     _Unwind_DeleteException
0000000000000000      D  *UND*	0000000000000000              napi_create_function
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 prctl
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 waitpid
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 lseek64
0000000000000000      D  *UND*	0000000000000000              napi_set_named_property
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 cos
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnattr_init
0000000000000000      DF *UND*	0000000000000000  GCC_3.0     _Unwind_GetIP
0000000000000000  w   D  *UND*	0000000000000000              _ITM_registerTMCloneTable
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 execvp
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 ceil
0000000000000000      DO *UND*	0000000000000000  GLIBC_2.2.5 environ
0000000000000000      D  *UND*	0000000000000000              napi_get_cb_info
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutexattr_init
0000000000000000      D  *UND*	0000000000000000              napi_coerce_to_object
0000000000000000      D  *UND*	0000000000000000              napi_throw
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 mprotect
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.14  memcpy
0000000000000000  w   D  *UND*	0000000000000000              _ITM_deregisterTMCloneTable
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_attr_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fcntl
0000000000000000      DF *UND*	0000000000000000  GCC_4.2.0   _Unwind_GetIPInfo
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 free
0000000000000000  w   DF *UND*	0000000000000000  GLIBC_2.2.5 __cxa_finalize
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutex_unlock
0000000000000000      DF *UND*	0000000000000000  GCC_3.0     _Unwind_GetDataRelBase
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutex_lock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 dl_iterate_phdr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.4 sched_getaffinity
0000000000000000      DF *UND*	0000000000000000  GCC_3.0     _Unwind_SetGR
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.2 pthread_cond_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memchr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 open
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3   __tls_get_addr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 log10
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.2 pthread_cond_wait
0000000000000000      D  *UND*	0000000000000000              napi_create_async_work
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sysconf
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 munmap
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 log2
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.3 pthread_condattr_setclock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_attr_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 bcmp
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_create
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnattr_setsigdefault
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 abort
0000000000000000      D  *UND*	0000000000000000              napi_create_string_utf8
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_condattr_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_sigmask
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutexattr_settype
0000000000000000      DO *UND*	0000000000000000  GLIBC_2.2.5 __environ
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 mmap
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 __errno_location
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 _exit
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 write
0000000000000000      DF *UND*	0000000000000000  GCC_3.3     _Unwind_GetCFA
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 getrusage
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_rwlock_unlock
0000000000000000      DF *UND*	0000000000000000  GCC_3.0     _Unwind_GetLanguageSpecificData
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sched_yield
0000000000000000      D  *UND*	0000000000000000              napi_create_object
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 setgid
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 chdir
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 open64
000000000039bbd0 g    DF .text	000000000000032a  Base        napi_register_module_v1
0000000001ddd750 g    DF .text	00000000000002e5  Base        rust_eh_personality
</details>

There is `0000000000000000  w   DF *UND*	0000000000000000  GLIBC_2.18  __cxa_thread_atexit_impl` introduced by rust-lang/rust#36826

### `objdump` in current branch

<details>
  <summary>Symbols</summary>
  next-swc.linux-x64-gnu.node:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000000000  w   D  *UND*	0000000000000000  Base        __gmon_start__
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memcpy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 trunc
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3   __tls_get_addr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 bcmp
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memmove
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memset
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutex_lock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutex_trylock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memcmp
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutex_unlock
0000000000000000      D  *UND*	0000000000000000  Base        napi_create_function
0000000000000000      D  *UND*	0000000000000000  Base        napi_set_named_property
0000000000000000      D  *UND*	0000000000000000  Base        napi_create_string_utf8
0000000000000000      D  *UND*	0000000000000000  Base        napi_coerce_to_object
0000000000000000      D  *UND*	0000000000000000  Base        napi_get_cb_info
0000000000000000      D  *UND*	0000000000000000  Base        napi_create_error
0000000000000000      D  *UND*	0000000000000000  Base        napi_throw
0000000000000000      D  *UND*	0000000000000000  Base        napi_throw_error
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fma
0000000000000000      D  *UND*	0000000000000000  Base        napi_create_object
0000000000000000      D  *UND*	0000000000000000  Base        napi_create_promise
0000000000000000      D  *UND*	0000000000000000  Base        napi_create_async_work
0000000000000000      D  *UND*	0000000000000000  Base        napi_queue_async_work
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strlen
0000000000000000      D  *UND*	0000000000000000  Base        napi_get_value_string_utf8
0000000000000000      D  *UND*	0000000000000000  Base        napi_get_value_bool
0000000000000000      D  *UND*	0000000000000000  Base        napi_typeof
0000000000000000      D  *UND*	0000000000000000  Base        napi_get_buffer_info
0000000000000000      D  *UND*	0000000000000000  Base        napi_reject_deferred
0000000000000000      D  *UND*	0000000000000000  Base        napi_resolve_deferred
0000000000000000      D  *UND*	0000000000000000  Base        napi_delete_async_work
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 close
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pow
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 round
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 localtime_r
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 log10
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 cos
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sin
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fmod
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 ceil
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.2 pthread_cond_wait
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.4 sched_getaffinity
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sysconf
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.4 __xpg_strerror_r
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 syscall
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 __errno_location
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 read
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 open64
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 poll
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 log2
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 munmap
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 mmap
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 dl_iterate_phdr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 clock_gettime
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 getrusage
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 snprintf
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 access
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 vsnprintf
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 madvise
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strerror
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 mprotect
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_setspecific
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memchr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3   realpath
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 getenv
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_key_create
0000000000000000      DO *UND*	0000000000000000  GLIBC_2.2.5 stderr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fputs
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strncat
0000000000000000      DO *UND*	0000000000000000  GLIBC_2.2.5 environ
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3   __ctype_toupper_loc
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strncpy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strstr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 strtol
0000000000000000      DO *UND*	0000000000000000  GLIBC_2.2.5 stdout
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnattr_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawn_file_actions_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutexattr_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_rwlock_unlock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutex_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sched_yield
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 getcwd
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_rwlock_rdlock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_rwlock_wrlock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 getuid
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 write
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fcntl
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 lseek64
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 writev
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 memrchr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 ioctl
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 waitpid
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.2 pthread_cond_broadcast
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_condattr_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.3 pthread_condattr_setclock
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.2 pthread_cond_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_condattr_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.2 pthread_cond_signal
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sigaltstack
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 abort
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 signal
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_self
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_getattr_np
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_attr_getstack
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_attr_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 malloc
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 free
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.3.2 pthread_cond_destroy
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutexattr_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutexattr_settype
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_mutex_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_getspecific
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_key_delete
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 dlsym
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 readlink
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 chdir
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.9   pipe2
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_attr_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_attr_setstacksize
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_create
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 prctl
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_detach
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_attr_getguardsize
0000000000000000  w   D  *UND*	0000000000000000  Base        __cxa_thread_atexit_impl
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnattr_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawn_file_actions_init
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawn_file_actions_adddup2
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sigemptyset
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnattr_setsigmask
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 sigaddset
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnattr_setsigdefault
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnattr_setflags
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fork
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 posix_spawnp
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 _exit
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 dup2
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 setgroups
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 setgid
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 setuid
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 pthread_sigmask
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 execvp
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fprintf
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fflush
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 dladdr
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 fwrite
0000000000000000      DF *UND*	0000000000000000  GLIBC_2.2.5 __cxa_atexit
0000000002830dc0 g    DF .text	00000000000002e5  Base        rust_eh_personality
0000000000e10380 g    DF .text	000000000000032a  Base        napi_register_module_v1
</details>

No more `GLIBC_2.18` symbols.

Confirm it works on `centos:7` docker image.
@Enselic
Copy link
Member

Enselic commented Nov 18, 2023

Triage: The requirement to link against the oldest version of glibc you want to run on is not something that the Rust project can do anything about I'm afraid (I think that would have to be supported by glibc itself), so let's close this as works as designed/won't fix.

@Enselic Enselic closed this as not planned Won't fix, can't repro, duplicate, stale Nov 18, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-linkage Area: linking into static, shared libraries and binaries C-bug Category: This is a bug. O-linux Operating system: Linux
Projects
None yet
Development

No branches or pull requests

7 participants