【问题标题】:Load symbols from other binaries从其他二进制文件加载符号
【发布时间】:2011-11-10 03:21:07
【问题描述】:

我对 C 和 C++ 编程相对缺乏经验,但是如果可以从共享库中加载和调用符号(据我所知,它们的编译和链接很像二进制文件),是否也可以从另一个 [运行时可执行] 二进制文件?

我对在 Linux 上使用 GCC 执行此操作特别感兴趣。

【问题讨论】:

    标签: c dynamic-loading


    【解决方案1】:

    如果您在 Windows 上编程

    1. LoadLibrary 将共享库加载到当前进程中
    2. GetProcAddress获取你要调用的函数地址

    在像 Oses 这样的 unix 上。 dlopendlsym

    之类的东西

    An example of dlsym 查找 6.6。文件 demo_dynamic.c

    【讨论】:

    • 限制:二进制文件必须编译为可动态链接的共享对象。动态链接器需要仅在库链接期间放置的库名称 sonames 和版本,而不是独立的可执行链接。
    • "如果可以从共享库中加载和调用符号(据我所知,它们的编译和链接很像二进制文件),是否也可以在运行时从另一个二进制文件中加载符号?"
    • 恐怕 moshbear 对我的问题有准确的解释。
    • 但是,另一方面,引用 MSDN 的“LoadLibrary 也可以用于加载其他可执行模块。例如,该函数可以指定一个 .exe 文件来获取可以使用的句柄在 FindResource 或 LoadResource 中。” ...所以我们已经完成了一半,我想我只需要验证 linux 的技术。
    【解决方案2】:

    理论上是的,您应该能够从二进制文件中提取对象并链接它(静态或动态),但它需要您检查二进制结构。这很容易做到,因为现代 Linux 系统都使用 ELF 二进制文件,这是有据可查的。建议你从wikipedia article开始,从那里走。

    【讨论】:

      猜你喜欢
      • 2015-01-25
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 2019-11-21
      • 2014-11-11
      相关资源
      最近更新 更多