1
1楼 cdk 2008-7-11 11:02 今天,我在看lfs时看到,为了测试系统中的glibc的版本,采用了
/lib/libc.so.6 | head -n1 | cut -d" " -f1-7 这和我以前的认知有出入,动态连接库可以直接运行!我尝试运行了一个我自己编写的动态连接库,结果是“Segmentation fault”。 我尝试google了一下,可能是没找对关键字,没有找到有用的信息。 请熟悉这个问题的大侠帮我解释一下,为什么可以直接运行?我自己编写的动态连接库需要做什么工作才能也像这样输出一个帮助性文本? 2楼 swordfish.cn 2008-7-11 13:07 给一个例子
CODE: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> const char my_interp[] __attribute__((section(".interp"))) = "/lib/ld-2.5.so"; int main(int argc, char **argv) { printf("executable shared object\n"); exit(0); } void func(void) { printf("func\n"); } 编译方法 CODE: gcc -Wall -W -fPIC -shared -o myso.so myso.c -lc -Wl,-e,main 具体的可以 google 一下 create executable shared object [ 本帖最后由 swordfish.cn 于 2008-7-11 13:08 编辑 ] 3楼 MMMIX 2008-7-11 20:35 /lib/ld-2.5.so 换成 /lib/ld-linux.so.2 似乎要好一些。
4楼 Godbach 2008-7-12 09:24 偶也头一次听说,学习了。。
5楼 swordfish.cn 2008-7-12 13:14 在我的机器上 ld-linux.so.2 其实是指向 ld-2.5.so 的一个软连接。 所以我就直接写那一个了。 6楼 swordfish.cn 2008-7-12 13:19 shared object 一样是 ELF 格式的文件,关键是有没有入口的问题。这里通过
CODE: -Wl,-e,main 向 ld 传递参数,指定入口为 main 函数。其实这里吧 main 改为 func 也是可以的,但是要在 func 中加上 exit(0),不然会 segfault 的。 7楼 MMMIX 2008-7-13 14:26 QUOTE: 在我的机器上,ld-linux.so.2 是指向 ld-2.7.so 的,因此当使用 ld-2.5.so 时,通过 shell 执行 myso.so 就出现了一个十分诡异的问题,shell 报错说 no such file, ldd 也报同样的错误。 8楼 cdk 2008-7-14 15:00 受教了,谢谢swordfish.cn
搜索墙@2009 www.pkwall.com all rights reserved QQ:276471788 [京ICP备09111534号]
声明:本站部分数据来源于网络,仅供参考,如有版权问题,请联系我们,我们将及时删除!转载本站请注明来源
| ||||||||||||||||||||||||||||||||||||||||