免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1843 | 回复: 4
打印 上一主题 下一主题

[C] 关于gcc进行动态链接的问题 [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-10 08:54 |只看该作者 |倒序浏览
网上的说明,使用-shared可以创建动态链接库。可是要加上-fPIC,说明是生成“位置无关代码”(Position Independent Code),网上有人说,加这个参数是为了让单纯一份代码能使多个程序共享,如果不加,那么动态库会以复制的方式在内存中存在多份,也就没有办法共享数据了。

关键是最后一句,让我想起了win32里面用DLL进行进程间通讯的技术。当即试验了下。步骤是这样的:

1. 一个动态库,代码是这样的:
#include <stdio.h>
int x = 10;
void func(void){printf("%d\n", x);}

2. 两个程序,第一个每隔一秒调用func,第二个修改x为20以后退出。
3.先执行第一个程序,然后在另一个终端执行第二个。

可是我的试验失败了,即使加了-fPIC,仍然无法让第二个程序影响第一个(第二个运行以后,第一个还是输出原来的值)。请问有没有办法实现Win32里面那种通过DLL进行的进程间通讯呢?


附带我对PIC的理解:可能被编译成so的程序是不附带数据域的,而只是写下对数据域的要求,在编译自己的程序时,会根据附加的库,自动把理应在库中的数据域放到主程序中,使得即使代码是PIC的,但是全局数据还是每个进程一份,因此无法做进程间通讯,不知道我猜测的对不对。

论坛徽章:
0
2 [报告]
发表于 2009-08-10 12:37 |只看该作者
x是存在rdata段中的
如果是全局的未赋值变量是存在bss段中的

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
3 [报告]
发表于 2009-08-10 12:51 |只看该作者
恩,这个是针对单个程序的,如果是带动态链接库的,那么数据是每个进程一份(存在于进程的诸段中),还是dll一份大家共享(存在于so文件的诸段中)?

objdump在so文件里面看到了data段(因为是int,所以在data段里面,不是在rdata段里面),但是怎么解释一个进程无法修改另一个进程在so文件里面的数据呢?两种解释:1. so文件的数据段是copy-on-write的,每个进程都共享,但是如果想写入,就是copy一份单独的。2. 载入的时候,不分三七二十一,先把so文件的所有数据段再载入一遍,专门给某个进程用。

究竟是哪种解释对呢?还是都不对?有没有利用so文件进行进程间通讯的可能性?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2009-08-10 14:00 |只看该作者

回复 #1 starwing83 的帖子

shared
On Microsoft Windows, in addition to putting variable definitions in a named
section, the section can also be shared among all running copies of an executable
or DLL. For example, this small program defines shared data by putting it in
a named section shared and marking the section shareable:
int foo __attribute__((section ("shared"), shared)) = 0;
int
main()
{
  /* Read and write foo. All running
  copies see the same value. */
  return 0;
}
You may only use the shared attribute along with section attribute with a
fully initialized global definition because of the way linkers work. See section
attribute for more information.
The shared attribute is only available on Microsoft Windows.


我只知道这个……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2009-08-10 14:08 |只看该作者

回复 #4 OwnWaterloo 的帖子

上面说的 shared 是放到源代码中的 __attribute__(xxx)
不是编译选项 -shared 哦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP