so库播放地址不能为空啥潜意识巨人音乐播放

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
论坛徽章:0
提示: 作者被禁止或删除 内容自动屏蔽
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
丰衣足食, 积分 981, 距离下一级还需 19 积分
论坛徽章:0
原帖由 xiaomiao 于
16:03 发表
在Linux AS 4.0 for X86_64下用file命令看*.so动态库文件的格式
libnss_ldap-2.3.4.so:& &&&ELF 64-bit LSB shared object, AMD x86-64, version 1 (SYSV), stripped
libnss_nis-2.3.4.so:& && &ELF 64-bit ...
表示符号表是否被清除.
论坛徽章:1
小富即安, 积分 4912, 距离下一级还需 88 积分
论坛徽章:0
需要提一下的是,这里strip掉的符号表不是连接器用于链接的符号表(.dynsym节),而是提供给人看的那张SYMBOL TABLE(即你用nm命令可以看到的那些符号信息)
顺便再提一下,如果你strip的是.o文件,那一切都完了,该文件就再不能被链接生成目标文件了
[ 本帖最后由 zx_wing 于
16:51 编辑 ]
家境小康, 积分 1699, 距离下一级还需 301 积分
论坛徽章:0
原帖由 zx_wing 于
16:38 发表
需要提一下的是,这里strip掉的符号表不是连接器用于链接的符号表(.dynsym节),而是提供给人看的那张SYMBOL TABLE(即你用nm命令可以看到的那些符号信息)
顺便再提一下,如果你strip的是.o文件,那一切都完 ...
最后一句话有问题吧。
strip *.o以后,不能再cc *.o ? 是这个意思么?
丰衣足食, 积分 981, 距离下一级还需 19 积分
论坛徽章:0
原帖由 ivhb 于
16:55 发表
最后一句话有问题吧。
strip *.o以后,不能再cc *.o ? 是这个意思么?
如果不strip, 所有的函数,变量都都可以通过符号名访问到. 而strip之后, 符号表被删除了,只能通过地址访问.
而在连接的时候,是通过符号名查找的.所以连接stripped的库/目标文件会失败.
小富即安, 积分 4912, 距离下一级还需 88 积分
论坛徽章:0
原帖由 web_surf 于
17:11 发表
如果不strip, 所有的函数,变量都都可以通过符号名访问到. 而strip之后, 符号表被删除了,只能通过地址访问.
而在连接的时候,是通过符号名查找的.所以连接stripped的库/目标文件会失败.
对于.so库,strip过后仍然可以被链接。因为用于链接的.dynsym节仍在。
对于.o文件,strip过后确实不能在连接编译成目标文件。因为.o文件不是目标文件,和.so文件不同,它并没有.dynsym节用于导出符号给外部程序。所以我认为编译器用于链接成目标文件的符号表就是我们objdump出来看到的那张,即:
Idx Name& && && & Size& && &VMA& && & LMA& && & File off&&Algn
&&0 .text& && && &**2
&&&&&&&&&&&&&&&&&&CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
&&1 .data& && && &**2
&&&&&&&&&&&&&&&&&&CONTENTS, ALLOC, LOAD, DATA
&&2 .bss& && && & **2
&&&&&&&&&&&&&&&&&&ALLOC& &
&&3 .rodata& && & **0
&&&&&&&&&&&&&&&&&&CONTENTS, ALLOC, LOAD, READONLY, DATA
&&4 .note.GNU-stack 00008f&&2**0
&&&&&&&&&&&&&&&&&&CONTENTS, READONLY
&&5 .comment& && &0000002e&&00008f&&2**0
&&&&&&&&&&&&&&&&&&CONTENTS, READONLY
SYMBOL TABLE:
l& & df *ABS*&& t.c
l& & d&&.text&&
l& & d&&.data&&
l& & d&&.bss& &
l& & d&&.rodata& &
l& & d&&.note.GNU-stack& &
l& & d&&.comment& &
g& &&&F .text&& ppp
& && && &*UND*&& printf
g& &&&F .text&&0000003a main
而strip .o文件,去掉的也正是这张表。所以strip后的.o文件不能再链接成目标文件。
(关于.o文件是我自己的猜想,我个人没找到证据证明,如果有了解的朋友请指正)
丰衣足食, 积分 981, 距离下一级还需 19 积分
论坛徽章:0
原帖由 zx_wing 于
17:31 发表
对于.so库,strip过后仍然可以被链接。因为用于链接的.dynsym节仍在。
对于.o文件,strip过后确实不能在连接编译成目标文件。因为.o文件不是目标文件,和.so文件不同,它并没有.dynsym节用于导出符号 ...
试了一下, so的符号表确实还存在, 但是.a和.o的已经被删除掉了(strip 之后用 objdump -d看过)
小富即安, 积分 4912, 距离下一级还需 88 积分
论坛徽章:0
原帖由 web_surf 于
17:36 发表
试了一下, so的符号表确实还存在, 但是.a和.o的已经被删除掉了(strip 之后用 objdump -d看过)
对于这个问题,我有一些猜想。
我们知道objdump或nm之类的命令可以把符号表转换成可读的文本格式,但在转换的时候总需要一张表给出函数名和地址的对应关系吧(这里暂时定为符号表A)。编译时用于链接生成目标文件的那张符号表很自然的可以用作符号表A,只要把其中的static符号去掉就可以了。
对于.so文件,我认为对于它来说符号表A仍然存在,但由于它需要被外部程序动态链接,加载的时候需要把符号表加载到内存中去,所以又另外多出了一个.dynsym节(其内容和符号表A一样),它和.text节、.data节、.rodata节一样是要被load到内存中去的。而符号表A则只存在于文件中,不会被加载入内存。
strip去掉的就是符号表A。它的作用,对于.o文件用于链接生成目标文件,对于.a文件功能类似。对于.so文件,符号表A的功能仅仅是在nm或objdump的时候转换成可读的文本,除此之外别无它用。
以上是我个人的一点看法。
家境小康, 积分 1699, 距离下一级还需 301 积分
论坛徽章:0
原帖由 web_surf 于
17:11 发表
如果不strip, 所有的函数,变量都都可以通过符号名访问到. 而strip之后, 符号表被删除了,只能通过地址访问.
而在连接的时候,是通过符号名查找的.所以连接stripped的库/目标文件会失败.
我不知道是不是就是这个意思
Script started on Wed Sep 19 19:30:19 2007
/export/home/ivhb/tmp/o&ls -l
-rw-r--r--& &1 ivhb& &&&other& && && &92 Sep 19 16:53 a.c
-rw-r--r--& &1 ivhb& &&&other& && && &11 Sep 19 16:53 b.c
-rw-r--r--& &1 ivhb& &&&other& && && & 0 Sep 19 19:30 typescript
/export/home/ivhb/tmp/o&cat a.c
#include &stdio.h&
main(void)
&&printf(&x %d\n&, x);
&&return (0);
/export/home/ivhb/tmp/o&cat b.c
int x = 9;
/export/home/ivhb/tmp/o&cc -c a.c b.c
/export/home/ivhb/tmp/o&ls -l *.o
-rw-r--r--& &1 ivhb& &&&other& && & 1844 Sep 19 19:30 a.o
-rw-r--r--& &1 ivhb& &&&other& && & 1284 Sep 19 19:30 b.o
/export/home/ivhb/tmp/o&strip *.o
/export/home/ivhb/tmp/o&ls -l *.o
-rw-r--r--& &1 ivhb& &&&other& && & 1416 Sep 19 19:30 a.o
-rw-r--r--& &1 ivhb& &&&other& && &&&856 Sep 19 19:30 b.o
/export/home/ivhb/tmp/o&ar rv libx.a b.o
ar: creating libx.a
ar: writing libx.a
/export/home/ivhb/tmp/o&cc -o a.out a.o -L. -lx
/export/home/ivhb/tmp/o&ls -l a.out
-rwxr-xr-x& &1 ivhb& &&&other& && & 5464 Sep 19 19:31 a.out
/export/home/ivhb/tmp/o&./a.out
/export/home/ivhb/tmp/o&
script done on Wed Sep 19 19:32:22 2007博客访问: 1173438
博文数量: 36
博客积分: 690
博客等级: 中士
技术积分: 3200
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
& &linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲动态库方面知识。& && &基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库,使用ldd命令查看&# ldd /bin/lslinux-vdso.so.1 =>
(0x00007fff597ff000)libselinux.so.1 => /lib64/libselinux.so.1 (0xe00000)librt.so.1 => /lib64/librt.so.1 (0x0000)libcap.so.2 => /lib64/libcap.so.2 (0xa00000)libacl.so.1 => /lib64/libacl.so.1 (0x0000)libc.so.6 => /lib64/libc.so.6 (0x0000)libdl.so.2 => /lib64/libdl.so.2 (0x0000)/lib64/ld-linux-x86-64.so.2 (0xe00000)libpthread.so.0 => /lib64/libpthread.so.0 (0xa00000)libattr.so.1 => /lib64/libattr.so.1 (0x0000)& &这么多so,是的。使用ldd显示的so,并不是所有so都是需要使用的,下面举个例子main.cpp#include <stdio.h>#include <iostream>#include <string>using namespace std;int main (){&&&cout << "test" << endl;&&&return 0;}& &使用缺省参数编译结果# g++ -o demo main.cpp# ldd demo&&&&linux-vdso.so.1 =>
(0x00007fffcd1ff000)&&&&&&&&libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0xf69000)&&&&&&&&libm.so.6 => /lib64/libm.so.6 (0xe00000)&&&&&&&&libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0xe00000)&&&&&&&&libc.so.6 => /lib64/libc.so.6 (0x0000)&&&&&&&&/lib64/ld-linux-x86-64.so.2 (0xe00000)& &如果我链接一些so,但是程序并不用到这些so,又是什么情况呢,下面我加入链接压缩库,数学库,线程库# g++ -o demo -lz -lm -lrt
main.cpp# ldd demo&&&&&&&&linux-vdso.so.1 =>
(0x00007fff0f7fc000)&&&&&&&&libz.so.1 => /lib64/libz.so.1 (0x0000)&&&&&&&&librt.so.1 => /lib64/librt.so.1 (0x0000)&&&&&&&&libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0d000)&&&&&&&&libm.so.6 => /lib64/libm.so.6 (0xe00000)&&&&&&&&libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0xe00000)&&&&&&&&libc.so.6 => /lib64/libc.so.6 (0x0000)&&&&&&&&libpthread.so.0 => /lib64/libpthread.so.0 (0xa00000)&&&&&&&&/lib64/ld-linux-x86-64.so.2 (0xe00000)& 看看,虽然没有用到,但是一样有链接进来,那看看程序启动时候有没有去加载它们呢# strace ./demo&&&&execve("./demo", ["./demo"], [/* 30 vars */]) = 0&&&&...
= 0&&&&open("/lib64/libz.so.1", O_RDONLY)
= 3&&&&...&&&&close(3)
= 0&&&&open("/lib64/librt.so.1", O_RDONLY)
= 3&&&&...&&&&close(3)
= 0&&&&open("/usr/lib64/libstdc++.so.6", O_RDONLY) = 3&&&&...&&&&close(3)
= 0&&&&open("/lib64/libm.so.6", O_RDONLY)
= 3&&&&...&&&&close(3)
= 0&&&&open("/lib64/libgcc_s.so.1", O_RDONLY)
= 3&&&&...&&&&close(3)
= 0&&&&open("/lib64/libc.so.6", O_RDONLY)
= 3&&&&...&&&&close(3)
= 0&&&&open("/lib64/libpthread.so.0", O_RDONLY) = 3&&&&...&&&&close(3)
= 0&&&&...& 看,有加载,所以必定会影响进程启动速度,所以我们最后不要把无用的so编译进来,这里会有什么影响呢?& &大家知不知道linux从程序(program或对象)变成进程(process或进程),要经过哪些步骤呢,这里如果详细的说,估计要另开一篇文章。简单的说分三步:& & 1、fork进程,在内核创建进程相关内核项,加载进程可执行文件;& & 2、查找依赖的so,一一加载映射虚拟地址& & 3、初始化程序变量。& 可以看到,第二步中dll依赖越多,进程启动越慢,并且发布程序的时候,这些链接但没有使用的so,同样要一起跟着发布,否则进程启动时候,会失败,找不到对应的so。所以我们不能像上面那样,把一些毫无意义的so链接进来,浪费资源。但是开发人员写makefile 一般有没有那么细心,图省事方便,那么有什么好的办法呢。继续看下去,下面会给你解决方法。& 先使用 ldd -u demo 查看不需要链接的so,看下面,一面了然,无用的so全部暴露出来了吧# ldd -u demoUnused direct dependencies:&&&&&&&&/lib64/libz.so.1&&&&&&&&/lib64/librt.so.1&&&&&&&&/lib64/libm.so.6&&&&&&&&/lib64/libgcc_s.so.1& 使用&-Wl,--as-needed 编译选项# g++ -Wl,--as-needed -o demo -lz -lm -lrt
main.cpp# ldd demo&&&&&&&&linux-vdso.so.1 =>
(0x00007fffebfff000)&&&&&&&&libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000)&&&&&&&&libc.so.6 => /lib64/libc.so.6 (0x0000)&&&&&&&&libm.so.6 => /lib64/libm.so.6 (0xe00000)&&&&&&&&/lib64/ld-linux-x86-64.so.2 (0xe00000)&&&&&&&&libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0xe00000)# ldd -u demoUnused direct dependencies:& 呵呵,办法很简单省事吧,本文主要讲so依赖的一些问题,下一篇将介绍so的路径方面一些不为人知的小秘密
阅读(30280) | 评论(6) | 转发(35) |
相关热门文章
给主人留下些什么吧!~~
我用的怎么不行呢?
root@chenghai-virtual-machine:/# gcc -Wl,--as-needed -o ss sqrt.c
root@chenghai-virtual-machine:/# ldd -u ss
Unused direct dependencies:
& & & & linux-gate.so.1
root@chenghai-virtual-machine:/#
好文,既然转下来了,就不会忘记再顶一下,呵呵……
Bean_lee: 学了一招 ldd -u ,呵呵谢谢.....呵呵,我也觉得ldd -u 不赖
嗯,了解一下,开发人员可能犯的问题。有时他们是不管的,只要编译成功,能执行就行,看来他们需要效率的。
请登录后评论。So库官网app下载_So库v2.5破解版下载_So库是什么意思_So库是什么_网侠手机软件站
当前位置: >
So库安卓最新版本:v1.3苹果最新版本:v1.0
扫描立即进入手机端
平台:苹果,安卓
类型:影音视频
So库是一款功能强大的手机资源搜索器,为您提供海量丰富影视资源,还支持在线云播,欢迎有需要的亲们下载体验,在这里网侠小编为您带来了So库官网app下载、So库v2.5破解版下载、So库是什么意思、So库是什么等。
值得一看:
相关标签专题
(您的评论需要经过审核才能显示)
网侠手机站
All Rights Reserved.}

我要回帖

更多关于 库存管理软件sobong 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信