创建可执行的共享库
来源:互联网 发布:最终幻想15捏脸数据 编辑:程序博客网 时间:2024/06/12 19:44
偶然发现glibc提供的libc.so是“可执行的”,这是快速查看glibc版本的一种方法,
1234567
~$ /lib/i386-linux-gnu/libc.so.6GNU C Library (Ubuntu EGLIBC 2.13-20ubuntu5.1) stable release version 2.13, by Roland McGrath et al.Copyright (C) 2011 Free Software Foundation, Inc....Compiled by GNU CC version 4.6.1.Compiled on a Linux 3.0.17 system on 2012-03-07....
这是gcc提供的一种叫做PIE(Position Independent Executable)的特性,可以创建位置无关的可以执行对象。它可以像共享库一样被加载到任何地址上执行。使用gcc的PIE相关选项可以创建这种共享库:
1234567891011121314151617181920
//~ echo.c#include <stdio.h>void echo(const char *s) { printf("%s\n", s);}int main() { char s[64]; snprintf(s, sizeof(s), "echo from %s in %s:%d", __func__, __FILE__, __LINE__); echo(s); return 0;}//~ main.c#include <stdio.h>extern void echo(const char*);int main() { char s[64]; snprintf(s, sizeof(s), "echo from %s in %s:%d", __func__, __FILE__, __LINE__); echo(s); return 0;}
1234567
$ # -E let ld export dynamic symbols explicitly$ cc -fPIC -pie -shared -Wl,-E -o libecho.so echo.c $ cc main.c -L. -lecho -o main$ ./libecho.soecho from main in echo.c:8$ LD_LIBRARY_PATH=. ./mainecho from main in main.c:6
使用objdump反汇编libecho.so,会看到,它同普通的so一样没有使用虚拟空间的绝对地址,但libecho.so中却含有_start符号(gcc生成的可执行程序的入口点)。
123456789101112131415161718192021
$ objdump -d libecho.so000005d0 <_start>: 5d0:31 ed xor %ebp,%ebp 5d2:5e pop %esi 5d3:89 e1 mov %esp,%ecx 5d5:83 e4 f0 and $0xfffffff0,%esp...000006cc <echo>: 6cc:55 push %ebp 6cd:89 e5 mov %esp,%ebp 6cf:53 push %ebx 6d0:83 ec 14 sub $0x14,%esp 6d3:e8 ef ff ff ff call 6c7 <__i686.get_pc_thunk.bx> 6d8:81 c3 1c 19 00 00 add $0x191c,%ebx 6de:8b 45 08 mov 0x8(%ebp),%eax 6e1:89 04 24 mov %eax,(%esp) 6e4:e8 a7 fe ff ff call 590 <puts@plt> 6e9:83 c4 14 add $0x14,%esp 6ec:5b pop %ebx 6ed:5d pop %ebp 6ee:c3 ret
更多关于PIE的信息,可以查看gcc中-fPIC/-fpic/-fPIE/-fpie/-pie选项,这篇文章还介绍了PIE和安全相关的一些信息。
- 创建可执行的共享库
- 生成可执行的共享库
- Linux上制作可执行的共享库示例
- Linux上制作可执行的共享库示例
- Linux上制作可执行的共享库示例
- 创建可执行的Jar文件
- 创建可执行的JAR文件
- 创建可执行的JAR文件
- 创建可执行的JAR包
- Linux共享库的创建
- 创建可执行的jar文件包
- 关于可执行 JAR 文件包的创建
- 创建一个可执行的python脚本
- linux-创建可执行的快捷服务命令
- springboot创建一个可执行的jar
- 如何创建可执行的jar包
- springboot创建一个可执行的jar
- 运行远程服务器上共享的可执行程序
- 详细介绍Ubuntu网络配置方法
- ios iphone 详解在IOS后台执行
- 使用枚举类定义常量
- 青涩的思绪 泛起粉色的涟漪
- 后台运行
- 创建可执行的共享库
- 代理模式
- iPhone应用开发 SQLite数据库使用详解
- Iphone Sqlite 数据库的四大操作
- 伤别
- centOS yum 安装mysql
- 深入学习WCF-地址
- HTML高级(帧标签)
- C# Infinity and NaN