以下是相关代码,它是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
答案 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);