gpt4 book ai didi

c - 构建一个 .so 这也是一个可执行文件

转载 作者:IT老高 更新时间:2023-10-28 12:35:33 24 4
gpt4 key购买 nike

所以大家可能都知道glibc的/lib/libc.so.6可以像普通的可执行文件一样在shell中执行,在这种情况下它会打印其版本信息并退出。这是通过在 .so 中定义一个入口点来完成的。在某些情况下,将其用于其他项目也可能很有趣。不幸的是,您可以通过 ld 的 -e 选项设置的低级入口点有点太低级:动态加载程序不可用,因此您无法调用任何适当的库函数。出于这个原因,glibc 在这个入口点通过一个裸系统调用来实现 write() 系统调用。

我现在的问题是,任何人都可以想出一种好方法,如何从该入口点引导一个完整的动态链接器,以便可以访问其他 .so 的函数?

最佳答案

更新 2:请参阅 Andrew G Morgan 的稍微复杂一点的解决方案,该解决方案适用于任何 GLIBC(该解决方案也用于 libc.so.6 本身(自永远),这就是为什么您可以将它作为 ./libc.so.6 运行(以这种方式调用时它会打印版本信息))。

更新 1:这不再适用于较新的 GLIBC 版本:

./a.out: error while loading shared libraries: ./pie.so: cannot dynamically load position-independent executable

2009 年的原始答案:

使用 -pie 选项构建您的共享库似乎可以为您提供所需的一切:

/* pie.c */
#include <stdio.h>
int foo()
{
printf("in %s %s:%d\n", __func__, __FILE__, __LINE__);
return 42;
}
int main()
{
printf("in %s %s:%d\n", __func__, __FILE__, __LINE__);
return foo();
}


/* main.c */
#include <stdio.h>

extern int foo(void);
int main()
{
printf("in %s %s:%d\n", __func__, __FILE__, __LINE__);
return foo();
}


$ gcc -fPIC -pie -o pie.so pie.c -Wl,-E
$ gcc main.c ./pie.so


$ ./pie.so
in main pie.c:9
in foo pie.c:4
$ ./a.out
in main main.c:6
in foo pie.c:4
$

附: glibc 通过系统调用实现 write(3) 因为它没有其他地方可以调用(它已经是 最低 级别了)。这与能否执行libc.so.6无关。

关于c - 构建一个 .so 这也是一个可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1449987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com