2016-03-25 12 views
3

で「s6_addr32」という名前のメンバーを持っていません。私は、エラーをキャッチしています:「構造体のin6_addrは、」私は<strong><em><code>no-asm -ansi</code></em></strong>でOpenSSLをビルドするときに、いくつかのエラーをコンパイルして働いてい-ansi

$ ./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、カーネルのlibc-compat.hから次のことを明らかにしたりので、(私はそれを正しく解析していた場合)の検索:

#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 

私は定義された代替シンボルを取得するために進むべき方法は?


システムは、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. 
+0

OpenSSLに問題があるとお考えですか?ビルド設定プログラムがエラーなく実行されている場合、ビルドを成功させるためにビルドに頼ることができるはずです。したがって、これは確かに真実な*バグです。それは正しいことであるだけでなく、チケットに関する解説は回避策や修正をもたらすかもしれません。 –

+0

報告書は、[Issue#4480:Ubuntu 14(x86_64): "no-asm -ansi"を使用した場合のコンパイルエラーと警告](https://rt.openssl.org/Ticket/Display.html?id= 4480&ユーザー=ゲスト&パス=ゲスト)。私は実際に現時点でバグを働いている人に近い。 – jww

答えて

1

これは面白いことが判明...それの短い、私がするのに必要とされます-ansi-D_DEFAULT_SOURCE=1の両方を追加します。しかし、-D_DEFAULT_SOURCE=1種類の元に戻すものは何か-ansiこれを達成しようとしている必要があります。

まず、/usr/include/linux/in6.hは間違ったヘッダーでした。私はstruct in6_addrのgrepで見つけました。トレースするのに必要なものが含まれていません。

次... -D_DEFAULT_SOURCE=1が間接的に/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のために何かをトレース:

/* 
... 
    __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です。それは、crypto/bio/bss_dgram.c 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製のものであっても悪いことをいじります。私はそれが<netinet/in.h>と同じ(ただし全く異なる)メンバー名を持っていた/usr/include/linux/in6.hを有効にしたと信じています。

関連する問題

 関連する問題