c - 无法编译 ecepass.c

标签 c gcc freebsd

我一辈子都无法编译这段旧代码。我正试图用它来测试客户端的外部漏洞。我让它在 FreeBSD 11 中运行并使用 gcc 进行编译。知道为什么我会收到此错误吗?

int in_cksum(u_short *addr, int len)
{
    int sum;
    int nleft;
    u_short ans;
    u_short *w;

    sum = 0;
    ans = 0;
    nleft = len;
    w = addr;

    while (nleft > 1) {
      sum += *w++;
      nleft -= 2;
    }
    if (nleft == 1) {
      *(u_char *)(&ans) = *(u_char *)w;
       sum += ans;
    }
    return (sum);
}

完整代码在这里:https://pastebin.com/MGSYycmB

错误:

In file included from ecepass.c:8:0: ecepass.c:72:5: error: expected declaration specifiers or '...' before numeric constant int in_cksum(u_short *addr, int len)

最佳答案

PasteBin 上发布的代码中,第 #8 行(和 #24 :d)有语句:#include <machine/in_cksum.h>

因为我不在 Nix 上,所以我在 Internet 上搜索了该文件并找到了 2 个引用:

在它们中(大约 #40+ 行),似乎 in_cksum 是一个预处理器宏:

#define in_cksum(m, len)        in_cksum_skip(m, len, 0)

将函数的名称(以及代码中所有引用它的地方)更改为不是宏的名称,或者实际上是另一个已定义的标识符,例如校验和(希望它尚未定义:)),你应该没问题(也可能适用于你的其他功能)。
或者作为替代方案,删除机器/in_cksum.h 包含(直接 间接(通过其他嵌套包含)),但这可能会变得有点困难(另外,我没有检查所有代码以查看如果使用了 include 中的其他函数)。

关于c - 无法编译 ecepass.c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44640775/

相关文章:

c - 在同一个文件上交替使用 fwrite 和 fprintf

gcc - mulx 指令的固有特性

c - 父进程如何找到导致其子进程死亡的进程的pid?

clang - 在 Freebsd 上启用黄金链接器

核心基础,CF PRIVATE 定义在哪里

c - 位图缩放同时保持居中

c++ - "int(i)=1;"是什么意思?

c++ - 如何跳过将头文件包含到特定的 C/CPP 文件

c++ - CMAKE_CXX_COMPILER_VERSION 指向旧的 GCC 版本

c++ - 如何防止将 `#warning` 消息视为错误?