你能协助我修改这段代码,以便在旧版本的linux中编译它

时间:2013-12-19 08:00:54

标签: c linux fedora system-calls cross-compiling

以下是相关代码,它是C程序的一部分,可以从 Linux 3.2.6 i686 GNU / Linux 编译和执行。但是当我尝试从下面的旧系统编译它时,我收到了以下错误。我尝试将二进制文件移植到旧系统,但由于缺少/lib/libc.so.6 :版本丢失,因此无法执行。任何帮助都感激不尽 ! 相关代码:

 clone((int (*)(void *))trigger,
          (void *)((unsigned long)newstack + 65536),
          CLONE_VM | CLONE_CHILD_CLEARTID | SIGCHLD,
          &fildes, NULL, NULL, target);

错误:

<filename>:262: error: too many arguments to function ‘clone’

旧系统:

  

2.6.11-1.1369_FC4#1 Thu Jun 2 22:55:56 EDT 2005 i686 i686 i386 GNU / Linux

2 个答案:

答案 0 :(得分:1)

功能签名:

int clone(int (*fn)(void *), void *child_stack,
          int flags, void *arg, ...
          /* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );

在早期版本的Linux(v 2.4及更早版本)中,clone()不接受参数ptid,tls和ctid。

我知道您的旧系统说2.6,但请尝试:

 clone((int (*)(void *))trigger,
          (void *)((unsigned long)newstack + 65536),
          CLONE_VM | CLONE_CHILD_CLEARTID | SIGCHLD,
          &fildes);

不确定它是否有效意味着什么。看起来您的头文件与您的内核版本不匹配......

修改

user3118201:

非常感谢..但是现在我得到一个不同的错误“未定义引用`splice'”理想情况下我想以一种生成相同结果但没有“太多参数”消息的方式编写此函数这阻止我创建二进制文件。显然有旧版本不喜欢的东西,但我没有编程技巧来修改它,但提供相同的功能

我的回复:

splice已添加到版本2.5和Linux 2.6.17中的glibc中。

您尝试编译的程序是为Linux / libc的更高版本而编写的,而不是您在旧计算机上的程序。

没有简单的方法可以解决这个问题。您需要升级旧计算机重新编写代码

答案 1 :(得分:1)

一项快速研究表明,如果使用

,你可能会很幸运
__clone()

使用您的古代libc,而不是

clone()

发出系统调用:

#define _GNU_SOURCE 

#include <unistd.h> /* for syscall */    
#include <sys/syscall.h> /* for SYS_clone */

...

syscall(SYS_clone, 
  trigger,
  ((char *) newstack) + 65536,
  CLONE_VM | CLONE_CHILD_CLEARTID | SIGCHLD,
  &fildes, NULL, NULL, target);