2016-03-25 4 views
3

Я работаю через некоторые ошибки компиляции при сборке OpenSSL с no-asm -ansi. Я ловлю ошибку:«структура in6_addr» не имеет элемента с именем «s6_addr32» с -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 в прошлом. Поиск Раскрывается вытекающая из кода ядра libc-compat.h, строка 95 или так (если я разборе правильно):

#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? Если программа конфигурации сборки работает без ошибок, вы должны иметь возможность полагаться на сборку, чтобы добиться успеха, поэтому это, безусловно, кажется ошибкой * bona fide *.Это не только то, что нужно делать, но комментарий к билету может привести к обходу или исправлению. –

+0

Отчет был подан в [Номер проблемы: 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 был неправильным заголовком. Я нашел его через grep для struct in6_addr, а не трассировка, как это необходимо сделать.

Далее ... -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 не работает. Трассировка вещи для __USE_MISC в /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. То есть, в течение исходного файла Си 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>.