Re: [PATCH v2 2/4] selftests: Fix seccomp to support relocatable build (O=objdir)

From: Shuah Khan
Date: Tue Mar 10 2020 - 19:11:52 EST


On 3/5/20 10:42 AM, Kees Cook wrote:
On Thu, Mar 05, 2020 at 09:41:34AM -0700, Shuah Khan wrote:
On 3/4/20 7:20 PM, Kees Cook wrote:
Instead of the TEST_CUSTOM_PROGS+all dance, you can just add an explicit
dependency, with the final seccomp/Makefile looking like this:


# SPDX-License-Identifier: GPL-2.0
CFLAGS += -Wl,-no-as-needed -Wall
LDFLAGS += -lpthread

TEST_GEN_PROGS := seccomp_bpf seccomp_benchmark


TEST_CUSTOM_PROGS is for differentiating test programs that
can't use lib.mk generic rules. It is appropriate to use
for seccomp_bpf

I don't follow? This suggested Makefile works for me (i.e. it can use
the lib.mk generic rules since CFLAGS and LDFLAGS can be customized
first, and it just adds an additional dependency).


Yeah. TEST_CUSTOM_PROGS isn't really needed for this custom case.
I can refine it and get rid of the dependency.

include ../lib.mk

# Additional dependencies
$(OUTPUT)/seccomp_bpf: ../kselftest_harness.h

BTW, I see a lot of other targets that use kselftest_harness.h appear to
be missing this Makefile dependency, but that's a different problem. :)

(Though this fails in the same way as above when run from the top-level
directory.)


I didn't see this because I have been the same directory I used
for relocated cross-build kernel. :(

Thanks for testing this. I know the problem here. all is a dependency
for install step and $(OUTPUT) is referencing the objdir before it
gets created. It is a Makefile/lib.mk problem to fix.


I was way off with my analysis. :(

I will do a separate patch for this. This will show up in any test
that is using $(OUTPUT) to relocate objects mainly the ones that
require custom build rule like seeccomp.

Okay, cool. It looked to me like it lost track of the top level source
directory (i.e. "make: entering $output" ... "can't find
../other/files")


Odd that you would have empty objdir in the cross-compile case.

In the cross-compile case, you would have cross-built kernel first in
the object directory. Your objdir won't be empty.

This is no different from kselftest build dependency on kernel build
even when srcdir=objdir

So for cross-build case, the following is the workflow to build kernel
first and then the tests:

make O=/../objdir ARCH=arm64 HOSTCC=gcc CROSS_COMPILE=aarch64-linux-gnu- defconfig

make O=/../objdir ARCH=arm64 HOSTCC=gcc CROSS_COMPILE=aarch64-linux-gnu- all

make kselftest-install O=/../objdir ARCH=arm64 HOSTCC=gcc CROSS_COMPILE=aarch64-linux-gnu- TARGETS=seccomp

You can isolate a single test when you are do native build:

make kselftest-install O=/../objdir TARGETS=seccomp

The above won't fail even if objdir doesn't exist and/or empty.

thanks,
-- Shuah