编译otad时缺少selinux.h的问题及解决

来源:互联网 发布:origin怎么导入数据 编辑:程序博客网 时间:2024/05/22 14:35
  • 一 问题起因
  • 二 问题分析
  • 三 解决方案及总结

一 问题起因

为了在N上让updater能判断system分区是否出现了改动,我们需要把otad添加到N版本的miui中,仿照之前在m上的做法,manifest中添加otad,但是在编译阶段出现错误:

In file included from system/otad/commands.c:13:
bootable/recovery/minzip/Zip.h:21:10: fatal error: 'selinux/selinux.h' file not found
#include <selinux/selinux.h>
^
1 error generated.

 

二 问题分析

根据错误分析,在system/otad/commands.c中有:
#include "minzip/Zip.h"
在system/otad/Android.mk中有:
LOCAL_C_INCLUDES += bootable/recovery
因此在commands.c中include的Zip.h就位于bootable/recovery/minzip/Zip.h,在这个文件中直接include了selinux.h
#include <selinux/selinux.h>
根据C和C++中included的特性,include就相当于将这个文件完整包含进当前文件,因此这说明在编译system/otad/commands.c时直接引用到了selinux.h这个头文件。现在就是由于编译otad时找不到这个文件导致失败。
在Zip.h中也直接include了selinux.h这个头文件,我们看在编译minzip时是怎么解决这个问题的:

bootable/recovery/minzip/Android.mk Collapse source
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
    Hash.c \
    SysUtil.c \
    DirUtil.c \
    Inlines.c \
    Zip.c
LOCAL_C_INCLUDES := \
    external/zlib \
    external/safe-iop/include
LOCAL_STATIC_LIBRARIES := libselinux
LOCAL_MODULE := libminzip
LOCAL_CFLAGS += -Wall
include $(BUILD_STATIC_LIBRARY)

在minzip的Android.mk中并没有通过给LOCAL_C_INCLUDES直接赋值为selinux头文件所在位置的方式,而是在LOCAL_STATIC_LIBRARIES添加了libselinux的方式来解决包含selinux.h这个头文件的问题。
从这里我们可以推断,编译libminzip时需要编译libselinux,应该是在编译libselinux时得到了selinux.h的位置。

libselinux位于external/libselinux,观察它的Android.mk

external/libselinux/Android.mk Collapse source
 LOCAL_PATH:= $(call my-dir)
common_SRC_FILES := \
    src/booleans.c \
    src/canonicalize_context.c \
    src/disable.c \
    src/enabled.c \
    src/fgetfilecon.c \
    src/fsetfilecon.c \
    src/getenforce.c \
    src/getfilecon.c \
    src/getpeercon.c \
    src/lgetfilecon.c \
    src/load_policy.c \
    src/lsetfilecon.c \
    src/policyvers.c \
    src/procattr.c \
    src/setenforce.c \
    src/setfilecon.c \
    src/context.c \
    src/mapping.c \
    src/stringrep.c \
    src/compute_create.c \
    src/compute_av.c \
    src/avc.c \
    src/avc_internal.c \
    src/avc_sidtab.c \
    src/get_initial_context.c \
    src/checkAccess.c \
    src/sestatus.c \
    src/deny_unknown.c
common_HOST_FILES := \
    src/callbacks.c \
    src/check_context.c \
    src/freecon.c \
    src/init.c \
    src/label.c \
    src/label_file.c \
    src/label_android_property.c \
    src/label_support.c
 
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(common_SRC_FILES) $(common_HOST_FILES) src/android.c
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
LOCAL_STATIC_LIBRARIES := libcrypto_static
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_WHOLE_STATIC_LIBRARIES := libpcre libpackagelistparser
1003 corresponds to auditd, from system/core/logd/event.logtags
LOCAL_CFLAGS := -DAUDITD_LOG_TAG=1003
# mapping.c has redundant check of array p_in->perms.
LOCAL_CLANG_CFLAGS += -Wno-pointer-bool-conversion
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -DHOST
ifeq ($(HOST_OS),darwin)
LOCAL_CFLAGS += -DDARWIN
endif
LOCAL_SRC_FILES := $(common_HOST_FILES)
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
LOCAL_WHOLE_STATIC_LIBRARIES := libpcre
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
include $(BUILD_HOST_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(common_SRC_FILES) $(common_HOST_FILES) src/android.c
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES := libcrypto liblog libpcre libpackagelistparser
1003 corresponds to auditd, from system/core/logd/event.logtags
LOCAL_CFLAGS := -DAUDITD_LOG_TAG=1003
# mapping.c has redundant check of array p_in->perms.
LOCAL_CLANG_CFLAGS += -Wno-pointer-bool-conversion
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -DHOST
ifeq ($(HOST_OS),darwin)
LOCAL_CFLAGS += -DDARWIN
endif
LOCAL_SRC_FILES := $(common_HOST_FILES)
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
LOCAL_WHOLE_STATIC_LIBRARIES := libpcre
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
include $(BUILD_HOST_SHARED_LIBRARY)
#################################
include $(CLEAR_VARS)
LOCAL_CFLAGS := -DHOST
ifeq ($(HOST_OS),darwin)
LOCAL_CFLAGS += -DDARWIN
endif
LOCAL_MODULE := sefcontext_compile
LOCAL_MODULE_TAGS := eng
LOCAL_C_INCLUDES := ../src/label_file.h
LOCAL_SRC_FILES := utils/sefcontext_compile.c
LOCAL_STATIC_LIBRARIES := libselinux
LOCAL_WHOLE_STATIC_LIBRARIES := libpcre
LOCAL_C_INCLUDES := external/pcre
include $(BUILD_HOST_EXECUTABLE)

可以发现其中有个LOCAL_EXPORT_C_INCLUDE_DIRS变量,取值为$(LOCAL_PATH)/include,它的作用就是将external/libselinux/include这个路径导出到out目录下编译模块的import_includes中,如果在ota的Android.mk中不添加libselinux,
编译otad出错后,进入到/out/target/product/cappu/obj/EXECUTABLES/otad_intermediates目录,可以发现import_includes文件的内容为
-I external/libcxx/include
-I external/libcxxabi/include
-I external/zlib
如果Android.mk中在LOCAL_STATIC_LIBRARIES中添加上libselinux,这时不但可以正常编译出otad,而且打开otad_intermediates目录下的import_includes,可以看到多出了selinux头文件的位置
-I external/libcxx/include
-I external/libcxxabi/include
-I external/zlib
-I external/libselinux/include

 

三 解决方案及总结

至此,我们可以找到解决这个编译失败的两种方案
1 在system/otad/Android.mk中将
LOCAL_STATIC_LIBRARIES := libminzip libz
改为
LOCAL_STATIC_LIBRARIES := libminzip libz libselinux
2 在system/otad/Android.mk中
LOCAL_C_INCLUDES += bootable/recovery
的下一行添加
LOCAL_C_INCLUDES += external/libselinux/include
这种方法相对手动一点,效果跟第一中相同,相当于将import_includes文件中-I external/libselinux/include的内容放到了LOCAL_C_INCLUDES中。
观察recovery和它下面的minzip的Android.mk,都采用的是添加libselinux的方法,因此推荐第一种方法。

最后,查看external/libselinux/Android.mk的提交历史,我们可以发现引入LOCAL_EXPORT_C_INCLUDE_DIRS是aosp官方的一个改动,之前采用的拷贝头文件的方式中,一个模块只需要包含selinux头文件而不需要依赖于selinux,这会引起依赖问题,因此之后改为了这种方式:
Author: Colin Cross <ccross@android.com> 2015-12-22 08:30:17
Committer: Colin Cross <ccross@android.com> 2015-12-22 08:30:17
Parent: 6d5e6edc21b1c41e815403a7ff9d8678642b744d (Use libpackageparser)
Child: 256ae129117f7d538290cb1968efd36104688aa1 (Move libselinux from libmincrypt to BoringSSL.)
libselinux: stop copying headers

Copying headers causes problems for dependency tracking, as any module
can include the copied header without depending on the module. Replace
LOCAL_COPY_HEADERS with LOCAL_EXPORT_C_INCLUDE_DIRS.

Change-Id: Ic3343fc6b8978d59d1ef48ebdb9a96470bb27232

---------------------------------- Android.mk ----------------------------------
index 25baae9..0e0d502 100644
@@ -41,20 +41,18 @@ common_HOST_FILES := \
src/label_support.c


-common_COPY_HEADERS_TO := selinux
-common_COPY_HEADERS := include/selinux/selinux.h include/selinux/label.h include/selinux/context.h include/selinux/avc.h include/selinux/android.h 
-
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(common_SRC_FILES) $(common_HOST_FILES) src/android.c
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
LOCAL_STATIC_LIBRARIES := libmincrypt
-LOCAL_C_INCLUDES := external/pcre
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include external/pcre
LOCAL_WHOLE_STATIC_LIBRARIES := libpcre libpackagelistparser
# 1003 corresponds to auditd, from system/core/logd/event.logtags
LOCAL_CFLAGS := -DAUDITD_LOG_TAG=1003
# mapping.c has redundant check of array p_in->perms.
LOCAL_CLANG_CFLAGS += -Wno-pointer-bool-conversion
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include

include $(BUILD_STATIC_LIBRARY)

@@ -69,22 +67,22 @@ LOCAL_SRC_FILES := $(common_HOST_FILES)
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
LOCAL_WHOLE_STATIC_LIBRARIES := libpcre
-LOCAL_C_INCLUDES := external/pcre
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include external/pcre
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
include $(BUILD_HOST_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(common_SRC_FILES) $(common_HOST_FILES) src/android.c
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
-LOCAL_COPY_HEADERS_TO := $(common_COPY_HEADERS_TO)
-LOCAL_COPY_HEADERS := $(common_COPY_HEADERS)
LOCAL_STATIC_LIBRARIES := libmincrypt
-LOCAL_C_INCLUDES := external/pcre
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include external/pcre
LOCAL_SHARED_LIBRARIES := liblog libpcre libpackagelistparser
# 1003 corresponds to auditd, from system/core/logd/event.logtags
LOCAL_CFLAGS := -DAUDITD_LOG_TAG=1003
# mapping.c has redundant check of array p_in->perms.
LOCAL_CLANG_CFLAGS += -Wno-pointer-bool-conversion
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include

include $(BUILD_SHARED_LIBRARY)

@@ -98,10 +96,9 @@ endif
LOCAL_SRC_FILES := $(common_HOST_FILES)
LOCAL_MODULE:= libselinux
LOCAL_MODULE_TAGS := eng
-LOCAL_COPY_HEADERS_TO := $(common_COPY_HEADERS_TO)
-LOCAL_COPY_HEADERS := $(common_COPY_HEADERS)
LOCAL_WHOLE_STATIC_LIBRARIES := libpcre
-LOCAL_C_INCLUDES := external/pcre
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include external/pcre
+LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
include $(BUILD_HOST_SHARED_LIBRARY)

#################################

 

0 0
原创粉丝点击