查看当前系统的glibc版本

原文: http://my.oschina.net/acmfly/blog/77211/


有时我们经常需要查看当前系统的glibc版本,可以这样查看:

/lib/libc.so.6

有时:/lib/x86-64-linux/libc.so.6
把这个文件当命令执行一下

为什么这个库可以直接run呢? 原来在libc的代码中有一点小手脚:

Makerules:586:LDFLAGS-c.so += -e __libc_main 

csu/version.c:71:__libc_main (void) 

void 
__libc_main (void) 

  __libc_print_version (); 
  _exit (0); 

或者:

因为ldd命令也是glibc提供的,所以也能查看

ldd  --version

glibc是什么,以及与gcc的关系?
glibc是gnu发布的libc库,也即c运行库。glibc是linux 系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本 身也提供了许多其它一些必要功能服务的实现,主要的如下:
(1)string,字符串处理
(2)signal,信号处理
(3)dlfcn,管理共享库的动态加载
(4)direct,文件目录操作
(5)elf,共享库的动态加载器,也即interpreter
(6)iconv,不同字符集的编码转换
(7)inet,socket接口的实现
(8)intl,国际化,也即gettext的实现
(9)io
(10)linuxthreads
(11)locale,本地化
(12)login,虚拟终端设备的管理,及系统的安全访问
(13)malloc,动态内存的分配与管理
(14)nis
(15)stdlib,其它基本功能
gcc 是编译器,基本上 Linux 下所有的程序(包括内核)都是 gcc 编译的,libc 当然也是。
gcc 和 libc 是互相依赖的两个软件,它们合作的方式类似 Linux 系统的 "自举"。先在一个可以运行的带有老 libc 和 gcc 的系统上,用老 gcc 编译出一个新版本的 gcc + 老 libc,再用这个新 gcc 编译出一个新 gcc + 新 libc,再用这套东东编译整个新系统。


glibc版本查看

4.9. How can I find out which version of glibc I am using in the moment? {UD} If you want to find out about the version from the command line simply run the libc binary. This is probably not possible on all platforms but where it is simply locate the libc DSO and start it as an application. On Linux like /lib/libc.so.6 This will produce all the information you need. What always will work is to use the API glibc provides. Compile and run the following little program to get the version information: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <stdio.h> #include <gnu/libc-version.h> int main (void) { puts (gnu_get_libc_version ()); return 0; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This interface can also obviously be used to perform tests at runtime if this should be necessary.


Just execute:

ldd --version

which comes with glibc package


*但是,在ARM板上,不能通过 1)/lib/libc.so.6 2)ldd --version 命令查看到相应的gLibc版本,如何直接用命令查看呢?



==================总结=====================

linux下可执行文件的格式为ELF,动态链接库,静态链接库也都是ELF格式的。

上文指出,gcc在编译程序时,可以指定入口函数,例如,“-e nomain” 可以指定入口函数为nomain,其实就是修改了ELF文件头的e_entry成员。

默认情况e_entry是指向main的

但是程序第一次执行的不是main函数,做过嵌入式的应该知道,在调用main函数之前是需要做一些准备工作的,如初始化栈(没有栈就不能实现函数的调用), 调用全局对象的构造函数(C++)等 。

在链接脚本中指定第一个入口,一般我们使用gcc编译程序时,使用的时默认的连接脚本(ubuntu位于 /usr/lib/ldscripts)。

链接脚本中 ENTRY(_start) 表示程序的入口为 _start

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值