【问题标题】:Know if an embeded system is using glibc or bionic?知道嵌入式系统是否使用 glibc 与仿生?
【发布时间】:2012-08-21 07:20:25
【问题描述】:

例如,android 使用的是仿生而不是 glibc,但如何确定它是真的使用仿生 http://en.wikipedia.org/wiki/Bionic_(software),而不是 glibc?

我可以在 /proc 文件系统中找到这些信息吗,或者是否有任何命令可以告诉当前系统上使用了仿生?

顺便问一下,嵌入式系统上可能有多个 c lib 吗?

【问题讨论】:

  • 如果每个应用程序都与它的 libc 静态链接,那么不同的应用程序可能正在使用不同的 libc。
  • 如何将应用程序静态链接到它的c库?
  • 对于 gcc,链接时使用 -static 选项。使用实用程序file 告诉您可执行文件是静态链接还是动态链接。我使用strings 列出动态链接的可执行文件使用的库和入口点。
  • strace 只会显示对库文件执行了打开/mmap/关闭文件操作。你必须在目标板上运行命令。所以strings 不是错字。

标签: android embedded-linux glibc bionic


【解决方案1】:

如果您的代码需要根据是否与 Bionic 或 Glibc 链接而有所不同,这可以而且必须在编译时确定。 Bionic 和 Glibc 无论如何都不是二进制兼容的,因此您需要在编译时提交一组头文件。

#if __BIONIC__
/* Bionic-specific code */    
#elif __GLIBC__
/* Glibc-specific code */
#else
#error "This C library is not supported"
#endif

您不会在 /proc 中找到任何信息,因为 /proc 包含有关内核的信息,而不是有关 C 库的信息。

理论上,可以在一个系统上放置任意数量的 C 库。然而,这在嵌入式系统上是非常不寻常的,因为这些系统通常会尽量减少代码大小。我期望多个 C 库的唯一系统是在嵌入式开发人员的机器上,如果该开发人员碰巧不是交叉编译(这首先是罕见的)。而且Bionic只用在Android上,Android上也只有Bionic,所以所有Android系统都有Bionic,其他系统没有Bionic。非 Android Linux 系统有一些其他库,要么是 Glibc,要么是(在嵌入式系统上)其他一些 libc,例如 uClibc 或 Dietlibc。

【讨论】:

  • 那么如何知道系统使用的是glibc还是uClibc?
  • @hugemeow #ifdef __UCLIBC__。大多数图书馆都有这样的东西。
  • 那么我应该阅读嵌入式系统中可能包含的头文件以了解它使用哪个clib吗?
  • 但是您能否在非 Android Linux 系统上使用 Bionic?
  • @vivekian2 是的,这是可能的。我不知道有人这样做。
猜你喜欢
  • 2022-11-28
  • 2012-12-11
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2011-05-12
相关资源
最近更新 更多