Linux上制作可执行的共享库示例

简介:

 
x.cpp为共享库libx.so的实现,b.cpp为可执行b的实现。

 
x.cpp文件内容:

 
#include <stdio.h>
#include <stdlib.h>

 
// 使用C++作为编译器

 
void woo()
{
    printf("woo\n");
}

 
// foo作为共享库的入口,必须为C函数
extern "C" foo()
{
    printf("foo\n");
    exit(0); // 请注意这里必须调用,否则输出foo后会有段错误
}

 
b.cpp文件内容:
int main()
{
    extern void woo();
    extern "C" void foo();
    
    woo();
    foo();
    
    return 0;
}

 
编译x.cpp为可执行的共享库:
g++ -g -o libx.so -fPIE -pie -nostartfiles -Wl,-e,foo -rdynamic x.cpp
-fPIE -pie是保证共享库可以执行,其中-fPIE编译参数,表示生成与位置无关的可执行代码(-fPIC只是生成与位置无关的非可执行代码),-pid是链接参数;-Wl,-e,foo指定共享库的入口函数,相当于可执行程序的main函数;如果没有-nostartfiles,则链接时会报main函数未定义;-rdynamic也是必须的,否则编译b.cpp时会报找不到foo定义;如需查看详细的编译链接过程,加上-v参数。 请注意不能包含-shared参数,否则运行共享库时直接段错误。

 
编译b.cpp为可执行文件:
g++ -g -o b -L. -lx  b.cpp

 
成功之后,libx.so和b都是可执行的了,其中libx.so的入口是foo,而b的入口是main函数。



    本文转自eyjian 51CTO博客,原文链接:http://blog.51cto.com/mooon/909775,如需转载请自行联系原作者






相关文章
|
7月前
|
Linux C++
LInux下Posix的传统线程示例
LInux下Posix的传统线程示例
52 1
|
7月前
|
安全 Linux 网络安全
Linux使用HTTP隧道代理代码示例模版
Linux使用HTTP隧道代理代码示例模版
97 0
|
7月前
|
消息中间件 Kubernetes NoSQL
Linux时间校准(ntpdate及NTP客户端代码校准示例)
Linux时间校准(ntpdate及NTP客户端代码校准示例)
|
12天前
|
Linux Shell
Linux 10 个“who”命令示例
Linux 10 个“who”命令示例
39 14
Linux 10 个“who”命令示例
|
2月前
|
Unix Linux
Linux | Rsync 命令:16 个实际示例(下)
Linux | Rsync 命令:16 个实际示例(下)
41 3
Linux | Rsync 命令:16 个实际示例(下)
|
2月前
|
安全 Linux Shell
Linux | Rsync 命令:16 个实际示例(上)
Linux | Rsync 命令:16 个实际示例(上)
81 0
Linux | Rsync 命令:16 个实际示例(上)
|
3月前
|
Linux Shell
Linux 中 Tail 命令的 9 个实用示例
Linux 中 Tail 命令的 9 个实用示例
121 6
Linux 中 Tail 命令的 9 个实用示例
|
4月前
|
存储 Linux
【linux】【系统】启动参数配置的示例
【linux】【系统】启动参数配置的示例
46 0
|
5月前
|
Linux 编译器 调度
【Linux】对共享库加载问题的深入理解——基本原理概述
【Linux】对共享库加载问题的深入理解——基本原理概述
|
5月前
|
JavaScript Linux
【详细讲解】Linux grep命令用法大全 片尾有示例搜索指定目录中指定文件后缀的指定字符
【详细讲解】Linux grep命令用法大全 片尾有示例搜索指定目录中指定文件后缀的指定字符
147 1