如何编译ELF二进制文件以便可以将其作为动态库加载?

阿列克谢·卡门斯基(Alexey Kamenskiy)

这是理论上的问题。我知道最好的做法可能是使用共享库。但是我遇到了这个问题,似乎无法在任何地方找到答案。

如何构造代码并以ELF格式编译C / C ++程序,以便可以加载该程序dlopen()

例如,如果一个可执行文件包含某个功能的实现,int test()而我想从程序中调用此功能(最好获取功能的结果),那么即使有可能,我将如何去做呢?

用伪代码可以将其描述如下:

ELF可执行源:

void main() {
    int i = test();
    printf("Returned: %d", i);//Prints "Returned: 5"
}

int test() {
    return 5;
}

外部程式:

// ... Somehow load executable from above
void main() {
    int i = test();
    printf("Returned: %d", i);//Must print "Returned: 5"
}
阿列克谢·卡门斯基(Alexey Kamenskiy)

根据注释和其他答案中提供的链接,此处无需链接这些程序的编译时间即可完成该工作:

test1.c

#include <stdio.h>

int a(int b)
{
  return b+1;
}

int c(int d)
{
  return a(d)+1;
}

int main()
{
  int b = a(3);
  printf("Calling a(3) gave %d \n", b);
  int d = c(3);
  printf("Calling c(3) gave %d \n", d);
}

test2.c

#include <dlfcn.h>
#include <stdio.h>


int (*a_ptr)(int b);
int (*c_ptr)(int d);

int main()
{
  void* lib=dlopen("./test1",RTLD_LAZY);
  a_ptr=dlsym(lib,"a");
  c_ptr=dlsym(lib,"c");
  int d = c_ptr(6);
  int b = a_ptr(5);
  printf("b is %d d is %d\n",b,d);
  return 0;
}

编译

$ gcc -fPIC  -pie -o test1 test1.c -Wl,-E
$ gcc -o test2 test2.c -ldl

执行结果

$ ./test1
Calling a(3) gave 4 
Calling c(3) gave 5
$ ./test2 
b is 6 d is 8

参考文献

PS:为了避免符号冲突,导入的符号和它们分配给它们的指针最好具有不同的名称。在这里查看评论

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

编译的Elf二进制文件太大

来自分类Dev

获取ELF二进制文件的已加载地址,dlopen无法正常工作

来自分类Dev

是否可以优化已编译的二进制文件?

来自分类Dev

运行二进制文件时如何加载android库?

来自分类Dev

静态链接的二进制文件如何小于动态链接的二进制文件?

来自分类Dev

在用户空间中加载不可重定位的静态ELF二进制文件

来自分类Dev

如何从类路径加载ChromeDriver二进制文件?

来自分类Dev

使用go动态创建编译的二进制文件

来自分类Dev

是否有可靠的方法知道可以在elf二进制文件中dlopen()编译哪些库?

来自分类Dev

将ELF二进制文件与AC程序链接

来自分类Dev

分析混淆的ELF二进制文件

来自分类Dev

编译的Elf二进制文件太大

来自分类Dev

用不同的C ++编译器构建的二进制文件和库如何兼容?

来自分类Dev

将动态加载的二进制文件静态链接为二进制文件

来自分类Dev

如何在Linux上的C库中使用已编译的二进制文件?

来自分类Dev

提取ELF的内容并写入二进制文件

来自分类Dev

ldd:找不到用于xl c编译二进制文件的库,但可以在AIX上找到gcc编译二进制文件的库

来自分类Dev

我如何知道我的Linux系统是否可以同时运行ELF 32位和ELF 64位二进制文件?

来自分类Dev

yum是否可以从源代码进行编译而不是安装预编译的二进制文件?

来自分类Dev

有没有一种方法可以在编译时将二进制文件作为C中的const变量加载

来自分类Dev

链接的ELF二进制文件可以包含多个.text。*节(自动)吗?

来自分类Dev

如何配置package.json以添加“自编译二进制文件”作为依赖项?

来自分类Dev

如何编写Shell脚本,以便在编译C ++程序时将二进制文件放入二进制目录

来自分类Dev

动态链接二进制文件与xcode中的库

来自分类Dev

在用户空间中加载不可重定位的静态ELF二进制文件

来自分类Dev

二进制文件如何“二进制”?

来自分类Dev

如何卸载自编译二进制文件?

来自分类Dev

如何正确地从 SecureString 发出二进制数据,以便以后可以将其转换为字符串?

来自分类Dev

如何使二进制文件作为服务启动

Related 相关文章

  1. 1

    编译的Elf二进制文件太大

  2. 2

    获取ELF二进制文件的已加载地址,dlopen无法正常工作

  3. 3

    是否可以优化已编译的二进制文件?

  4. 4

    运行二进制文件时如何加载android库?

  5. 5

    静态链接的二进制文件如何小于动态链接的二进制文件?

  6. 6

    在用户空间中加载不可重定位的静态ELF二进制文件

  7. 7

    如何从类路径加载ChromeDriver二进制文件?

  8. 8

    使用go动态创建编译的二进制文件

  9. 9

    是否有可靠的方法知道可以在elf二进制文件中dlopen()编译哪些库?

  10. 10

    将ELF二进制文件与AC程序链接

  11. 11

    分析混淆的ELF二进制文件

  12. 12

    编译的Elf二进制文件太大

  13. 13

    用不同的C ++编译器构建的二进制文件和库如何兼容?

  14. 14

    将动态加载的二进制文件静态链接为二进制文件

  15. 15

    如何在Linux上的C库中使用已编译的二进制文件?

  16. 16

    提取ELF的内容并写入二进制文件

  17. 17

    ldd:找不到用于xl c编译二进制文件的库,但可以在AIX上找到gcc编译二进制文件的库

  18. 18

    我如何知道我的Linux系统是否可以同时运行ELF 32位和ELF 64位二进制文件?

  19. 19

    yum是否可以从源代码进行编译而不是安装预编译的二进制文件?

  20. 20

    有没有一种方法可以在编译时将二进制文件作为C中的const变量加载

  21. 21

    链接的ELF二进制文件可以包含多个.text。*节(自动)吗?

  22. 22

    如何配置package.json以添加“自编译二进制文件”作为依赖项?

  23. 23

    如何编写Shell脚本,以便在编译C ++程序时将二进制文件放入二进制目录

  24. 24

    动态链接二进制文件与xcode中的库

  25. 25

    在用户空间中加载不可重定位的静态ELF二进制文件

  26. 26

    二进制文件如何“二进制”?

  27. 27

    如何卸载自编译二进制文件?

  28. 28

    如何正确地从 SecureString 发出二进制数据,以便以后可以将其转换为字符串?

  29. 29

    如何使二进制文件作为服务启动

热门标签

归档