diff options
author | Etienne Cordonnier <ecordonnier@snap.com> | 2023-03-10 16:49:28 +0100 |
---|---|---|
committer | Khem Raj <raj.khem@gmail.com> | 2023-03-14 09:39:58 -0700 |
commit | b65453d5bc3b4826265188d67942202d8f1035e7 (patch) | |
tree | ffc1824528db8b8190d294851406be13abf849f8 /meta-oe/dynamic-layers/selinux/recipes-devtool | |
parent | b85ae59968f4e7f4872e4766e49b62f191384242 (diff) | |
download | meta-openembedded-contrib-b65453d5bc3b4826265188d67942202d8f1035e7.tar.gz |
android-tools 10: various fixes
- fix img2simg which was broken in the original recipe (wrong rpath and missing linking to libbase)
- remove clang dependency and make it compile with gcc
- fix installation of img2simg and simg2img which was broken in the original recipe
- backport patch https://github.com/nmeum/android-tools/blob/master/patches/adb/0023-Update-usage-of-usbdevfs_urb-to-match-new-kernel-UAP.patch
The license is MIT, so it can be used.
Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Diffstat (limited to 'meta-oe/dynamic-layers/selinux/recipes-devtool')
6 files changed, 325 insertions, 21 deletions
diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/0001-patching-libundwind-to-build-in-yocto-environment.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/0001-patching-libundwind-to-build-in-yocto-environment.patch index f6bea174d8..335f8b0ac8 100644 --- a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/0001-patching-libundwind-to-build-in-yocto-environment.patch +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/0001-patching-libundwind-to-build-in-yocto-environment.patch @@ -40,7 +40,7 @@ index 738b205..ada4ef9 100644 LDFLAGS += -shared -Wl,-soname,$(NAME).so.0 \ -Wl,-rpath=/usr/lib/$(DEB_HOST_MULTIARCH)/android \ - -lpthread -nostdlib -lc -lgcc -Ldebian/out -l7z -+ -lpthread -nostdlib -lc -lgcc -l7z -Wno-error=unused-command-line-argument ++ -lpthread -nostdlib -lc -lgcc -l7z build: $(SOURCES) - mkdir --parents debian/out diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0004-patching-fastboot.mk-to-build-in-yocto-environment.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0004-patching-fastboot.mk-to-build-in-yocto-environment.patch index 82ec560a6a..367e31af22 100644 --- a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0004-patching-fastboot.mk-to-build-in-yocto-environment.patch +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0004-patching-fastboot.mk-to-build-in-yocto-environment.patch @@ -52,12 +52,12 @@ index d1aba626..e75fa87c 100644 build: $(SOURCES) - $(CXX) $^ -o fastboot/$(NAME) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -+ mkdir --parents $(OUT_DIR)/usr/bin/fastboot -+ $(CXX) $^ -o $(OUT_DIR)/usr/bin/fastboot/$(NAME) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) ++ mkdir --parents $(OUT_DIR)/usr/bin/ ++ $(CXX) $^ -o $(OUT_DIR)/usr/bin/$(NAME) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) clean: - $(RM) fastboot/$(NAME) -+ $(RM) $(OUT_DIR)/usr/bin/fastboot/$(NAME) ++ $(RM) $(OUT_DIR)/usr/bin/$(NAME) -- 2.36.1.vfs.0.0 diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0017-Update-usage-of-usbdevfs_urb-to-match-new-kernel-UAP.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0017-Update-usage-of-usbdevfs_urb-to-match-new-kernel-UAP.patch new file mode 100644 index 0000000000..7209e626b7 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0017-Update-usage-of-usbdevfs_urb-to-match-new-kernel-UAP.patch @@ -0,0 +1,128 @@ +From 0dac14385d9c79089f8026e2764b75fa111adb8a Mon Sep 17 00:00:00 2001 +From: Etienne Cordonnier <ecordonnier@snap.com> +Date: Tue, 14 Mar 2023 11:33:50 +0100 +Subject: [PATCH] Update usage of usbdevfs_urb to match new kernel UAPI +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Linux kernel API has been changed by commit 94dfc73e7cf4 ("treewide: uapi: Replace zero-length arrays with flexible-array members") +where zero-length array iso_frame_desc in struct usbdevfs_urb was replaced with a proper flexible-array member. + +Current USB API usage causes a compilation error at Linux 6.0: + +In file included from /home/mae/.cache/kiss/proc/121205/build/android-tools/vendor/adb/client/usb_linux.cpp:28: +/usr/include/linux/usbdevice_fs.h:134:41: error: flexible array member ‘usbdevfs_urb::iso_frame_desc’ not at end of ‘struct usb_handle’ + 134 | struct usbdevfs_iso_packet_desc iso_frame_desc[]; + | ^~~~~~~~~~~~~~ +/home/mae/.cache/kiss/proc/121205/build/android-tools/vendor/adb/client/usb_linux.cpp:76:18: note: next member ‘usbdevfs_urb usb_handle::urb_out’ declared here + 76 | usbdevfs_urb urb_out; + | ^~~~~~~ +/home/mae/.cache/kiss/proc/121205/build/android-tools/vendor/adb/client/usb_linux.cpp:61:8: note: in the definition of ‘struct usb_handle’ + 61 | struct usb_handle { + | ^~~~~~~~~~ + +Fix it by using pointers to a struct with flexible-array members. +Current fix works both with the old and the new API. + +See https://github.com/nmeum/android-tools/issues/74 for more context. + +Tested: built on Linux against kernel 5.19 and 6.0; 'adb shell' over USB +cable +Acked-by: Gustavo A. R. Silva gustavoars@kernel.org +Change-Id: I7f0f7b35d9a3ab980d3520b541b60c7857a6b101 +Signed-off-by: Anatol Pomozov <anatol.pomozov@gmail.com> + +[Backported on version 10] +Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com> +--- + adb/client/usb_linux.cpp | 24 ++++++++++++++---------- + 1 file changed, 14 insertions(+), 10 deletions(-) + +diff --git a/adb/client/usb_linux.cpp b/adb/client/usb_linux.cpp +index 81b83064..7d55ec5b 100644 +--- a/adb/client/usb_linux.cpp ++++ b/adb/client/usb_linux.cpp +@@ -71,8 +71,8 @@ struct usb_handle : public ::usb_handle { + unsigned zero_mask; + unsigned writeable = 1; + +- usbdevfs_urb urb_in; +- usbdevfs_urb urb_out; ++ usbdevfs_urb *urb_in; ++ usbdevfs_urb *urb_out; + + bool urb_in_busy = false; + bool urb_out_busy = false; +@@ -305,7 +305,7 @@ static int usb_bulk_write(usb_handle* h, const void* data, int len) { + std::unique_lock<std::mutex> lock(h->mutex); + D("++ usb_bulk_write ++"); + +- usbdevfs_urb* urb = &h->urb_out; ++ usbdevfs_urb* urb = h->urb_out; + memset(urb, 0, sizeof(*urb)); + urb->type = USBDEVFS_URB_TYPE_BULK; + urb->endpoint = h->ep_out; +@@ -344,7 +344,7 @@ static int usb_bulk_read(usb_handle* h, void* data, int len) { + std::unique_lock<std::mutex> lock(h->mutex); + D("++ usb_bulk_read ++"); + +- usbdevfs_urb* urb = &h->urb_in; ++ usbdevfs_urb* urb = h->urb_in; + memset(urb, 0, sizeof(*urb)); + urb->type = USBDEVFS_URB_TYPE_BULK; + urb->endpoint = h->ep_in; +@@ -389,7 +389,7 @@ static int usb_bulk_read(usb_handle* h, void* data, int len) { + } + D("[ urb @%p status = %d, actual = %d ]", out, out->status, out->actual_length); + +- if (out == &h->urb_in) { ++ if (out == h->urb_in) { + D("[ reap urb - IN complete ]"); + h->urb_in_busy = false; + if (urb->status != 0) { +@@ -398,7 +398,7 @@ static int usb_bulk_read(usb_handle* h, void* data, int len) { + } + return urb->actual_length; + } +- if (out == &h->urb_out) { ++ if (out == h->urb_out) { + D("[ reap urb - OUT compelete ]"); + h->urb_out_busy = false; + h->cv.notify_all(); +@@ -483,10 +483,10 @@ void usb_kick(usb_handle* h) { + ** but this ensures that a reader blocked on REAPURB + ** will get unblocked + */ +- ioctl(h->fd, USBDEVFS_DISCARDURB, &h->urb_in); +- ioctl(h->fd, USBDEVFS_DISCARDURB, &h->urb_out); +- h->urb_in.status = -ENODEV; +- h->urb_out.status = -ENODEV; ++ ioctl(h->fd, USBDEVFS_DISCARDURB, h->urb_in); ++ ioctl(h->fd, USBDEVFS_DISCARDURB, h->urb_out); ++ h->urb_in->status = -ENODEV; ++ h->urb_out->status = -ENODEV; + h->urb_in_busy = false; + h->urb_out_busy = false; + h->cv.notify_all(); +@@ -502,6 +502,8 @@ int usb_close(usb_handle* h) { + + D("-- usb close %p (fd = %d) --", h, h->fd); + ++ delete h->urb_in; ++ delete h->urb_out; + delete h; + + return 0; +@@ -537,6 +539,8 @@ static void register_device(const char* dev_name, const char* dev_path, unsigned + usb->ep_out = ep_out; + usb->zero_mask = zero_mask; + usb->max_packet_size = max_packet_size; ++ usb->urb_in = new usbdevfs_urb; ++ usb->urb_out = new usbdevfs_urb; + + // Initialize mark so we don't get garbage collected after the device scan. + usb->mark = true; +-- +2.36.1.vfs.0.0 + diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0018-img2simg-Fix-wrong-rpath.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0018-img2simg-Fix-wrong-rpath.patch new file mode 100644 index 0000000000..5f28263022 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0018-img2simg-Fix-wrong-rpath.patch @@ -0,0 +1,26 @@ +From 25bd3456dcd539b89648273152e405314287f4f8 Mon Sep 17 00:00:00 2001 +From: Etienne Cordonnier <ecordonnier@snap.com> +Date: Mon, 13 Mar 2023 13:46:14 +0100 +Subject: [PATCH 2/2] img2simg: Fix wrong rpath and re-add libbase + +Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com> +--- + debian/img2simg.mk | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/debian/img2simg.mk b/debian/img2simg.mk +index d1b9b927..459af454 100644 +--- a/debian/img2simg.mk ++++ b/debian/img2simg.mk +@@ -3,7 +3,7 @@ NAME = img2simg + SOURCES = img2simg.cpp + SOURCES := $(foreach source, $(SOURCES), libsparse/$(source)) + CPPFLAGS += -Ilibsparse/include -Iinclude -std=gnu++17 +-LDFLAGS += -Wl,-rpath=$(OUT_DIR)/usr/lib/$(DEB_HOST_MULTIARCH)/android \ ++LDFLAGS += -Wl,-rpath='$$ORIGIN/../lib/android' -lbase \ + -Wl,-rpath-link=$(OUT_DIR)/usr/lib/$(DEB_HOST_MULTIARCH)/android/ \ + -L$(OUT_DIR)/usr/lib/$(DEB_HOST_MULTIARCH)/android/ -lsparse + +-- +2.36.1.vfs.0.0 + diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0019-Fix-compilation-with-gcc.patch b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0019-Fix-compilation-with-gcc.patch new file mode 100644 index 0000000000..033c5fb919 --- /dev/null +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools/core/0019-Fix-compilation-with-gcc.patch @@ -0,0 +1,157 @@ +From d198ecb4c36b645e5428aa5117f7673bf2f7a3e6 Mon Sep 17 00:00:00 2001 +From: Etienne Cordonnier <ecordonnier@snap.com> +Date: Tue, 14 Mar 2023 11:42:08 +0100 +Subject: [PATCH] Fix compilation with gcc + +Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com> +--- + adb/adb_listeners.cpp | 18 ++++++++++++------ + adb/daemon/auth.cpp | 3 ++- + adb/daemon/usb.cpp | 3 ++- + adb/fdevent.cpp | 3 ++- + adb/transport_fd.cpp | 3 ++- + adb/transport_local.cpp | 3 ++- + 6 files changed, 22 insertions(+), 11 deletions(-) + +diff --git a/adb/adb_listeners.cpp b/adb/adb_listeners.cpp +index 29909a55..fbdf4487 100644 +--- a/adb/adb_listeners.cpp ++++ b/adb/adb_listeners.cpp +@@ -109,7 +109,8 @@ static void listener_event_func(int _fd, unsigned ev, void* _l) + } + + // Called as a transport disconnect function. |arg| is the raw alistener*. +-static void listener_disconnect(void* arg, atransport*) EXCLUDES(listener_list_mutex) { ++ EXCLUDES(listener_list_mutex) ++static void listener_disconnect(void* arg, atransport*) { + std::lock_guard<std::mutex> lock(listener_list_mutex); + for (auto iter = listener_list.begin(); iter != listener_list.end(); ++iter) { + if (iter->get() == arg) { +@@ -121,7 +122,8 @@ static void listener_disconnect(void* arg, atransport*) EXCLUDES(listener_list_m + } + + // Write the list of current listeners (network redirections) into a string. +-std::string format_listeners() EXCLUDES(listener_list_mutex) { ++EXCLUDES(listener_list_mutex) ++std::string format_listeners() { + std::lock_guard<std::mutex> lock(listener_list_mutex); + std::string result; + for (auto& l : listener_list) { +@@ -139,8 +141,9 @@ std::string format_listeners() EXCLUDES(listener_list_mutex) { + return result; + } + ++EXCLUDES(listener_list_mutex) + InstallStatus remove_listener(const char* local_name, atransport* transport) +- EXCLUDES(listener_list_mutex) { ++{ + std::lock_guard<std::mutex> lock(listener_list_mutex); + for (auto iter = listener_list.begin(); iter != listener_list.end(); ++iter) { + if (local_name == (*iter)->local_name) { +@@ -151,7 +154,8 @@ InstallStatus remove_listener(const char* local_name, atransport* transport) + return INSTALL_STATUS_LISTENER_NOT_FOUND; + } + +-void remove_all_listeners() EXCLUDES(listener_list_mutex) { ++EXCLUDES(listener_list_mutex) ++void remove_all_listeners() { + std::lock_guard<std::mutex> lock(listener_list_mutex); + auto iter = listener_list.begin(); + while (iter != listener_list.end()) { +@@ -164,7 +168,8 @@ void remove_all_listeners() EXCLUDES(listener_list_mutex) { + } + } + +-void close_smartsockets() EXCLUDES(listener_list_mutex) { ++EXCLUDES(listener_list_mutex) ++void close_smartsockets() { + std::lock_guard<std::mutex> lock(listener_list_mutex); + auto pred = [](const std::unique_ptr<alistener>& listener) { + return listener->local_name == "*smartsocket*"; +@@ -172,9 +177,10 @@ void close_smartsockets() EXCLUDES(listener_list_mutex) { + listener_list.remove_if(pred); + } + ++EXCLUDES(listener_list_mutex) + InstallStatus install_listener(const std::string& local_name, const char* connect_to, + atransport* transport, int no_rebind, int* resolved_tcp_port, +- std::string* error) EXCLUDES(listener_list_mutex) { ++ std::string* error) { + std::lock_guard<std::mutex> lock(listener_list_mutex); + for (auto& l : listener_list) { + if (local_name == l->local_name) { +diff --git a/adb/daemon/auth.cpp b/adb/daemon/auth.cpp +index a18afa4e..0fd60a1f 100644 +--- a/adb/daemon/auth.cpp ++++ b/adb/daemon/auth.cpp +@@ -98,8 +98,9 @@ bool adbd_auth_verify(const char* token, size_t token_size, const std::string& s + return false; + } + ++REQUIRES(framework_mutex) + static bool adbd_send_key_message_locked(std::string_view msg_type, std::string_view key) +- REQUIRES(framework_mutex) { ++{ + if (framework_fd < 0) { + LOG(ERROR) << "Client not connected to send msg_type " << msg_type; + return false; +diff --git a/adb/daemon/usb.cpp b/adb/daemon/usb.cpp +index 1abae87c..3a466782 100644 +--- a/adb/daemon/usb.cpp ++++ b/adb/daemon/usb.cpp +@@ -628,7 +628,8 @@ struct UsbFfsConnection : public Connection { + return CreateWriteBlock(std::move(block), 0, len, id); + } + +- void SubmitWrites() REQUIRES(write_mutex_) { ++ REQUIRES(write_mutex_) ++ void SubmitWrites() { + if (writes_submitted_ == kUsbWriteQueueDepth) { + return; + } +diff --git a/adb/fdevent.cpp b/adb/fdevent.cpp +index 32f90863..bff24544 100644 +--- a/adb/fdevent.cpp ++++ b/adb/fdevent.cpp +@@ -376,7 +376,8 @@ static void fdevent_call_fdfunc(fdevent* fde) { + fde->func); + } + +-static void fdevent_run_flush() EXCLUDES(run_queue_mutex) { ++EXCLUDES(run_queue_mutex) ++static void fdevent_run_flush() { + // We need to be careful around reentrancy here, since a function we call can queue up another + // function. + while (true) { +diff --git a/adb/transport_fd.cpp b/adb/transport_fd.cpp +index a93e68a0..c5af09ff 100644 +--- a/adb/transport_fd.cpp ++++ b/adb/transport_fd.cpp +@@ -168,7 +168,8 @@ struct NonblockingFdConnection : public Connection { + TryAgain, + }; + +- WriteResult DispatchWrites() REQUIRES(write_mutex_) { ++ REQUIRES(write_mutex_) ++ WriteResult DispatchWrites() { + CHECK(!write_buffer_.empty()); + auto iovs = write_buffer_.iovecs(); + ssize_t rc = adb_writev(fd_.get(), iovs.data(), iovs.size()); +diff --git a/adb/transport_local.cpp b/adb/transport_local.cpp +index b9f738df..a273e8f7 100644 +--- a/adb/transport_local.cpp ++++ b/adb/transport_local.cpp +@@ -345,8 +345,9 @@ struct EmulatorConnection : public FdConnection { + }; + + /* Only call this function if you already hold local_transports_lock. */ ++REQUIRES(local_transports_lock) + static atransport* find_emulator_transport_by_adb_port_locked(int adb_port) +- REQUIRES(local_transports_lock) { ++{ + auto it = local_transports.find(adb_port); + if (it == local_transports.end()) { + return nullptr; +-- +2.36.1.vfs.0.0 + diff --git a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools_10.0.0.r36.bb b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools_10.0.0.r36.bb index cf81afe14f..6fc2532981 100644 --- a/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools_10.0.0.r36.bb +++ b/meta-oe/dynamic-layers/selinux/recipes-devtool/android-tools/android-tools_10.0.0.r36.bb @@ -58,7 +58,7 @@ SRC_URI += " \ file://libunwind-debian/20150704-CVE-2015-3239_dwarf_i.h.patch;patchdir=external/libunwind \ " -# meta-clang specific patches + files: +# meta-openembedded specific patches + files: SRC_URI += " \ file://core/0001-patching-adb.mk-to-build-in-yocto-environment.patch;patchdir=system/core \ file://core/0002-libadb.mk-modifications-to-make-it-build-in-yocto-en.patch;patchdir=system/core \ @@ -76,6 +76,9 @@ SRC_URI += " \ file://core/0014-patching-libbacktrace.mk-to-build-in-yocto-environme.patch;patchdir=system/core \ file://core/0015-Use-namespace-std-to-compile-libbacktrace.patch;patchdir=system/core \ file://core/0016-Adapt-adbd-to-work-with-yocto.patch;patchdir=system/core \ + file://core/0017-Update-usage-of-usbdevfs_urb-to-match-new-kernel-UAP.patch;patchdir=system/core \ + file://core/0018-img2simg-Fix-wrong-rpath.patch;patchdir=system/core \ + file://core/0019-Fix-compilation-with-gcc.patch;patchdir=system/core \ file://0001-libcrypto.mk-modifications-to-make-it-build-in-yocto.patch;patchdir=external/boringssl \ file://0001-patching-libundwind-to-build-in-yocto-environment.patch;patchdir=external/libunwind \ file://0001-libext4_utils.mk-modifications-to-make-it-build-in-y.patch;patchdir=system/extras \ @@ -96,14 +99,7 @@ COMPATIBLE_HOST:powerpc = "(null)" COMPATIBLE_HOST:powerpc64 = "(null)" COMPATIBLE_HOST:powerpc64le = "(null)" -inherit systemd clang - -TOOLCHAIN = "clang" -TOOLCHAIN:class-native = "clang" -DEPENDS:append:class-target = "\ - clang-cross-${TARGET_ARCH} \ -" -DEPENDS:append:class-native = " clang-native" +inherit systemd SYSTEMD_SERVICE:${PN} = "android-tools-adbd.service" @@ -175,9 +171,11 @@ do_compile() { } do_install() { - if echo ${TOOLS_TO_BUILD} | grep -q "ext4_utils" ; then - install -D -p -m0755 ${S}/system/core/libsparse/simg_dump.py ${D}${bindir}/simg_dump - fi + for tool in img2simg simg2img fastboot; do + if echo ${TOOLS_TO_BUILD} | grep -q "$tool" ; then + install -D -p -m0755 ${S}/debian/out/usr/bin/$tool ${D}${bindir}/$tool + fi + done if echo ${TOOLS_TO_BUILD} | grep -q "adb " ; then install -d ${D}${bindir} @@ -193,11 +191,6 @@ do_install() { install -D -p -m0644 ${WORKDIR}/android-tools-adbd.service \ ${D}${systemd_unitdir}/system/android-tools-adbd.service - if echo ${TOOLS_TO_BUILD} | grep -q "fastboot" ; then - install -d ${D}${bindir} - install -m0755 ${S}/debian/out/usr/bin/fastboot/fastboot ${D}${bindir} - fi - install -d ${D}${libdir}/android/ install -m0755 ${S}/debian/out/usr/lib/android/*.so.* ${D}${libdir}/android/ if echo ${TOOLS_TO_BUILD} | grep -q "mkbootimg" ; then |