0%

如何使共享库可执行

shared_hello.c为例子,里面有函数和main入口

让可执行文件可共享

1
2
3
$ gcc -m32 -pie -fpie -rdynamic -o libshared_hello.so shared_hello.c
$ gcc -m32 -o shared_hello.noc -L./ -lshared_hello
$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./ ./shared_hello.noc

让共享库可执行

这种生成方式的程序没有入口

1
2
3
$ gcc -m32 -shared -fpic -o libshared_hello.so shared_hello.c
$ readelf -h libshared_hello.so | grep "Entry point"
$ objdump -d libshared_hello.so | grep 1050 | head -2

解决入口问题也是如此

1
$ gcc -m32 -shared -fpic -o libshared_hello.so shared_hello.c -Wl,-emain

gdb的core dump解析

1
$ ulimit -c unlimited

通过主动链接器跑一下

1
$ /lib/ld-linux.so.2 ./libshared_hello.so

通过程序中加入标准退出函数_exit(0),就能正常执行了


原理

实际入口函数并非main(),而是_start,再改造,编译时连入口都不用指定了

1
2
$ gcc -m32 -g -shared -fpic -o libshared_hello.so shared_hello.c
$ /lib/ld-linux.so.2 ./libshared_hello.so

也可以当共享库使用了

1
2
$ gcc -m32 -o shared_hello.noc -L./ -lshared_hello
$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./ ./shared_hello.noc

然后那个asm内嵌汇编解决主动链接问题的跑不起来