mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-31 22:10:34 +03:00 
			
		
		
		
	This is the first of a 2-part patch set that fixes slow DSO sorting behavior in the dynamic loader, as reported in BZ #17645. In order to facilitate such a large modification to the dynamic loader, this first patch implements a testing framework for validating shared object sorting behavior, to enable comparison between old/new sorting algorithms, and any later enhancements. This testing infrastructure consists of a Python script scripts/dso-ordering-test.py' which takes in a description language, consisting of strings that describe a set of link dependency relations between DSOs, and generates testcase programs and Makefile fragments to automatically test the described situation, for example: a->b->c->d # four objects linked one after another a->[bc]->d;b->c # a depends on b and c, which both depend on d, # b depends on c (b,c linked to object a in fixed order) a->b->c;{+a;%a;-a} # a, b, c serially dependent, main program uses # dlopen/dlsym/dlclose on object a a->b->c;{}!->[abc] # a, b, c serially dependent; multiple tests generated # to test all permutations of a, b, c ordering linked # to main program (Above is just a short description of what the script can do, more documentation is in the script comments.) Two files containing several new tests, elf/dso-sort-tests-[12].def are added, including test scenarios for BZ #15311 and Redhat issue #1162810 [1]. Due to the nature of dynamic loader tests, where the sorting behavior and test output occurs before/after main(), generating testcases to use support/test-driver.c does not suffice to control meaningful timeout for ld.so. Therefore a new utility program 'support/test-run-command', based on test-driver.c/support_test_main.c has been added. This does the same testcase control, but for a program specified through a command-line rather than at the source code level. This utility is used to run the dynamic loader testcases generated by dso-ordering-test.py. [1] https://bugzilla.redhat.com/show_bug.cgi?id=1162810 Signed-off-by: Chung-Lin Tang <cltang@codesourcery.com> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
		
			
				
	
	
		
			309 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			309 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| # Makefile for support library, used only at build and test time
 | |
| # Copyright (C) 2016-2021 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
 | |
| # <https://www.gnu.org/licenses/>.
 | |
| 
 | |
| subdir := support
 | |
| 
 | |
| include ../Makeconfig
 | |
| 
 | |
| extra-libs := libsupport
 | |
| extra-libs-others = $(extra-libs)
 | |
| extra-libs-noinstall := $(extra-libs)
 | |
| 
 | |
| libsupport-routines = \
 | |
|   blob_repeat \
 | |
|   check \
 | |
|   check_addrinfo \
 | |
|   check_dns_packet \
 | |
|   check_hostent \
 | |
|   check_netent \
 | |
|   delayed_exit \
 | |
|   ignore_stderr \
 | |
|   next_to_fault \
 | |
|   oom_error \
 | |
|   resolv_response_context_duplicate \
 | |
|   resolv_response_context_free \
 | |
|   resolv_test \
 | |
|   set_fortify_handler \
 | |
|   support_stack_alloc \
 | |
|   support-xfstat \
 | |
|   support-xfstat-time64 \
 | |
|   support-xstat \
 | |
|   support-xstat-time64 \
 | |
|   support_become_root \
 | |
|   support_can_chroot \
 | |
|   support_capture_subprocess \
 | |
|   support_capture_subprocess_check \
 | |
|   support_chroot \
 | |
|   support_copy_file \
 | |
|   support_copy_file_range \
 | |
|   support_create_timer \
 | |
|   support_descriptor_supports_holes \
 | |
|   support_descriptors \
 | |
|   support_enter_mount_namespace \
 | |
|   support_enter_network_namespace \
 | |
|   support_format_address_family \
 | |
|   support_format_addrinfo \
 | |
|   support_format_dns_packet \
 | |
|   support_format_herrno \
 | |
|   support_format_hostent \
 | |
|   support_format_netent \
 | |
|   support_isolate_in_subprocess \
 | |
|   support_mutex_pi_monotonic \
 | |
|   support_path_support_time64 \
 | |
|   support_process_state \
 | |
|   support_ptrace \
 | |
|   support-open-dev-null-range \
 | |
|   support_openpty \
 | |
|   support_paths \
 | |
|   support_quote_blob \
 | |
|   support_quote_blob_wide \
 | |
|   support_quote_string \
 | |
|   support_record_failure \
 | |
|   support_run_diff \
 | |
|   support_select_modifies_timeout \
 | |
|   support_select_normalizes_timeout \
 | |
|   support_set_small_thread_stack_size \
 | |
|   support_shared_allocate \
 | |
|   support_small_stack_thread_attribute \
 | |
|   support_stat_nanoseconds \
 | |
|   support_subprocess \
 | |
|   support_test_compare_blob \
 | |
|   support_test_compare_failure \
 | |
|   support_test_compare_string \
 | |
|   support_test_compare_string_wide \
 | |
|   support_test_main \
 | |
|   support_test_verify_impl \
 | |
|   support_wait_for_thread_exit \
 | |
|   support_write_file_string \
 | |
|   temp_file \
 | |
|   timespec \
 | |
|   timespec-time64 \
 | |
|   timespec-add \
 | |
|   timespec-add-time64 \
 | |
|   timespec-sub \
 | |
|   timespec-sub-time64 \
 | |
|   write_message \
 | |
|   xaccept \
 | |
|   xaccept4 \
 | |
|   xasprintf \
 | |
|   xbind \
 | |
|   xcalloc \
 | |
|   xchdir \
 | |
|   xchroot \
 | |
|   xclock_gettime \
 | |
|   xclock_gettime_time64 \
 | |
|   xclock_settime \
 | |
|   xclock_settime_time64 \
 | |
|   xclone \
 | |
|   xclose \
 | |
|   xchmod \
 | |
|   xconnect \
 | |
|   xcopy_file_range \
 | |
|   xdlfcn \
 | |
|   xdlmopen \
 | |
|   xdup2 \
 | |
|   xfchmod \
 | |
|   xfclose \
 | |
|   xfopen \
 | |
|   xfork \
 | |
|   xftruncate \
 | |
|   xgetline \
 | |
|   xgetsockname \
 | |
|   xlisten \
 | |
|   xlseek \
 | |
|   xlstat \
 | |
|   xlstat-time64 \
 | |
|   xmalloc \
 | |
|   xmemstream \
 | |
|   xmkdir \
 | |
|   xmkdirp \
 | |
|   xmmap \
 | |
|   xmprotect \
 | |
|   xmunmap \
 | |
|   xnewlocale \
 | |
|   xopen \
 | |
|   xpipe \
 | |
|   xpoll \
 | |
|   xposix_memalign \
 | |
|   xpthread_attr_destroy \
 | |
|   xpthread_attr_init \
 | |
|   xpthread_attr_setdetachstate \
 | |
|   xpthread_attr_setguardsize \
 | |
|   xpthread_attr_setaffinity_np \
 | |
|   xpthread_attr_setstack \
 | |
|   xpthread_attr_setstacksize \
 | |
|   xpthread_barrier_destroy \
 | |
|   xpthread_barrier_init \
 | |
|   xpthread_barrier_wait \
 | |
|   xpthread_barrierattr_destroy \
 | |
|   xpthread_barrierattr_init \
 | |
|   xpthread_barrierattr_setpshared \
 | |
|   xpthread_cancel \
 | |
|   xpthread_check_return \
 | |
|   xpthread_cond_wait \
 | |
|   xpthread_create \
 | |
|   xpthread_detach \
 | |
|   xpthread_join \
 | |
|   xpthread_key_create \
 | |
|   xpthread_key_delete \
 | |
|   xpthread_kill \
 | |
|   xpthread_mutex_consistent \
 | |
|   xpthread_mutex_destroy \
 | |
|   xpthread_mutex_init \
 | |
|   xpthread_mutex_lock \
 | |
|   xpthread_mutex_unlock \
 | |
|   xpthread_mutexattr_destroy \
 | |
|   xpthread_mutexattr_init \
 | |
|   xpthread_mutexattr_setprotocol \
 | |
|   xpthread_mutexattr_setpshared \
 | |
|   xpthread_mutexattr_setrobust \
 | |
|   xpthread_mutexattr_settype \
 | |
|   xpthread_once \
 | |
|   xpthread_rwlock_init \
 | |
|   xpthread_rwlock_destroy \
 | |
|   xpthread_rwlock_rdlock \
 | |
|   xpthread_rwlock_unlock \
 | |
|   xpthread_rwlock_wrlock \
 | |
|   xpthread_rwlockattr_init \
 | |
|   xpthread_rwlockattr_setkind_np \
 | |
|   xpthread_sigmask \
 | |
|   xpthread_spin_lock \
 | |
|   xpthread_spin_unlock \
 | |
|   xraise \
 | |
|   xreadlink \
 | |
|   xrealloc \
 | |
|   xrecvfrom \
 | |
|   xsendto \
 | |
|   xsetlocale \
 | |
|   xsetsockopt \
 | |
|   xsigaction \
 | |
|   xsignal \
 | |
|   xsigstack \
 | |
|   xsocket \
 | |
|   xposix_spawn \
 | |
|   xposix_spawn_file_actions_addclose \
 | |
|   xposix_spawn_file_actions_adddup2 \
 | |
|   xstrdup \
 | |
|   xstrndup \
 | |
|   xsymlink \
 | |
|   xsysconf \
 | |
|   xunlink \
 | |
|   xuselocale \
 | |
|   xwaitpid \
 | |
|   xwrite \
 | |
| 
 | |
| libsupport-static-only-routines := $(libsupport-routines)
 | |
| # Only build one variant of the library.
 | |
| libsupport-inhibit-o := .os
 | |
| ifeq ($(build-shared),yes)
 | |
| libsupport-inhibit-o += .o
 | |
| endif
 | |
| 
 | |
| CFLAGS-support_paths.c = \
 | |
| 		-DSRCDIR_PATH=\"`cd .. ; pwd`\" \
 | |
| 		-DOBJDIR_PATH=\"`cd $(objpfx)/..; pwd`\" \
 | |
| 		-DOBJDIR_ELF_LDSO_PATH=\"`cd $(objpfx)/..; pwd`/elf/$(rtld-installed-name)\" \
 | |
| 		-DINSTDIR_PATH=\"$(prefix)\" \
 | |
| 		-DLIBDIR_PATH=\"$(libdir)\" \
 | |
| 		-DBINDIR_PATH=\"$(bindir)\" \
 | |
| 		-DSBINDIR_PATH=\"$(sbindir)\" \
 | |
| 		-DSLIBDIR_PATH=\"$(slibdir)\" \
 | |
| 		-DROOTSBINDIR_PATH=\"$(rootsbindir)\" \
 | |
| 		-DCOMPLOCALEDIR_PATH=\"$(complocaledir)\"
 | |
| 
 | |
| # In support_timespec_check_in_range we may be passed a very tight
 | |
| # range for which we should produce a correct result for expected
 | |
| # being withing the observed range.  The code uses double internally
 | |
| # in support_timespec_check_in_range and for that computation we use
 | |
| # -fexcess-precision=standard.
 | |
| CFLAGS-timespec.c += -fexcess-precision=standard
 | |
| CFLAGS-timespec-time64.c += -fexcess-precision=standard
 | |
| 
 | |
| ifeq (,$(CXX))
 | |
| LINKS_DSO_PROGRAM = links-dso-program-c
 | |
| else
 | |
| LINKS_DSO_PROGRAM = links-dso-program
 | |
| LDLIBS-links-dso-program = -lstdc++ -lgcc -lgcc_s $(libunwind)
 | |
| endif
 | |
| 
 | |
| ifeq (yes,$(have-selinux))
 | |
| LDLIBS-$(LINKS_DSO_PROGRAM) += -lselinux
 | |
| endif
 | |
| 
 | |
| 
 | |
| LDLIBS-test-container = $(libsupport)
 | |
| 
 | |
| others += test-container
 | |
| others-noinstall += test-container
 | |
| 
 | |
| others += shell-container echo-container true-container
 | |
| others-noinstall += shell-container echo-container true-container
 | |
| 
 | |
| others += $(LINKS_DSO_PROGRAM)
 | |
| others-noinstall += $(LINKS_DSO_PROGRAM)
 | |
| 
 | |
| others += test-run-command
 | |
| others-static += test-run-command
 | |
| others-noinstall += test-run-command
 | |
| LDLIBS-test-run-command = $(libsupport)
 | |
| 
 | |
| $(objpfx)test-container : $(libsupport)
 | |
| $(objpfx)shell-container : $(libsupport)
 | |
| $(objpfx)echo-container : $(libsupport)
 | |
| $(objpfx)true-container : $(libsupport)
 | |
| $(objpfx)test-run-command : $(libsupport) $(common-objpfx)elf/static-stubs.o
 | |
| 
 | |
| tests = \
 | |
|   README-testing \
 | |
|   tst-support-namespace \
 | |
|   tst-support_blob_repeat \
 | |
|   tst-support_capture_subprocess \
 | |
|   tst-support_descriptors \
 | |
|   tst-support_format_dns_packet \
 | |
|   tst-support-open-dev-null-range \
 | |
|   tst-support-process_state \
 | |
|   tst-support_quote_blob \
 | |
|   tst-support_quote_blob_wide \
 | |
|   tst-support_quote_string \
 | |
|   tst-support_record_failure \
 | |
|   tst-test_compare \
 | |
|   tst-test_compare_blob \
 | |
|   tst-test_compare_string \
 | |
|   tst-test_compare_string_wide \
 | |
|   tst-timespec \
 | |
|   tst-xreadlink \
 | |
|   tst-xsigstack \
 | |
| 
 | |
| ifeq ($(run-built-tests),yes)
 | |
| tests-special = \
 | |
|   $(objpfx)tst-support_record_failure-2.out
 | |
| 
 | |
| $(objpfx)tst-support_record_failure-2.out: tst-support_record_failure-2.sh \
 | |
|   $(objpfx)tst-support_record_failure
 | |
| 	$(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \
 | |
| 	  '$(run-program-env)' '$(test-program-prefix-after-env)' \
 | |
| 	  > $@; \
 | |
| 	$(evaluate-test)
 | |
| endif
 | |
| 
 | |
| $(objpfx)tst-support_format_dns_packet: $(common-objpfx)resolv/libresolv.so
 | |
| 
 | |
| tst-support_capture_subprocess-ARGS = -- $(host-test-program-cmd)
 | |
| 
 | |
| include ../Rules
 |