下面是相关代码,它是从 Linux 3.2.6 i686 GNU/Linux 编译和执行的 C 程序的一部分。然而,当我尝试从下面的旧系统编译它时,我收到了以下错误。我尝试将二进制文件移植到旧系统,但由于 missing/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
最佳答案
函数签名:
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);
如果它有效,我不确定这意味着什么。看起来您的头文件与您的内核版本不匹配...
编辑
用户 3118201:
非常感谢..试过了,但现在我得到了一个不同的错误“未定义对‘拼接’的引用”理想情况下,我想以一种生成相同结果但没有“太多参数”消息的方式编写这个函数这阻止了我创建二进制文件。显然有一些旧版本不喜欢的东西,但我没有编程技能来修改它并提供相同的功能
我的回复:
splice
在 2.5 版和 Linux 2.6.17 中添加到 glibc。
你试图编译的程序是为比你在旧机器上似乎拥有的更高版本的 Linux/libc 编写的。
没有简单的方法解决这个问题。您要么需要升级旧机器,要么重写代码。
关于你能帮我修改这段代码,让它在旧版本的 linux 中编译吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20676279/