如何知道.so库文件中的什么函数以及如何将特定的二进制代码链接到您的代码中?

时间:2019-04-25 00:20:17

标签: c linux-kernel embedded-linux

Linux中有共享库。例如,libcap.so.2.24。

我知道当我写C代码时,当我写类似的东西

#include <stdio.h>

int main(){
  printf("hello world\n");
  return 0;
}

gcc编译将自动包含库中的printf函数并生成异议文件。

我的问题是

  1. 除了使用编译之外,还有其他方法可以获取printf的二进制代码吗?

  2. 当编译在目标文件中包含printf时,它是否包含整个库libcap.so.2.24或仅包含与printf函数相关的部分?我猜它仅包含与printf函数相关的部分,如果是这样,编译如何执行?

  3. 是否可以在不使用编译器的情况下手动包括库中的函数?

1 个答案:

答案 0 :(得分:0)

1) The compiler only includes the header files, not the library itself
2) During linking the library is bound to the executable.
   How this happens depends if static or dynamic linking is used
3) It is possible to bind a library at runtime with the dlopen library function
   and then use dlsym to get a function pointer.
   The dlopen man page has a very nice example