Linux glibc函数的ELF弱导入/回退存根

Linux glibc函数的ELF弱导入/回退存根,linux,linker,glibc,elf,libc,Linux,Linker,Glibc,Elf,Libc,我试图使我们的程序在一些旧的Linux版本上运行。一个常见的阻止它的导入是\uuuu longjmp\u chk,它添加在glibc 2.11中,但在旧版本中缺失。一个“解决方案”是使用-D_FORTIFY_SOURCE=0,但这会关闭目标libc中存在的其他强化功能(\u printf_chk等)。有没有办法使\uuu longjmp\u chk成为一个“弱导入”,它将使用libc.so.6中的函数(如果存在),如果没有,则返回到本地存根 我试图使我们的程序在一些旧的Linux版本上运行 实现

我试图使我们的程序在一些旧的Linux版本上运行。一个常见的阻止它的导入是
\uuuu longjmp\u chk
,它添加在glibc 2.11中,但在旧版本中缺失。一个“解决方案”是使用
-D_FORTIFY_SOURCE=0
,但这会关闭目标libc中存在的其他强化功能(
\u printf_chk
等)。有没有办法使
\uuu longjmp\u chk
成为一个“弱导入”,它将使用
libc.so.6
中的函数(如果存在),如果没有,则返回到本地存根

我试图使我们的程序在一些旧的Linux版本上运行

实现这一点的方法只有几种,其中大部分都列举了出来

有没有办法让龙吉姆普成为“弱进口品”

没有

有没有办法让
\uuuuu longjmp\u chk
成为一个“弱导入”,使用 函数从libc.so.6(如果存在)返回,并返回到本地存根 如果没有

我会说是,使用
dlsym()
检查
\uuuu longjmp\u chk
并相应地采取行动:

/* cc -ldl */
#define _GNU_SOURCE
#include <setjmp.h>
#include <stdio.h>
#include <dlfcn.h>

void __longjmp_chk(sigjmp_buf env, int val)
{
    void (*p)(sigjmp_buf, int) = dlsym(RTLD_NEXT, "__longjmp_chk");
    if (p)
        printf("use the function from libc\n"),
        p(env, val);
    else
    {
        printf("falling back to local stub\n");
        /* local stub - whatever that may be */
    }
}

main()
{   // try it
    sigjmp_buf env;
    while (!setjmp(env)) __longjmp_chk(env, 1);
    return 0;
}
/*cc-ldl*/
#定义GNU源
#包括
#包括
#包括
void(sigjmp)longjmp(sigjmp)chk(sigjmp)buf env,int val)
{
void(*p)(sigjmp_buf,int)=dlsym(RTLD_NEXT,“u longjmp_chk”);
如果(p)
printf(“使用libc\n中的函数”),
p(环境、价值);
其他的
{
printf(“返回到本地存根\n”);
/*本地存根-不管是什么*/
}
}
main()
{//试试看
sigjmp_buf env;
而(setjmp(env)(ungjmp)chk(env,1),;
返回0;
}