Linux glibc函数的ELF弱导入/回退存根
我试图使我们的程序在一些旧的Linux版本上运行。一个常见的阻止它的导入是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版本上运行 实现
\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;
}