2013-09-03 2 views
1

Linux 커널 3.10-2-amd64를 사용하여 x86_64에서 uClibc 0.9.27 [1]을 빌드하려고합니다. 3.2.0-49 제네릭 커널을 사용하여 Ubuntu 12.04.3에서 빌드되었는지 확인할 수 있습니다. make를 실행하면 오브젝트 파일을 많이 건설 관리하지만 결국 내가 유형 내가 가 흡입되어 있어야 수집 파일에 존재하는 것을 확인uClibc 빌드 linux 3.10-2 (Debian jessie x86_64)는 누락 된 유형으로 인해 실패합니다.

In file included from /usr/include/linux/kernel.h:4, 
       from /usr/include/linux/netlink.h:4, 
       from /usr/include/linux/rtnetlink.h:5, 
       from libc/inet/netlinkaccess.h:32, 
       from libc/inet/if_index.c:36: 
/usr/include/linux/sysinfo.h:8: error: expected specifier-qualifier-list before '__kernel_long_t' 
In file included from /usr/include/linux/rtnetlink.h:6, 
       from libc/inet/netlinkaccess.h:32, 
       from libc/inet/if_index.c:36: 
/usr/include/linux/if_link.h:317: error: expected specifier-qualifier-list before '__be16' 

과 불평, CC libc/inet/if_index.os에 도달합니다.의 경우

/usr/include/linux/sysinfo.h includes <linux/types.h> 
/usr/include/linux/types.h includes <linux/posix_types.h> 
/usr/include/linux/posix_types.h includes <asm/posix_types.h> 
/usr/include/x86_64-linux-gnu/asm/posix_types.h includes <asm/posix_types_64.h> 
/usr/include/x86_64-linux-gnu/asm/posix_types_64.h includes <asm-generic/posix_types.h> 
/usr/include/asm-generic/posix_types.h typedefs __kernel_long_t 

그래서, 어디에 오류가 오는가, 그리고 그것을 어떻게 해결할 수 : __kernel_long_t는이 파일이 같이 포함되어 있습니까?


[1] 예, 나는 최신 버전은 0.9.33.2 알고,하지만 난 그 특정 버전이 필요합니다.

+0

'linux-headers' 패키지를 설치 했습니까? –

+0

@BasileStarynkevitch : 예, 저는'linux-headers-3.10-2- {amd64, common}'을 가지고 있습니다. – bitmask

+0

당신은 확실합니까? 3.10-2'asm-generic/posix_types.h'는'__kernel_long_t'를 정의합니까? 'uClibc-0.9.27/Rules.mak'에서'HOSTCFLAGS = -O2 -Wall -D__kernel_long_t = long'을 설정하면 문제를 해결할 수 있습니까? –

답변

4

해결책은 libc/inet/netlinkacces.h의 최신 버전을 이전 버전으로 백 포트하는 것으로 보입니다. __kernel_long_t 문제는 포함이 회피되도록 (필요하다면, kernel_types.h에 패치되어야 할 것입니다. 정의가 의도적으로 헤더의 포함 가드를 섀도우하게하기 때문에 /usr/include에 다른 유형이 올바르게 포함될 수 있습니다) 패치 :

index 417d83a..1b9c857 100644 
--- a/libc/inet/netlinkaccess.h 
+++ b/libc/inet/netlinkaccess.h 
@@ -21,16 +21,7 @@ 

#include <features.h> 
#include <stdint.h> 
-#include <sys/types.h> 
- 
-#define _LINUX_TYPES_H 
-typedef uint8_t __u8; 
-typedef uint16_t __u16; 
-typedef uint32_t __u32; 
-typedef uint64_t __u64; 
-typedef int32_t __s32; 
-#include <linux/rtnetlink.h> 
-#include <linux/netlink.h> 
+#include <unistd.h> 

/* Should prob be a configure option or something */ 
#ifndef __ASSUME_NETLINK_SUPPORT 

이 기본적으로 이전 netlinkaccess.h (이에 ash에 의해 제안 전처리 된 파일의 diffing의 저를 암시)를 최신 버전에서 하나의 변화이다.

1

문제의 코드를주의 깊게 보지 않고 오류의 출처를 말하기는 어렵습니다. 대부분의 경우 패키지 자체가 소프트웨어를 빌드하려는 환경과 호환되지 않는 경우입니다. 당신이 기꺼이 그렇게한다면, 그것을 추적 할 수 있습니다. 거기에서 솔루션은 빌드 프로세스 시작시 설정을 변경하거나 실수를 수정하기 위해 코드를 수정하는 것일 수 있습니다.

이 문제는 포함 기능을 수행하는 타사 패키지이므로 추적하기가 까다로울 수 있습니다. 그리고 다중 아키텍처를 기반으로 작성된 것이라면 실제로 어떤 코드가 실제로 사용되는지 알지 못하게하는 많은 사전 처리기 지시문을 포함하게 될 것입니다.

os 파일의 CC가 홀수로 보일 수도 있지만 오류가 발생하는 명령어 (예 : CC libc/inet/if_index.os)를 캡처 한 다음 cc 명령을 수정하여 사전 처리 된 출력을 캡처하는 것이 좋습니다. 예를 들어

이에서 사전 처리 된 출력을 얻을 수 있습니다 :

cc -c prog.c -o prog.o 

사용이 intead :

cc -E prog.c >prog.i 

그런 다음 문제의 라인 prog.i 불구하고 검색 할 수 있습니다. 특정 줄 번호를 찾는 것은 까다 롭습니다. 따라서 텍스트를 검색하는 것이 가장 좋습니다. 일부 단어는 전 처리기로 바뀌므로 까다로워 질 수도 있지만 텍스트를 검색하는 것이 가장 좋습니다. 여기에 좋은 소식은 컴파일러가 컴파일하려고하는 것을 정확하게 출력한다는 것입니다. 모든 include가 처리되고 매크로가 적용된 후입니다. 그냥 "순수한 C"코드.

작동하는 버전과 실행하지 않는 버전에서 이것을 수행하고 __kernel_long_t이 좋은 곳에서 빌드로 가져온 곳을 확인한 다음 실패한 곳에서 발생하지 않는 이유를 찾으십시오.

참고 다음과 같이 라인 : "/usr/include/stdio.h"의

# 443 "/usr/include/stdio.h" 

평균 "라인 443"출력 파일의 다음 라인입니다.

정의가 소스로 들어오는 곳을 보려면 정의가 들어있는 줄 (질문에 표시된 typedef)을 검색하고 위의 첫 번째 줄을 파일 이름과 함께 검색하십시오. 그것은 그것을 얻었다. 파일을 가져온 위치를 더 확인하십시오. 위의 파일이 반드시 위의 파일 일 필요는 없으므로 원본 소스를 확인하십시오. 이렇게하면 결국 해당 정의가있는 파일을 포함하는 패키지 소스의 일부를 찾을 수 있습니다. 그런 다음 해당 줄이 다른 빌드에서 사용되지 않는 이유 또는 동일한 포함이 형식 정의로 이어지지 않는 이유를 파악할 수 있어야합니다.

게시 된 오류 메시지가 해당 문제가 __kernel_long_t에 대한 정의가 없음을 의미한다고 가정합니다. 이 오류는 해당 유형을 사용하기 바로 전에 문제가 있음을 의미 할 수 있습니다.

이 정보가 도움이되기를 바랍니다.

+0

실제로 전처리 된 파일을 살펴 보았지만 두 버전을 실제로 비교할 수는 없었습니다. 고마워. 고마워. – bitmask

+0

확실한 것 - 행운을 빌어 요. 이것들은 해결하기 까다로울 수 있습니다. 나는 당신에게 더 확실한 대답을 가지기를 바랍니다. – ash

+0

또 다른 아이디어. 특정 버전이 필요하다는 것을 알고 있지만 최신 버전에서 수정 될 수 있습니다. 같은 문제가 있는지 최신 정보를 만들어 보았습니까? – ash

관련 문제