当前位置: 首页 > 面试题库 >

建立一个.so也是可执行文件

汪高岑
2023-03-14
问题内容

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

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


问题答案:

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

/* 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
$

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



 类似资料:
  • 我制作了一个包含5-6的小PyQt应用程序。py文件。现在我想把它们编译成一个主文件,这意味着它必须从一个主窗口运行。 我的py文件已成功相互连接。我已经使用pyinstaller生成了可执行文件,但问题是每个文件都是我自己构建的。将py文件转换为自己的文件。exe文件。但我想订一张单人票。exe文件,通过它所有的。可以使用py文件。 如何建立所有。将文件压缩为单个文件。exe文件?

  • 问题内容: 我爱得如此之多的两件事通常并不会引起我那么多的烦恼(除了我的孩子们)。我已经在工作中编写了一个Haskell程序,该程序使用诸如文本,xml- enumerator,attoparsec-text等库。我在Windows计算机,Ubuntu虚拟机(32位), Ubuntu桌面(再次为32位)和运行Ubuntu(64位)的EC2实例。 我们的客户端正在运行64位CentOS 5.3。我无

  • 有时我需要在我的设备上运行一个命令或脚本,但它们不可用或不存在。 除了那些已经在其上可用的命令外,我们是否可以在设备的中添加一些额外的命令? 例如,将命令添加到我的设备(我的设备的API低于19),这在我的设备上是不可用的。 我知道如何使用获取设备上可用命令的列表 但我想添加更多的自定义命令和脚本,做一些特殊的工作。 有什么办法可以做到吗?还是不可能?

  • 问题内容: 我想创建一个jar文件来执行,该文件是使用java和clojure实现的。这是我采取的步骤。 使我的Java代码调用clojure代码 我可以生成一个具有clojure核心和我的clojure代码的jar文件(ThingOne-1.0.0-SNAPSHOT- standalone.jar),并且我还可以得到一个使用jar文件中使用clojure代码的类文件(HelloJava.clas

  • 本文向大家介绍Python编译为二进制so可执行文件实例,包括了Python编译为二进制so可执行文件实例的使用技巧和注意事项,需要的朋友参考一下 通过cpython把python的文件转换为二进制文件,达到代码保护的目的 1、下载Cython-0.28.2.tar.gz python setup.py install安装 2、创建你需要打包成二进制的python文件 3、创建一个setup.py

  • 我提取了一个包含xml、java类等的可执行jar文件。实际上,这个可执行jar文件是一个具有依赖关系的库。我需要修改这个库中一个类文件中的一行代码。我已经成功地编辑了类文件,现在我想把它重新打包到可执行的jar中。如何做到这一点。