linux programming tips

来源:互联网 发布:鱼摆摆 for mac 编辑:程序博客网 时间:2024/05/18 15:04

linux programming tips (by hanlray(at)gmail.com)

soname

形式一般为lib<name>.so.<version>,以symbol link的方式存在于文件系统中,version的不同反映了接口的改变,其指向的实际文件的名字通常是在soname后加上.<minor number>.<release number>。

ldd/ldconfig

一个程序/shared库一般都要依赖其他的一些库,这可以用ldd来查看,它列出了依赖的库的soname,因为实际依赖是库的接口,而soname正是反映了库的接口信息。linux使用ELF作为可执行程序和库的格式,这些依赖的库的soname保存在ELF的某个fileld里。 当一个可执行程序执行时,ld.so负责把它所依赖的shared库加载到内存并链接,它按照以下顺序寻找shared库:
  • 在LD_LIBRARY_PATH环境变量指定的目录下
  • ld.so.cache文件该shared库对应的文件
  • /usr/lib和/lib目录下

ldconfig建立或更新soname,并把其对应关系写入缓存文件ld.so.cache以加快加载速度,ld.so将主要使用这个ld.so.cache来寻找库文件,所以当拷贝shared库到一个不是/usr/lib和/lib的目录后,要运行ldconfig更新ld.so.cache以使ld.so能找到这个shared库。ldconfig能够建立和更新soname是因为ELF文件有一个field保存了其对应的soname。

ld

ld是GNU linker,是创建一个可执行程序/库最后一步使用的工具。
-shared
创建一个shared library
-L<searchdir>
ld在一个目录列表里搜索要连接的archive文件,该选项添加指定目录到缺省目录列表的前面。缺省目录列表依赖ld使用的模拟模式,gcc里有个选项-print-search-dirs可以列出当前系统的缺省目录列表。
-l<archive>
添加<archive>文件到要连接的archive文件列表。ld将在搜索archive的目录列表里搜索libarchive.so文件,如果不存在则使用libarchive.a文件
-rpath-link
当用ld创建一个静态可执行程序(non-shared, non-relocatable,不依赖其他shared library独立运行)时,其输入的shared library(直接依赖)可能又依赖另外的shared library,如果不把这种间接依赖的shared library也包括到静态可执行程序里,其结果就不能独立运行。这个option指定了搜寻这种required shared library的路径,不过ld并不只是在该option指定的路径搜索,具体ld搜索required shared library的各个位置和顺序在man里有详细的说明。

权限

file mode

+----+----+------+-+-+-+-+-+-+-+-+-+ |suid|guid|sticky|r|w|x|r|w|x|r|w|x| +----+----+------+-+-+-+-+-+-+-+-+-+ |    a group     |owner|group|other| 
用chmod u+s file、chmod g+s file来设置suid/guid,或者参照上图使用八进制表示的数字

ID

每个进程都关联着几个ID: real user ID,real group ID 标识我们是谁 effective user ID,effective group ID 用于文件存取许可权检查 saved set-user-id,saved set-group-id   通常effective ID和real ID相同,都为登录的用户ID(保存在/etc/passwd文件里);

如果设置了binary program的suid位,当执行该程序时,其进程关联的effective ID被设置为文件的owner。这在某些情况下很有用,比如:每个用户都应该可以用passwd命令来修改自己的password,但是password是被存在/etc/passwd(或shadow)文件中的,该文件显然不能被一般用户更改,这样passwd就会由于无法写入/etc/passwd文件而失败,通过设置passwd的suid位使得passwd运行时的effective ID位root,从而有权限修改/etc/passwd文件。

driver

设备以设备文件的方式提供访问,设备文件通常在/dev目录下,ls -l可以输出一些设备的相关信息:

crw———- 1 root root 4, 1 Oct 28 03:04 tty1

第一列表示设备的类型,c表示字符设备,b表示block设备

日期前的两个两列是逗号分开的两个数字,分别是major number和minor number,major number标识该设备关联的driver,由于一个driver可能用于多个设备,minor number用来作设备标识。

原创粉丝点击