直接移植GCC和GLIBC二进制文件是否可行?

elated 2012-12-05 08:48:55
一个项目,在LINUX平台上开发。
发布时,希望能在用户机器上用我们自己的编译环境进行编译
即,使用我们指定的GCC编译代码,include我们的头文件,链接到我们的GLIBC
我感觉这样不可行啊,操作系统那么多,一个环境下能用另一个环境下就不行了
GLIBC又依赖于操作系统,GCC,GLIBC又相互依赖
想问问这方面经验比较多的同学,这样做可行么?
另问,LINUX下的程序都是怎么发布的,难道只能用源码在每台机器上编译?
谢谢回复~
...全文
532 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-02-19
  • 打赏
  • 举报
回复
要搞清楚这个问题需要初步了解 ELF 和 GOT 什么时候可以: 大多数时候都可以。只要你编译机用glibc/linux, 运行机也有glibc/linux,那么就可以。 软件代码 = 自身代码 + 库函数的编号 原理是,可执行代码和你include什么头文件没直接关系,生成的机器指令和运行机上一样就可以。 glibc依赖系统,但是linux系统给glibc使用的系统调用号是不变的。各库函数用一个代码表示,此代码在各版本的glibc库中的序号是不变的。 举个例子: int main() { char *buf; buf = (char*)malloc(1024); printf("Malloced %p\n", buf); return 0; } 1). malloc最终会变成系统中的brk, 这个调用对所有linux都一样。 所以可以运行。 2). print/malloc在软件本身代码中只是一个跳转,具体代码由运行机器提供。 (gdb) disassemble main Dump of assembler code for function main: 0x0000000000400504 <+0>: push %rbp <- x86_64 0x0000000000400505 <+1>: mov %rsp,%rbp 0x0000000000400508 <+4>: sub $0x10,%rsp 0x000000000040050c <+8>: mov $0x400,%edi 0x0000000000400511 <+13>: callq 0x400400 <malloc@plt> <-- If have /lib64/glibc, then no problem. 0x0000000000400516 <+18>: mov %rax,-0x8(%rbp) 0x000000000040051a <+22>: mov $0x400640,%eax 0x000000000040051f <+27>: mov -0x8(%rbp),%rdx 0x0000000000400523 <+31>: mov %rdx,%rsi 0x0000000000400526 <+34>: mov %rax,%rdi 0x0000000000400529 <+37>: mov $0x0,%eax 0x000000000040052e <+42>: callq 0x4003f0 <printf@plt> 0x0000000000400533 <+47>: mov $0x0,%eax 0x0000000000400538 <+52>: leaveq 0x0000000000400539 <+53>: retq 什么时候不可以: 1. 编译的机器上链接器指定的运行库不存在/不匹配 这是比较常见的错误,除非你静态编译,否则,软件用到的所有库函数是动态从运行机上装入内存的,没有当然不行. 另外 一个例子是 , x86_64位系统下编译的软件,它链接的是/lib64, 你放32机,当然不行。找不到啊 一般来说,代码启动时就会发现这个问题,运行失败. 如果软件是用dlopen的方式打开运行库, 可能会在执行到那段逻辑时,才失败,就是说软件可能部分可用. 2. 编译的机器和目标机的平台不一样. 估计楼主不是说的这个,一个x86上编的代码,你想放手机上(可能是ARM)运行,当然不行. 他们的机器指令不一样. 需要交叉编译。
LouisScola 2012-12-14
  • 打赏
  • 举报
回复
其实看情况了,OS,CPU差别不大的话是可以用的
RedWolf1999 2012-12-13
  • 打赏
  • 举报
回复
很多芯片厂商不就是连交叉链、库等都会提供好给OEM厂商么?
buyong 2012-12-06
  • 打赏
  • 举报
回复
在你机器上编好可执行程序,直接拿到别的Linux上,直接用就行了
fdl19881 2012-12-06
  • 打赏
  • 举报
回复
引用 10 楼 elated 的回复:
引用 4 楼 fdl19881 的回复:glibc就是跨平台的,在每个linux平台上都有提供对应的版本。不需要你自己写然后跨平台.在说你自己写的glibc会比gnu glibc的更好? 因为客户机器GLIBC的版本我们并不知道,而程序对GLIBC的版本有要求 并不是说自己写libc,这个难度太大了
将程序对版本的要求的地方换成自己写的函数。。(若依赖于glibc提供的系统级别的API,如pthread这类等等。)
elated 2012-12-06
  • 打赏
  • 举报
回复
引用 4 楼 fdl19881 的回复:
glibc就是跨平台的,在每个linux平台上都有提供对应的版本。不需要你自己写然后跨平台.在说你自己写的glibc会比gnu glibc的更好?
因为客户机器GLIBC的版本我们并不知道,而程序对GLIBC的版本有要求 并不是说自己写libc,这个难度太大了
elated 2012-12-06
  • 打赏
  • 举报
回复
引用 1 楼 lishanchao 的回复:
我见过一个项目,Intel是这么提供环境的:提供gcc编译器的源码,用户自己编译出交叉工具链,然后再用它编译源码,生成最终的Firmware。 不知楼主是什么样的项目,或者,静态编译可以满足?
有多线程,对文件读写等,静态编译不行
elated 2012-12-06
  • 打赏
  • 举报
回复
引用 7 楼 wenxy1 的回复:
不可行. 应当使用同一个平台的编译器,库和可执行文件. 重新编译吧.
都是X86-64平台,之所有想这么做,是因为用到的库对glibc版本有限制 而程序运行的机器上的glibc的又不一定满足版本要求 而又不想要求别人更新glibc,所以想随着环境一同发布
Wenxy1 2012-12-06
  • 打赏
  • 举报
回复
不可行. 应当使用同一个平台的编译器,库和可执行文件. 重新编译吧.
沭水河畔 2012-12-06
  • 打赏
  • 举报
回复
引用 2 楼 buyong 的回复:
在你机器上编好可执行程序,直接拿到别的Linux上,直接用就行了
在程序编写不规范的情况下,比如某些变量未初始化,在不同的系统上确实可能有不同的结果。
fdl19881 2012-12-06
  • 打赏
  • 举报
回复
移植是指从源码上移植,然后用对应平台的编译器编译出二进制。
fdl19881 2012-12-06
  • 打赏
  • 举报
回复
glibc就是跨平台的,在每个linux平台上都有提供对应的版本。不需要你自己写然后跨平台.在说你自己写的glibc会比gnu glibc的更好?
fdl19881 2012-12-06
  • 打赏
  • 举报
回复
一份源码(已经做好了跨平台的源码),分平台编译。 一份二进制不可能在不同平台(x86,arm等)上都能运行的。
沭水河畔 2012-12-05
  • 打赏
  • 举报
回复
我见过一个项目,Intel是这么提供环境的:提供gcc编译器的源码,用户自己编译出交叉工具链,然后再用它编译源码,生成最终的Firmware。 不知楼主是什么样的项目,或者,静态编译可以满足?

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧