Re: [PATCH 1/5] selftests: Add futex functional tests

From: John Stultz
Date: Mon May 11 2015 - 19:23:11 EST


On Mon, May 11, 2015 at 4:07 PM, Darren Hart <dvhart@xxxxxxxxxxxxxxx> wrote:
> On 5/11/15, 3:21 PM, "Shuah Khan" <shuahkh@xxxxxxxxxxxxxxx> wrote:
>
>>>>>No need for a new pull request. Have you seen these errors before:
>>>>>
>>>>>make[2]: Entering directory
>>>>>'/mnt/data/lkml/linux-kselftest/tools/testing/selftests/futex'
>>>>>for DIR in functional; do make -C $DIR all ; done
>>>>>make[3]: Entering directory
>>>>>'/mnt/data/lkml/linux-kselftest/tools/testing/selftests/futex/functiona
>>>>>l'
>>>>>gcc -g -O2 -Wall -D_GNU_SOURCE -I../include -I../../ -lpthread -lrt
>>>>>futex_requeue_pi.c ../include/futextest.h -o futex_requeue_pi
>>>>>/tmp/cc2UgUVs.o: In function `create_rt_thread':
>>>>>/mnt/data/lkml/linux-kselftest/tools/testing/selftests/futex/functional
>>>>>/fu
>>>>>tex_requeue_pi.c:102:
>>>>>undefined reference to `pthread_create'
>>>>>/tmp/cc2UgUVs.o: In function `unit_test':
>>>>>/mnt/data/lkml/linux-kselftest/tools/testing/selftests/futex/functional
>>>>>/fu
>>>>>tex_requeue_pi.c:342:
>>>>>undefined reference to `pthread_join'
>>>>>/mnt/data/lkml/linux-kselftest/tools/testing/selftests/futex/functional
>>>>>/fu
>>>>>tex_requeue_pi.c:347:
>>>>>undefined reference to `pthread_join'
>>>>>/mnt/data/lkml/linux-kselftest/tools/testing/selftests/futex/functional
>>>>>/fu
>>>>>tex_requeue_pi.c:346:
>>>>>undefined reference to `pthread_join'
>>>>>collect2: error: ld returned 1 exit status
>>>>><builtin>: recipe for target 'futex_requeue_pi' failed
>>>>>make[3]: *** [futex_requeue_pi] Error 1
>>>>>make[3]: Leaving directory
>>>>>'/mnt/data/lkml/linux-kselftest/tools/testing/selftests/futex/functiona
>>>>>l'
>>>>>Makefile:7: recipe for target 'all' failed
>>>>>
>>>>>I am running make kselftest target when I saw the above build failures.
>>>>>kselftest run doesn't fail which is good, however futex tests won't
>>>>>run with this failure.
>>>>
>>>>I have not seen these errors whilst developing with futextest for the
>>>>kernel. That looks like you may be missing the pthread development
>>>>headers
>>>>from your build machine.
>>>>
>>>>Those are provided by libc6-dev on my Debian systems.
>>>>
>>>I do have lib6-dev installed. timers uses pthread compiles fine.
>>>So does mqueue. I am not sure what is going on with futex tests
>>>though. I am guessing it has to do with library link order.
>>>The following fixed it for me:
>>>-LDFLAGS := $(LDFLAGS) -lpthread -lrt
>>>+LDFLAGS := $(LDFLAGS) -pthread -lrt
>>>Could you please make this change and resend the patch series.
>>>I prefer patch series over pull request.
>>>thanks,
>>>-- Shuah
>>
>>Sorry full diff:
>>
>>
>>diff --git a/tools/testing/selftests/futex/functional/Makefile
>>b/tools/testing/selftests/futex/functional/Makefile
>>index e64d43b..b8a2e9b 100644
>>--- a/tools/testing/selftests/futex/functional/Makefile
>>+++ b/tools/testing/selftests/futex/functional/Makefile
>>@@ -1,6 +1,6 @@
>>INCLUDES := -I../include -I../../
>>CFLAGS := $(CFLAGS) -g -O2 -Wall -D_GNU_SOURCE $(INCLUDES)
>>-LDFLAGS := $(LDFLAGS) -lpthread -lrt
>>+LDFLAGS := $(LDFLAGS) -pthread -lrt
>
>
> I'm happy to do that, but I would like to make sure I'm doing the right
> thing.
>
> I'm building with:
> $ gcc --version
> gcc (Debian 4.9.2-10) 4.9.2
>
>
> What's there now works for me:
> LDFLAGS := $(LDFLAGS) -lpthread -lrt
>
>
> What you propose also works for me:
> LDFLAGS := $(LDFLAGS) -pthread -lrt
>
>
> I notice that most other test cases list -lrt first, including timers:
> LDFLAGS += -lrt -lpthread
>
> Which works for me for timers - does that work for you? I assume so. It
> also works for futexes for me. I've found references out there suggesting
> -lrt should always come before -lpthread.
>
> I suspect you are correct as -pthread provides flags for both the
> preprocessor and the linker, however, I'm still concerned about the
> ordering.
>
> John - did you deliberately choose to use "-lrt -lpthread" ?

Ooof. Possibly, but I can't say I really recall at this point.

I do remember somewhere around gcc 4.6 I had to change things around
since the linker arguments had to be at the end of the gcc string
(where as before I was throwing them in w/ the CFLAGS). I think it
was then I added the "-Wl,-no-as-needed" bit after googling around.
You might look at that as well?

Sorry I'm not of much help.
-john
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/