当前时区 GMT+8, 现在时间是 2008-7-6 10:47 游客: 注册 登录 仅登录论坛 | 搜索 帮助


标题: rpm 建包原理(20070824 更新)
lanzinc
银牌会员
Rank: 6Rank: 6


UID 177343
精华 10
积分 2416
帖子 1076
阅读权限 70
注册 2005-1-10
状态 离线
发表于 2006-9-10 14:58  资料  短消息  加为好友  QQ


QUOTE:
主要原因是rpmbuild在打包的过程中会自动去除bin文件里的一些多余符号,使bin的体积减小

这常被称为二进制文件的去皮或去壳
这也可以在编译的过程就来完成,就是编译的时候使用特定的参数来要求编译器进行特定的操作。

编译原理:
http://book.hitce.net/view.asp?id=213
另外更好的有:
http://book.chinaunix.net/showbook.php?id=16341
但找不到电子版

原代码在可移植性上的问题
http://www.linuxfans.org/nuke/modules.php?name=Site_Downloads&op=geninfo&did=4532

希望有人提供二进制代码的可移植性问题,代码复用,动态连接库的使用的相关电子书。





软件和任何理论都是有一定适用范围的,只能解决部分问题。

  • http://lunanflying.spaces.live.com
  • note:http://zinczombie.spaces.msn.com
顶部
linuxpgy
注册会员
Rank: 2


UID 87463
精华 0
积分 491
帖子 197
阅读权限 20
注册 2004-1-6
来自 杭州
状态 离线
发表于 2006-9-11 08:51  资料  短消息  加为好友  QQ


QUOTE:
对应的head文件已经作了相应的变化,bin的代码只要include相应的新的head文件.又因为, head文件的文件名不变,bin的代码不需要改变.

head文件名不变,内容做了改变?改其他东西无所谓,比如加个函数什么的,但是把以前的函数声明改了,是不可能编译的,就像bin需要getA(),你把getA改成getB,当然会提示找不到getA了。如果你不改变getA的声明,而是改getA的代码,这样怎么改都无所谓了,而且bin也不需要编译,直接调用getA好了,因为bin只认接口,这样bin还是可以运行的。(这就是用动态库的一大好处!修改部分不需要编译整个工程!)

QUOTE:
这常被称为二进制文件的去皮或去壳

但是会使某些bin去皮之后发生了"段错误"~~看来这个过程并不是安全的~~~

再提个问题:因为编译问题(gcc版本和优化选项等问题,其他因素暂不考虑)会导致一个平台编译的libsome.so.2和另一个平台的libsome.so.2会不同,那么如果一个包包含libsome.so.2就会和系统的libsome.so.2冲突(confilct with file from...)。如果直接使用--replacefiles 选项安装会不会有问题呢? 还有,如何打包使rpm不检测这种文件冲突,直接自动覆盖,就像用户输入了--replacefiles一样呢?





因为我是程序员,所以不能容忍任何严重的BUG! 很好看的韩剧:《你来自哪颗星》,《去海边吧》,《最后的舞请与我一起》 看贴的能不能给留个言啊!~~~~
顶部
jiangtao9999
超级版主
Rank: 8Rank: 8
到此一游


UID 9578
精华 3
积分 43677
帖子 28879
阅读权限 150
注册 2002-12-26
来自 公社光棍帮总坛
状态 在线
发表于 2006-9-11 20:01  资料  主页 短消息  加为好友  添加 jiangtao9999 为MSN好友 通过MSN和 jiangtao9999 交谈


QUOTE:
如果直接使用--replacefiles 选项安装会不会有问题呢? 还有,如何打包使rpm不检测这种文件冲突,直接自动覆盖,就像用户输入了--replacefiles一样呢?

欢迎来到 DLL 地狱。

Linux 软件包管理器,有一个功能就是避免这个用的。





梦想是那么的远,又是那么的近………… <--只能剩下这句祈祷了
我要签名图!!!!!!
顶部
KDE
超级版主
Rank: 8Rank: 8


UID 527
精华 27
积分 11714
帖子 4789
阅读权限 150
注册 2002-7-4
来自 China
状态 离线
发表于 2006-9-11 23:46  资料  短消息  加为好友  添加 KDE 为MSN好友 通过MSN和 KDE 交谈 QQ ICQ 状态
应用程序自带的库,应该尽可能放到私有目录里,比如 /usr/share/软件名称-版本号/lib/ 或者 /usr/local/lib/  或者 /opt/local/lib/,也就是说编译时就指定使用这些位置里的库文件。

rpm 不支持企图在打包时实现 rpm 安装阶段不检测这种文件冲突,你应该把是否覆盖的选择权交给用户。你应尽可能避免冲突,而不应该是悄无声息地替换系统文件,如果你实现了这样的操作,那无异于恶意程序。

确保软件的二进制代码能够跨平台运行,不是系统软件打包者要考虑的事,而是应用软件作者和独立二进制代码发布者应该考虑的事。我们没有责任和义务确保从我们系统里拆解下来的部件能够运行于其他系统上,不支持,更不提倡这种移花接木的作法。

试图解决跨平台的技术,我印象中有 autopackage 和 klik 技术,参见:
http://autopackage.org
http://klik.atekon.de





顶部
linuxpgy
注册会员
Rank: 2


UID 87463
精华 0
积分 491
帖子 197
阅读权限 20
注册 2004-1-6
来自 杭州
状态 离线
发表于 2006-9-12 09:51  资料  短消息  加为好友  QQ
看来我的好心可能害了用户~~~~如果不覆盖系统库的话不是不行,只要系统中保证有这些系统文件就行了,那样也能实现跨发行版安装。关键问题就是linux有那些系统文件是像user32.dll,kernel32.dll那样每个系统都带的呢?
如果不确定带哪些的话,是否有这样的选项,即安装的时候自动跳过已经存在的文件,而不是提示冲突中止安装呢?请高手指点!

关于autopackage,klik我会研究一下,不过rpm还是大部分linux使用的包管理系统,毕竟用的人不多。看看有没有借鉴之处~~谢谢啦!





因为我是程序员,所以不能容忍任何严重的BUG! 很好看的韩剧:《你来自哪颗星》,《去海边吧》,《最后的舞请与我一起》 看贴的能不能给留个言啊!~~~~
顶部
再见情人
版主
Rank: 7Rank: 7Rank: 7


UID 93112
精华 5
积分 3372
帖子 1726
阅读权限 255
注册 2004-2-5
来自 China Guangzhou
状态 离线
发表于 2006-9-12 13:04  资料  短消息  加为好友 
[quote:fe4af95701="linuxpgy"]看来我的好心可能害了用户~~~~如果不覆盖系统库的话不是不行,只要系统中保证有这些系统文件就行了,那样也能实现跨发行版安装。关键问题就是linux有那些系统文件是像user32.dll,kernel32.dll那样每个系统都带的呢?
如果不确定带哪些的话,是否有这样的选项,即安装的时候自动跳过已经存在的文件,而不是提示冲突中止安装呢?请高手指点!

关于autopackage,klik我会研究一下,不过rpm还是大部分linux使用的包管理系统,毕竟用的人不多。看看有没有借鉴之处~~谢谢啦! [/quote]
即便是系统满足了所有的库,只是文件名相同的话,不在当前系统编译的rpm包安装后也未必正常运行,即相同名字的库因为编译它的环境configure时的参数等等不能替换使用,所以即使你跳过了文件也未必解决问题,这也是为什么不能盲目直接替换文件的原因,各个linux系统文件版本都不同,提供的so名字可能不尽相同,很难说哪个文件是所有系统都带的。





easy come, easy go 天道本无常, 人生如大梦!
顶部
linuxpgy
注册会员
Rank: 2


UID 87463
精华 0
积分 491
帖子 197
阅读权限 20
注册 2004-1-6
来自 杭州
状态 离线
发表于 2006-9-12 13:42  资料  短消息  加为好友  QQ
虽然说系统库有相同文件名但是内容不一样,替换可能会导致其他程序有问题,不替换可能导致这个程序不能运行,但是仅仅是可能!有谁能证明一下吗? 这里引用一下论坛某人(忘了是谁了)的签名:

QUOTE:
少说,多干!






因为我是程序员,所以不能容忍任何严重的BUG! 很好看的韩剧:《你来自哪颗星》,《去海边吧》,《最后的舞请与我一起》 看贴的能不能给留个言啊!~~~~
顶部
lanzinc
银牌会员
Rank: 6Rank: 6


UID 177343
精华 10
积分 2416
帖子 1076
阅读权限 70
注册 2005-1-10
状态 离线
发表于 2006-9-12 13:49  资料  短消息  加为好友  QQ


QUOTE:
引用:
少说,多干!

这句话是没错,但是重复发明轮子和制造永动机都是不应该干的。





软件和任何理论都是有一定适用范围的,只能解决部分问题。

  • http://lunanflying.spaces.live.com
  • note:http://zinczombie.spaces.msn.com
顶部
linuxpgy
注册会员
Rank: 2


UID 87463
精华 0
积分 491
帖子 197
阅读权限 20
注册 2004-1-6
来自 杭州
状态 离线
发表于 2006-9-12 14:01  资料  短消息  加为好友  QQ


QUOTE:
这句话是没错,但是重复发明轮子和制造永动机都是不应该干的。

我最讨厌的就是重复发明轮子!!不过这和我们讨论的没什么关系吧?





因为我是程序员,所以不能容忍任何严重的BUG! 很好看的韩剧:《你来自哪颗星》,《去海边吧》,《最后的舞请与我一起》 看贴的能不能给留个言啊!~~~~
顶部
jiangtao9999
超级版主
Rank: 8Rank: 8
到此一游


UID 9578
精华 3
积分 43677
帖子 28879
阅读权限 150
注册 2002-12-26
来自 公社光棍帮总坛
状态 在线
发表于 2006-9-12 20:42  资料  主页 短消息  加为好友  添加 jiangtao9999 为MSN好友 通过MSN和 jiangtao9999 交谈
很有关系,因为你在重走 rpm 等包管理曾经走过的路。





梦想是那么的远,又是那么的近………… <--只能剩下这句祈祷了
我要签名图!!!!!!
顶部
linuxpgy
注册会员
Rank: 2


UID 87463
精华 0
积分 491
帖子 197
阅读权限 20
注册 2004-1-6
来自 杭州
状态 离线
发表于 2006-9-12 22:32  资料  短消息  加为好友  QQ


QUOTE:
很有关系,因为你在重走 rpm 等包管理曾经走过的路。

是吗?我怎么没听说过?那你举个例子……不要光说好不好啊~~说谁不会~~





因为我是程序员,所以不能容忍任何严重的BUG! 很好看的韩剧:《你来自哪颗星》,《去海边吧》,《最后的舞请与我一起》 看贴的能不能给留个言啊!~~~~
顶部
江涛的马甲
注册会员
Rank: 2



UID 222483
精华 0
积分 150
帖子 203
阅读权限 20
注册 2006-7-25
状态 离线
发表于 2006-9-13 09:45  资料  短消息  加为好友 
对于你来说,库文件不能被替换不符合你的想法。
但这个问题却在所有包管理器里放在首位。

顶部
lanzinc
银牌会员
Rank: 6Rank: 6


UID 177343
精华 10
积分 2416
帖子 1076
阅读权限 70
注册 2005-1-10
状态 离线
发表于 2006-9-13 14:53  资料  短消息  加为好友  QQ
假如windows也是原代码发行,而不是同一份二进制文件的拷贝,大家用的也是在各自的编译环境和参数下编译的话,继续使用windows原始的包管理机制,那会怎样?





软件和任何理论都是有一定适用范围的,只能解决部分问题。

  • http://lunanflying.spaces.live.com
  • note:http://zinczombie.spaces.msn.com
顶部
jiangtao9999
超级版主
Rank: 8Rank: 8
到此一游


UID 9578
精华 3
积分 43677
帖子 28879
阅读权限 150
注册 2002-12-26
来自 公社光棍帮总坛
状态 在线
发表于 2006-9-13 16:50  资料  主页 短消息  加为好友  添加 jiangtao9999 为MSN好友 通过MSN和 jiangtao9999 交谈
Windows 发行版只有一个,所以你携带了自己的 dll 去覆盖系统的 dll 不会导致多大的问题(其实问题也不小,不然不会从 xp 开始,系统给 dll 增加了保护,vista 的保护更严格)。而且因为版本单一,实际系统提供了足够的统一样式的库,不需要还要自己携带很多的库程序。

linux 发行版不同,他们提供的基础库也有出入。





梦想是那么的远,又是那么的近………… <--只能剩下这句祈祷了
我要签名图!!!!!!
顶部
linuxpgy
注册会员
Rank: 2


UID 87463
精华 0
积分 491
帖子 197
阅读权限 20
注册 2004-1-6
来自 杭州
状态 离线
发表于 2006-9-13 20:36  资料  短消息  加为好友  QQ
linux的dll就那么脆弱吗?覆盖一个会有问题吗?又不是随便拿个so去替换系统库的,基本可以保证是一份代码编译出来的,理论上不会太大问题,等有问题再解决吧。最近太忙了,都没时间做rpm了~~~





因为我是程序员,所以不能容忍任何严重的BUG! 很好看的韩剧:《你来自哪颗星》,《去海边吧》,《最后的舞请与我一起》 看贴的能不能给留个言啊!~~~~
顶部
 


Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
清除 Cookies - 联系我们 - 中国Linux公社 - WAP