Building tests from multiple object files
Commit Message
I'm still working on upstreaming our libresolv and NSS tests. During
that, I noticed the following.
The glibc makefiles do not provide a simple way to assemble a test
binary from multiple object files. One way to see this is to apply the
attached harmless patch and then run
make subdirs=elf check
(or whatever you do to run the test suite). Linking the test fails with:
/home/fweimer/src/gnu/glibc/build/elf/tst-tlsalign-vars.o: In function
`use_errno':
/home/fweimer/src/gnu/glibc/git/elf/tst-tlsalign-vars.c:36: undefined
reference to `__libc_errno'
collect2: error: ld returned 1 exit status
../Rules:154: recipe for target
'/home/fweimer/src/gnu/glibc/build/elf/tst-tlsalign-extern' failed
The apparent cause is that the second object file for the test was built
against internal glibc headers.
The incorrect make rule for the elf/tst-tlsalign-vars.o target is
created by o-iterator.mk. I have not been able to figure out which of
the inclusions triggered this.
Is there a quick fix for this?
Thanks,
Florian
Comments
Florian Weimer <fweimer@redhat.com> writes:
> The glibc makefiles do not provide a simple way to assemble a test binary
> from multiple object files. One way to see this is to apply the attached
> harmless patch and then run
>
> make subdirs=elf check
>
> (or whatever you do to run the test suite). Linking the test fails with:
>
> /home/fweimer/src/gnu/glibc/build/elf/tst-tlsalign-vars.o: In function
> `use_errno':
> /home/fweimer/src/gnu/glibc/git/elf/tst-tlsalign-vars.c:36: undefined
> reference to `__libc_errno'
> collect2: error: ld returned 1 exit status
> ../Rules:154: recipe for target
> '/home/fweimer/src/gnu/glibc/build/elf/tst-tlsalign-extern' failed
>
> The apparent cause is that the second object file for the test was built
> against internal glibc headers.
No, the problem is that it is built with MODULE_NAME=libc. It should be
nonlib, so it needs to be put on test-extras (and on extra-test-objs to
get dependency right).
Andreas.
On 04/12/2016 02:16 PM, Andreas Schwab wrote:
> Florian Weimer <fweimer@redhat.com> writes:
>
>> The glibc makefiles do not provide a simple way to assemble a test binary
>> from multiple object files. One way to see this is to apply the attached
>> harmless patch and then run
>>
>> make subdirs=elf check
>>
>> (or whatever you do to run the test suite). Linking the test fails with:
>>
>> /home/fweimer/src/gnu/glibc/build/elf/tst-tlsalign-vars.o: In function
>> `use_errno':
>> /home/fweimer/src/gnu/glibc/git/elf/tst-tlsalign-vars.c:36: undefined
>> reference to `__libc_errno'
>> collect2: error: ld returned 1 exit status
>> ../Rules:154: recipe for target
>> '/home/fweimer/src/gnu/glibc/build/elf/tst-tlsalign-extern' failed
>>
>> The apparent cause is that the second object file for the test was built
>> against internal glibc headers.
>
> No, the problem is that it is built with MODULE_NAME=libc. It should be
> nonlib, so it needs to be put on test-extras (and on extra-test-objs to
> get dependency right).
Thanks, this fixed the build issue for me, also for my actual test.
Florian
@@ -2,6 +2,8 @@
purpose of the test that these definitions be in a separate translation
unit from the code using the variables. */
+#include <errno.h>
+
__thread int tdata1 = 1;
__thread int tdata2 __attribute__ ((aligned (0x10))) = 2;
__thread int tdata3 __attribute__ ((aligned (0x1000))) = 4;
@@ -26,3 +28,12 @@ unused (void)
tbss2 = -5;
tbss3 = -6;
}
+
+
+int
+use_errno (int c)
+{
+ int e = errno;
+ errno = c;
+ return e;
+}