Linking against older symbol version in a .so file

前端 未结 11 1833
长发绾君心
长发绾君心 2020-11-27 11:25

Using gcc and ld on x86_64 linux I need to link against a newer version of a library (glibc 2.14) but the executable needs to run on a system with an older version (2.5). Si

11条回答
  •  鱼传尺愫
    2020-11-27 12:00

    I'm clearly a little late responding to this but I recently upgraded (more reasons to never upgrade) my Linux OS to XUbuntu 14.04 which came with the new libc. I compile a shared library on my machine which is used by clients who, for whatever legitimate reasons, have not upgraded their environment from 10.04. The shared library I compiled no longer loaded in their environment because gcc put a dependency on memcpy glibc v. 2.14 (or higher). Let's leave aside the insanity of this. The workaround across my whole project was three fold:

    1. added to my gcc cflags: -include glibc_version_nightmare.h
    2. created the glibc_version_nightmare.h
    3. created a perl script to verify the symbols in the .so

    glibc_version_nightmare.h:

    #if defined(__GNUC__) && defined(__LP64__)  /* only under 64 bit gcc */
    #include        /* for glibc version */
    #if defined(__GLIBC__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 14)
    /* force mempcy to be from earlier compatible system */
    __asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
    #endif
    #undef _FEATURES_H      /* so gets reloaded if necessary */
    #endif
    

    perl script fragment:

    ...
    open SYMS, "nm $flags $libname |";
    
    my $status = 0;
    
    sub complain {
    my ($symbol, $verstr) = @_;
    print STDERR "ERROR: $libname $symbol requires $verstr\n";
    $status = 1;
    }
    
    while () {
    next unless /\@\@GLIBC/;
    chomp;
    my ($symbol, $verstr) = (m/^\s+.\s(.*)\@\@GLIBC_(.*)/);
    die "unable to parse version from $libname in $_\n"
        unless $verstr;
    my @ver = split(/\./, $verstr);
    complain $symbol, $verstr
        if ($ver[0] > 2 || $ver[1] > 10);
    }
    close SYMS;
    
    exit $status;
    

提交回复
热议问题