以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
| $ /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内嵌汇编解决主动链接问题的跑不起来