soname

写成这样是个大bug:

Wl,-soname=../../lib/libworld.so

gcc -shared -o libworld.so world.o -Wl,-soname=../../lib/libworld.so
gcc -shared -o libhello.so hello.o -lworld -L .

gcc test.c  -L ./ -lhello -Wl,-rpath-link .

    #include<stdio.h>
    void world(void)
    {
        printf("world.\n");
    }
 

    #include <stdio.h>

    void world(void);

    void hello(void)
    {
        printf("hello\n");
        world();
    }

void main(void)
{
    hello();
}

realname:

    实际等同于库文件的filename,是在库文件生成时就被指定的,如:gcc -shared -o $(realname) dependence flags
    realname的一般格式为 lib$(name).so.$(major).$(minor).$(revision),$(name)是动态库的名字,$(major).$(minor).$(revision)分别表示主版本号,子版本号和修正版本号

soname:

    在库文件生成时被指定,如:gcc -shared -o $(realname) dependence flags -Wl,-soname,$(soname)
    其一般格式为lib$(name).so.$(major).$(minor),soname会被写入库文件中
    可以使用readelf -d $(realname)查看库文件的soname
    不同realname的库文件可以有相同的soname,有利于库文件的升级和兼容,例如当版本从1.0.0升级到1.0.1,库文件的接口没有变化(或者接口增加,但原有接口不变)的情况下,可以指定相同的soname,这样使用1.0.0生成的程序仍然可以运行。
    soname在链接和加载库文件时使用,当时使用-l$(name)链接库文件时,链接器会读取lib$(name).so文件中的soname值,并将其记录在生成的程序中,当运行程序时,会从相应的目录加载名为$(soname)的文件,所以,在运行程序之前,$(soname)的库文件必须已生成,
    可以采用软连接的方式生成该文件,如:ln -s $(realname) $(soname)
    也可以使用ldconfig命令自动生成,如 ldconfig -n $(dir) 会生成$(dir)目录下所有库文件对应的$(soname)文件

linkname:

    在链接时使用,一般格式为lib$(name).so,通常是$(realname)文件或者$(soname)文件的软链接
    当使用-l$(name)选项时,链接器会从相应目录链接lib$(name).so的文件,如果该文件不存在,则会链接lib$(name).a文件,如果该文件也不存在,会发生链接错误
    如果链接的是lib$(name).a文件,在运行程序时也就没$(realname)文件和$(soname)文件什么事了

原文链接:https://blog.csdn.net/mst9009/article/details/80839252

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值