From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi1-x230.google.com (mail-oi1-x230.google.com [IPv6:2607:f8b0:4864:20::230]) by sourceware.org (Postfix) with ESMTPS id 525733857C50 for ; Wed, 20 Apr 2022 17:24:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 525733857C50 Received: by mail-oi1-x230.google.com with SMTP id e189so2799532oia.8 for ; Wed, 20 Apr 2022 10:24:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to :content-transfer-encoding; bh=GBKV+3lhWoPFbFoUnsoLv4KELCtHv/RSFtj1HFxUt+Y=; b=pPGUBSp5EzMJxOZTg1yUcG/qEcvArSYQx4s1r79+qrajcng6b+61eIr4tL9cLgqNhL 0kHD6o973gQrnZRJPMYPDRKbw+vY4MoQGc1M+8BvxTHvhwFLPgjuYYNBKBdVgskDWsEg dEdOjxbwOX9YB0mtTKzukOOB5YZCT5TuZ18YksQB5bXSlJiHfCginJHV782Ri2//VqY3 tx9f8MVqNHhVYTtbGudK32u8U3Fb8FzeDTcbnaSI2Yb1GOjT9SR7JWqXMEWHFzSNEBg+ hokQZBXTah0K/6EzQxOf7XIxwxUN6n2e87sBw61gPwD2ihsBO6brKJsScg+YqSq5Qift RENA== X-Gm-Message-State: AOAM533EfXX5zJIV+bQGnGwcQhHRjObPyRrbhqUFzavUiKynGL63Px0r 6t93IOI96o8ccULkp3nT0fQR8GkETXh06w== X-Google-Smtp-Source: ABdhPJzczrAb40ffSMUEM05XKlPwgjjM5oFQx3N+ZUhMQgRwjDXCCgGvv/muusNzP9sSvUCjhJ/B/A== X-Received: by 2002:a05:6808:1483:b0:322:f3b5:5418 with SMTP id e3-20020a056808148300b00322f3b55418mr1243791oiw.90.1650475464222; Wed, 20 Apr 2022 10:24:24 -0700 (PDT) Received: from ?IPV6:2804:431:c7ca:c9d0:24b1:bd98:2ef4:714c? ([2804:431:c7ca:c9d0:24b1:bd98:2ef4:714c]) by smtp.gmail.com with ESMTPSA id q6-20020a056870028600b000d9be0ee766sm178974oaf.57.2022.04.20.10.24.22 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 20 Apr 2022 10:24:23 -0700 (PDT) Message-ID: Date: Wed, 20 Apr 2022 14:24:21 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.0 Subject: Re: [PATCH v10 5/7] elf: Add more DT_RELR tests Content-Language: en-US To: "H.J. Lu" , libc-alpha@sourceware.org References: <20220414232129.1886210-1-hjl.tools@gmail.com> <20220414232129.1886210-6-hjl.tools@gmail.com> From: Adhemerval Zanella In-Reply-To: <20220414232129.1886210-6-hjl.tools@gmail.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-14.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, URIBL_BLACK autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Apr 2022 17:24:27 -0000 On 14/04/2022 20:21, H.J. Lu wrote: > Verify that: > > 1. A DT_RELR shared library without DT_NEEDED works. > 2. A DT_RELR shared library without DT_VERNEED works. > 3. A DT_RELR shared library without libc.so on DT_NEEDED works. LGTM, thanks. Reviewed-by: Adhemerval Zanella > --- > elf/Makefile | 71 ++++++++++++++++++++++++++++++++++++++++-- > elf/tst-relr-mod2.c | 46 +++++++++++++++++++++++++++ > elf/tst-relr-mod3a.c | 49 +++++++++++++++++++++++++++++ > elf/tst-relr-mod3b.c | 22 +++++++++++++ > elf/tst-relr-mod4a.c | 19 +++++++++++ > elf/tst-relr-mod4b.c | 19 +++++++++++ > elf/tst-relr-mod4b.map | 3 ++ > elf/tst-relr2.c | 27 ++++++++++++++++ > elf/tst-relr3.c | 27 ++++++++++++++++ > elf/tst-relr4.c | 1 + > 10 files changed, 281 insertions(+), 3 deletions(-) > create mode 100644 elf/tst-relr-mod2.c > create mode 100644 elf/tst-relr-mod3a.c > create mode 100644 elf/tst-relr-mod3b.c > create mode 100644 elf/tst-relr-mod4a.c > create mode 100644 elf/tst-relr-mod4b.c > create mode 100644 elf/tst-relr-mod4b.map > create mode 100644 elf/tst-relr2.c > create mode 100644 elf/tst-relr3.c > create mode 100644 elf/tst-relr4.c > > diff --git a/elf/Makefile b/elf/Makefile > index 3f3e711dd2..07ac9ec3ef 100644 > --- a/elf/Makefile > +++ b/elf/Makefile > @@ -544,7 +544,20 @@ endif > ifeq ($(have-dt-relr),yes) > tests += \ > tst-relr \ > + tst-relr2 \ > + tst-relr3 \ > + tst-relr4 \ > # tests > +modules-names-dt-relr = \ > + tst-relr-mod2 \ > + tst-relr-mod3a \ > + tst-relr-mod3b \ > + tst-relr-mod4a \ > + tst-relr-mod4b \ > +# modules-names-dt-relr > +modules-names += $(modules-names-dt-relr) > +# These shared libraries have special build rules. > +modules-names-nobuild += $(modules-names-dt-relr) > ifeq ($(have-fpie),yes) > tests += \ > tst-relr-pie \ > @@ -603,7 +616,7 @@ test-extras += \ > tst-tlsmod17a \ > tst-tlsmod18a \ > # test-extras > -modules-names = \ > +modules-names += \ > circlemod1 \ > circlemod1a \ > circlemod2 \ > @@ -973,8 +986,13 @@ extra-test-objs += $(addsuffix .os,$(strip $(modules-names))) > > # filtmod1.so, tst-big-note-lib.so, tst-ro-dynamic-mod.so have special > # rules. > -modules-names-nobuild := filtmod1 tst-big-note-lib tst-ro-dynamic-mod \ > - tst-audit24bmod1 tst-audit24bmod2 > +modules-names-nobuild += \ > + filtmod1 \ > + tst-audit24bmod1 \ > + tst-audit24bmod2 \ > + tst-big-note-lib \ > + tst-ro-dynamic-mod \ > +# modules-names-nobuild > > tests += $(tests-static) > Ok. > @@ -2768,3 +2786,50 @@ $(objpfx)check-tst-relr-pie.out: $(objpfx)tst-relr-pie > | sed -ne '/required from libc.so/,$$ p' \ > | grep GLIBC_ABI_DT_RELR > $@; \ > $(evaluate-test) > + > +# The test checks if a DT_RELR shared library without DT_NEEDED works as > +# intended, so it uses an explicit link rule. > +$(objpfx)tst-relr2: $(objpfx)tst-relr-mod2.so > +$(objpfx)tst-relr-mod2.so: $(objpfx)tst-relr-mod2.os > + $(LINK.o) -nostdlib -nostartfiles -Wl,-z,pack-relative-relocs \ > + $(LDFLAGS-soname-fname) \ > + -shared -o $@.new $(filter-out $(map-file),$^) > + $(call after-link,$@.new) > + mv -f $@.new $@ > + > +# The test checks if a DT_RELR shared library without DT_VERNEED works as > +# intended, so it uses an explicit link rule. > +$(objpfx)tst-relr3: $(objpfx)tst-relr-mod3a.so > +$(objpfx)tst-relr-mod3b.so: $(objpfx)tst-relr-mod3b.os > + $(LINK.o) -nostdlib -nostartfiles -Wl,-z,pack-relative-relocs \ > + $(LDFLAGS-soname-fname) \ > + -shared -o $@.new $(filter-out $(map-file),$^) > + $(call after-link,$@.new) > + mv -f $@.new $@ > + > +$(objpfx)tst-relr-mod3a.so: $(objpfx)tst-relr-mod3a.os \ > + $(objpfx)tst-relr-mod3b.so > + $(LINK.o) -nostdlib -nostartfiles -Wl,-z,pack-relative-relocs \ > + $(LDFLAGS-soname-fname) \ > + -shared -o $@.new $(filter-out $(map-file),$^) > + $(call after-link,$@.new) > + mv -f $@.new $@ > + > +# The test checks if a DT_RELR shared library without libc.so on DT_NEEDED > +# works as intended, so it uses an explicit link rule. > +$(objpfx)tst-relr4: $(objpfx)tst-relr-mod4a.so > +$(objpfx)tst-relr-mod4b.so: $(objpfx)tst-relr-mod4b.os > + $(LINK.o) -nostdlib -nostartfiles -Wl,-z,pack-relative-relocs \ > + $(LDFLAGS-soname-fname) \ > + -Wl,--version-script=tst-relr-mod4b.map \ > + -shared -o $@.new $(filter-out $(map-file),$^) > + $(call after-link,$@.new) > + mv -f $@.new $@ > + > +$(objpfx)tst-relr-mod4a.so: $(objpfx)tst-relr-mod4a.os \ > + $(objpfx)tst-relr-mod4b.so > + $(LINK.o) -nostdlib -nostartfiles -Wl,-z,pack-relative-relocs \ > + $(LDFLAGS-soname-fname) \ > + -shared -o $@.new $(filter-out $(map-file),$^) > + $(call after-link,$@.new) > + mv -f $@.new $@ Ok. > diff --git a/elf/tst-relr-mod2.c b/elf/tst-relr-mod2.c > new file mode 100644 > index 0000000000..dc0a63365c > --- /dev/null > +++ b/elf/tst-relr-mod2.c > @@ -0,0 +1,46 @@ > +/* Test for DT_RELR in a shared library without DT_NEEDED. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > + > +static int o, x; > + > +#define ELEMS O O O O O O O O X X X X X X X O O X O O X X X E X E E O X O E > +#define E 0, > + > +#define O &o, > +#define X &x, > +void *arr[] = { ELEMS }; > +#undef O > +#undef X > + > +#define O 1, > +#define X 2, > +static char val[] = { ELEMS }; > + > +int > +foo (void) > +{ > + int err = 0; > + for (int i = 0; i < array_length (arr); i++) > + if (!((arr[i] == 0 && val[i] == 0) > + || (arr[i] == &o && val[i] == 1) > + || (arr[i] == &x && val[i] == 2))) > + err++; > + return err; > +} > diff --git a/elf/tst-relr-mod3a.c b/elf/tst-relr-mod3a.c > new file mode 100644 > index 0000000000..d1621c91b1 > --- /dev/null > +++ b/elf/tst-relr-mod3a.c > @@ -0,0 +1,49 @@ > +/* Test for DT_RELR in a shared library without DT_VERNEED. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include > + > +static int o, x; > + > +#define ELEMS O O O O O O O O X X X X X X X O O X O O X X X E X E E O X O E > +#define E 0, > + > +#define O &o, > +#define X &x, > +void *arr[] = { ELEMS }; > +#undef O > +#undef X > + > +#define O 1, > +#define X 2, > +static char val[] = { ELEMS }; > + > +extern void bar (void); > + > +int > +foo (void) > +{ > + int err = 0; > + for (int i = 0; i < array_length (arr); i++) > + if (!((arr[i] == 0 && val[i] == 0) > + || (arr[i] == &o && val[i] == 1) > + || (arr[i] == &x && val[i] == 2))) > + err++; > + bar (); > + return err; > +} > diff --git a/elf/tst-relr-mod3b.c b/elf/tst-relr-mod3b.c > new file mode 100644 > index 0000000000..544cb4bc05 > --- /dev/null > +++ b/elf/tst-relr-mod3b.c > @@ -0,0 +1,22 @@ > +/* Test for DT_RELR in a shared library without DT_VERNEED. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +void > +bar (void) > +{ > +} > diff --git a/elf/tst-relr-mod4a.c b/elf/tst-relr-mod4a.c > new file mode 100644 > index 0000000000..e1bfebd4ac > --- /dev/null > +++ b/elf/tst-relr-mod4a.c > @@ -0,0 +1,19 @@ > +/* Test for DT_RELR in a shared library without libc.so on DT_NEEDED. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include "tst-relr-mod3a.c" > diff --git a/elf/tst-relr-mod4b.c b/elf/tst-relr-mod4b.c > new file mode 100644 > index 0000000000..617dff79c3 > --- /dev/null > +++ b/elf/tst-relr-mod4b.c > @@ -0,0 +1,19 @@ > +/* Test for DT_RELR in a shared library without libc.so on DT_NEEDED. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +#include "tst-relr-mod3b.c" > diff --git a/elf/tst-relr-mod4b.map b/elf/tst-relr-mod4b.map > new file mode 100644 > index 0000000000..7f02247262 > --- /dev/null > +++ b/elf/tst-relr-mod4b.map > @@ -0,0 +1,3 @@ > +DT_RELR { > + global: bar; > +}; > diff --git a/elf/tst-relr2.c b/elf/tst-relr2.c > new file mode 100644 > index 0000000000..10d77f1791 > --- /dev/null > +++ b/elf/tst-relr2.c > @@ -0,0 +1,27 @@ > +/* Test for DT_RELR in a shared library without DT_NEEDED. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +extern int foo (void); > + > +static int > +do_test (void) > +{ > + return foo (); > +} > + > +#include > diff --git a/elf/tst-relr3.c b/elf/tst-relr3.c > new file mode 100644 > index 0000000000..69106cf7b7 > --- /dev/null > +++ b/elf/tst-relr3.c > @@ -0,0 +1,27 @@ > +/* Test for DT_RELR in a shared library without libc.so on DT_NEEDED. > + Copyright (C) 2022 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + . */ > + > +extern int foo (void); > + > +static int > +do_test (void) > +{ > + return foo (); > +} > + > +#include > diff --git a/elf/tst-relr4.c b/elf/tst-relr4.c > new file mode 100644 > index 0000000000..19a75013f8 > --- /dev/null > +++ b/elf/tst-relr4.c > @@ -0,0 +1 @@ > +#include "tst-relr3.c" Ok.