This series refactors __constructor_order because
__constructor_order_last() is unneeded.
BTW, the comments in kselftest_harness.h was confusing to me.
As far as I tested, all arches executed constructors in the forward
order.
[test code]
#include <stdio.h>
static int x;
static void __attribute__((constructor)) increment(void)
{
x += 1;
}
static void __attribute__((constructor)) multiply(void)
{
x *= 2;
}
int main(void)
{
printf("foo = %d\n", x);
return 0;
}
It should print 2 for forward order systems, 1 for reverse order systems.
I executed it on some archtes by using QEMU. I always got 2.
Masahiro Yamada (2):
selftests: harness: remove unneeded __constructor_order_last()
selftests: harness: rename __constructor_order for clarification
.../drivers/s390x/uvdevice/test_uvdevice.c | 6 ------
tools/testing/selftests/hid/hid_bpf.c | 6 ------
tools/testing/selftests/kselftest_harness.h | 18 ++++--------------
tools/testing/selftests/rtc/rtctest.c | 7 -------
4 files changed, 4 insertions(+), 33 deletions(-)
--
2.40.1
On Fri, May 17, 2024 at 08:45:04PM +0900, Masahiro Yamada wrote:
>
> This series refactors __constructor_order because
> __constructor_order_last() is unneeded.
>
> BTW, the comments in kselftest_harness.h was confusing to me.
>
> As far as I tested, all arches executed constructors in the forward
> order.
>
> [test code]
>
> #include <stdio.h>
>
> static int x;
>
> static void __attribute__((constructor)) increment(void)
> {
> x += 1;
> }
>
> static void __attribute__((constructor)) multiply(void)
> {
> x *= 2;
> }
>
> int main(void)
> {
> printf("foo = %d\n", x);
> return 0;
> }
>
> It should print 2 for forward order systems, 1 for reverse order systems.
>
> I executed it on some archtes by using QEMU. I always got 2.
IIRC, and it was a long time ago now, it was actually a difference
between libc implementations where I encountered the problem. Maybe
glibc vs Bionic?
-Kees
--
Kees Cook