"struct in6_addr"没有成员带有-ansi的名为"s6_addr32"的成员 [英] ‘struct in6_addr’ has no member named ‘s6_addr32’ with -ansi

查看:617
本文介绍了"struct in6_addr"没有成员带有-ansi的名为"s6_addr32"的成员的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 no-asm -ansi 构建OpenSSL时,我正在解决一些编译错误.我正在捕捉错误:

I'm working through some compile errors when building OpenSSL with no-asm -ansi. I'm catching the error:

$ ./config no-asm -ansi
...
$ make
...
gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC
-DOPENSSLDIR="\"/usr/local/ssl\"" -DENGINESDIR="\"/usr/local/lib/engines\"" -Wall -O3
-pthread -m64 -DL_ENDIAN  -ansi -fPIC -Iinclude -I. -Icrypto/include -MMD -MF
crypto/bio/bss_dgram.d.tmp -MT crypto/bio/bss_dgram.o -c -o crypto/bio/bss_dgram.o
crypto/bio/bss_dgram.c
In file included from /usr/include/netdb.h:27:0,
                 from ./e_os.h:443,
                 from crypto/bio/bio_lcl.h:2,
                 from crypto/bio/bss_dgram.c:62:
crypto/bio/bss_dgram.c: In function ‘dgram_get_mtu_overhead’:
crypto/bio/bss_dgram.c:433:20: error: ‘const struct in6_addr’ has no member named ‘s6_addr32’
                 && IN6_IS_ADDR_V4MAPPED(&tmp_addr))
                    ^

我在/usr/include/linux/in6.h中找到了该结构:

#if __UAPI_DEF_IN6_ADDR
struct in6_addr {
    union {
        __u8        u6_addr8[16];
#if __UAPI_DEF_IN6_ADDR_ALT
        __be16      u6_addr16[8];
        __be32      u6_addr32[4];
#endif
    } in6_u;
#define s6_addr         in6_u.u6_addr8
#if __UAPI_DEF_IN6_ADDR_ALT
#define s6_addr16       in6_u.u6_addr16
#define s6_addr32       in6_u.u6_addr32
#endif
};
#endif /* __UAPI_DEF_IN6_ADDR */

我不记得以前需要定义__UAPI_DEF_IN6_ADDR_ALT了.搜索它会从内核的 ,第95行左右(如果我正确解析的话):

I don't recall needing to define __UAPI_DEF_IN6_ADDR_ALT in the past. Searching for it reveals the following from the kernel's libc-compat.h, line 95 or so (if I am parsing it correctly):

#define __UAPI_DEF_IN6_ADDR             1
/* We unconditionally define the in6_addr macros and glibc must coordinate. */
#define __UAPI_DEF_IN6_ADDR_ALT         1
#define __UAPI_DEF_SOCKADDR_IN6         1
#define __UAPI_DEF_IPV6_MREQ            1
#define __UAPI_DEF_IPPROTO_V6           1
#define __UAPI_DEF_IPV6_OPTIONS         1
#define __UAPI_DEF_IN6_PKTINFO          1
#define __UAPI_DEF_IP6_MTUINFO          1

我应该如何继续定义备用符号?

How should I proceed to get the alternate symbols defined?

系统是Ubuntu 14.04(x86_64):

The system is Ubuntu 14.04 (x86_64):

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.4 LTS
Release:    14.04
Codename:   trusty

GCC是:

$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.

推荐答案

事实证明这很有趣...简短地说,我需要同时添加-ansi-D_DEFAULT_SOURCE=1.但是,-D_DEFAULT_SOURCE=1会撤消-ansi试图完成的工作,因此需要将其包含在内.

This turned out to be interesting... The short of it is I needed to add both -ansi and -D_DEFAULT_SOURCE=1. However, -D_DEFAULT_SOURCE=1 kind of undoes what -ansi is trying to accomplish so it needs to be contained.

首先,/usr/include/linux/in6.h是错误的标题.我通过struct in6_addr的grep找到了它,但没有跟踪需要完成的内容.

First, /usr/include/linux/in6.h was the wrong header. I found it through a grep for struct in6_addr, and not tracing includes like needed to be done.

下一步... -D_DEFAULT_SOURCE=1间接来自/usr/include/netinet/in.h:

Next... -D_DEFAULT_SOURCE=1 indirectly came from /usr/include/netinet/in.h:

#ifndef __USE_KERNEL_IPV6_DEFS
/* IPv6 address */
struct in6_addr
  {
    union
      {
    uint8_t __u6_addr8[16];
#ifdef __USE_MISC
    uint16_t __u6_addr16[8];
    uint32_t __u6_addr32[4];
#endif
      } __in6_u;
#define s6_addr         __in6_u.__u6_addr8
#ifdef __USE_MISC
# define s6_addr16      __in6_u.__u6_addr16
# define s6_addr32      __in6_u.__u6_addr32
#endif
  };
#endif /* !__USE_KERNEL_IPV6_DEFS */

手动启用__USE_MISC无效.在/usr/include/features.h中跟踪__USE_MISC的内容:

Manually enabling __USE_MISC did not work. Tracing things for __USE_MISC in /usr/include/features.h:

/*
...
   __USE_MISC       Define things from 4.3BSD or System V Unix.
...
*/

#undef __USE_MISC
...

#if defined _DEFAULT_SOURCE
# define __USE_MISC 1
#endif

最后,来自/usr/include/features.h中的评论:

_DEFAULT_SOURCE The default set of features (taking precedence over __STRICT_ANSI__).


尽管_DEFAULT_SOURCE=1-ansi不同,但是影响可以限制为受IN6_IS_ADDR_V4MAPPED影响的一个源文件.也就是说,对于C源文件 crypto/bio/bss_dgram.c :


Though _DEFAULT_SOURCE=1 diverges from -ansi, the impact can be limited to the one source file that's affected by IN6_IS_ADDR_V4MAPPED. That is, in for the C source file crypto/bio/bss_dgram.c:

/* OpenSSL copyright ... */

#ifndef _DEFAULT_SOURCE
# define _DEFAULT_SOURCE 1
#endif

#include <stdio.h>
#include <errno.h>
#include <netinet/in.h>
...


摆弄__USE_KERNEL_IPV6_DEFS会使情况变得更糟.我相信它启用了/usr/include/linux/in6.h,其成员名称与<netinet/in.h>类似(但完全不同).


Fiddling with __USE_KERNEL_IPV6_DEFS made things even worse. I believe it enabled /usr/include/linux/in6.h, which had similar (but completely different) member names than <netinet/in.h>.

这篇关于"struct in6_addr"没有成员带有-ansi的名为"s6_addr32"的成员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆