你能帮我修改这段代码,让它在旧版本的 linux 中编译吗

标签 c linux fedora system-calls cross-compiling

下面是相关代码,它是从 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/

相关文章:

mysql - 如何在 Fedora 20 中安装 MySQL?

php - 如何使用 php 从 Ubuntu 访问 Windows 驱动器中的远程文件

c - 如何以无人身份运行程序?

linux - 从 linux 中删除存储库

c - 根据数字的每个数字打印出星号

c++ - 找不到 SDL.h 时

linux - 在 Fedora linux 中安装 .bundle 文件

c - METIS:不同操作系统的不同结果

c - 修改现有的 do_mkdir() 系统调用以打印创建的尚不存在的文件夹

c - 为什么以下 temp 和 stNode 显示不同的值?