Compare commits

...

4 Commits

Author SHA1 Message Date
Nick Alcock
a509c37fed libctf: don't run tests requiring deduplicating linker unless one is in use
Before now, we were relying on gcc -B to repoint GCC at our freshly-built
linker, and assuming we could use this to run tests that do linker dedup.

This is, alas, not reliable (building --with-ld=/an/absolute/path bypasses
-B searches for the linker), and we would like the libctf tests in
particular to not fail if the compiler uses a linker that cannot deduplicate
(simply skipping such tests).

Add a new testsuite function that tries to link one of the lookup tests'
testcases (which is known to produce conflicting types, i.e. a dict with
per-translation-unit children) and then does an objdump and greps it for
signs of the per-translation-unit children.  If there are none, the linker
probably just concatenated the sections: i.e., it is not a linker that
can deduplicate CTF.

libctf/
	PR libctf/33162
	* testsuite/config/default.exp (objdump): Introduce.
	(OBJDUMPFLAGS): Likewise.
	* testsuite/lib/ctf-lib.exp (check_ctf_linker_dedup): New.
	* testsuite/libctf-lookup/lookup.exp: Use it.
	* testsuite/libctf-regression/libctf-repeat-cu.exp: Likewise.
	* testsuite/libctf-regression/regression.exp: Likewise.
2025-07-19 16:20:59 +01:00
Rainer Orth
902e18df6d libctf: exclude always-emitted Solaris symbols from the symtypetab
If we're skipping _BEGIN_ and _END_ we should certainly skip all the other
ABI-required always-emitted symbols given in ld/emultempl/solaris2*em as
well.  (This fixes a couple of diagnostics tests, but that's just because
the tests are quite sensitive to CTF section sizes, and introducing any
symtypetab entries for those tests perturbs those.)

Some of these are usually STT_NOTYPE, but not always: if programs already
emitted the symbol they might end up with any type, in particular
STT_OBJECT, and appear in the symtypetabs.

[nca: added commit log, added more symbols]

libctf/
	PR libctf/33162
	* ctf-serialize.c (ctf_symtab_skippable): Skip
	more always-emitted Solaris symbols.
2025-07-19 16:20:59 +01:00
Nick Alcock
e5ac6cfdf2 libctf: get libctf-nobfd.ver from the right place with Solaris ld
We generate de-commented version scripts for Solaris ld (whose
-z gnu-version-script linker option does not support comments),
but after we switched to generating libctf-nobfd.ver itself, we
failed to adjust this code to pick it up from the new location.

libctf/
	PR libctf/33161
	* configure.ac: Fix libctf-nobfd.ver path on Solaris.
	* configure: Regenerated.
2025-07-19 16:20:59 +01:00
Rainer Orth
dd6d1901e6 libctf: do not use mmap on Solaris 11
Writable mmaps and read are inconsistent with each other on Solaris 11.4,
which breaks archive writing.  Simply assert that Solaris 2.11 doesn't have
mmap, falling back to read(): the archive format is being bumped shortly, to
one with completely different writeout code, so this workaround need not
stay for long.

[nca: added commit log]

libctf/
	PR libctf/29292
	* configure.ac: Turn off mmap on Solaris 2.11.
	* configure: Regenerated.
2025-07-19 16:20:59 +01:00
8 changed files with 91 additions and 3 deletions

10
libctf/configure vendored
View File

@@ -15966,6 +15966,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
case "${host}" in
# PR libctf/29292
# libctf's use of mmap doesn't work on Solaris 11.4, so disable it.
*-*-solaris2.11*)
ac_cv_func_mmap_fixed_mapped=no
;;
esac
@@ -17015,7 +17023,7 @@ if test -n "$decommented_version_script"; then
# used by GNU ld. Use cpp to strip the comments out. (cpp exists under this
# name on all platforms that support ld -z gnu-version-script.)
/lib/cpp < $srcdir/libctf.ver > libctf-decommented.ver
/lib/cpp < $srcdir/libctf-nobfd.ver > libctf-nobfd-decommented.ver
/lib/cpp < libctf-nobfd.ver > libctf-nobfd-decommented.ver
VERSION_FLAGS="$ac_cv_libctf_version_script='libctf-decommented.ver'"
VERSION_FLAGS_NOBFD="$ac_cv_libctf_version_script='libctf-nobfd-decommented.ver'"
elif test -z "$no_version_script"; then

View File

@@ -65,6 +65,14 @@ AM_MAINTAINER_MODE
AM_INSTALL_LIBBFD
ACX_PROG_CC_WARNING_OPTS([-Wall], [ac_libctf_warn_cflags])
case "${host}" in
# PR libctf/29292
# libctf's use of mmap doesn't work on Solaris 11.4, so disable it.
*-*-solaris2.11*)
ac_cv_func_mmap_fixed_mapped=no
;;
esac
GCC_AC_FUNC_MMAP
# Needed for BFD capability checks.
AC_SEARCH_LIBS(dlsym, dl)
@@ -293,7 +301,7 @@ if test -n "$decommented_version_script"; then
# used by GNU ld. Use cpp to strip the comments out. (cpp exists under this
# name on all platforms that support ld -z gnu-version-script.)
/lib/cpp < $srcdir/libctf.ver > libctf-decommented.ver
/lib/cpp < $srcdir/libctf-nobfd.ver > libctf-nobfd-decommented.ver
/lib/cpp < libctf-nobfd.ver > libctf-nobfd-decommented.ver
VERSION_FLAGS="$ac_cv_libctf_version_script='libctf-decommented.ver'"
VERSION_FLAGS_NOBFD="$ac_cv_libctf_version_script='libctf-nobfd-decommented.ver'"
elif test -z "$no_version_script"; then

View File

@@ -74,6 +74,12 @@ ctf_symtab_skippable (ctf_link_sym_t *sym)
|| sym->st_shndx == SHN_UNDEF
|| strcmp (sym->st_name, "_START_") == 0
|| strcmp (sym->st_name, "_END_") == 0
|| strcmp (sym->st_name, "_DYNAMIC") == 0
|| strcmp (sym->st_name, "_GLOBAL_OFFSET_TABLE_") == 0
|| strcmp (sym->st_name, "_PROCEDURE_LINKAGE_TABLE_") == 0
|| strcmp (sym->st_name, "_edata") == 0
|| strcmp (sym->st_name, "_end") == 0
|| strcmp (sym->st_name, "_etext") == 0
|| (sym->st_type == STT_OBJECT && sym->st_shndx == SHN_EXTABS
&& sym->st_value == 0));
}

View File

@@ -34,6 +34,10 @@ if ![info exists as] then {
set as [findfile $base_dir/../gas/as-new $base_dir/../gas/as-new [transform as]]
}
if ![info exists objdump] then {
set objdump [findfile $base_dir/../binutils/objdump]
}
remote_exec host "mkdir -p tmpdir"
# Make symlinks from tmpdir/libctf to the linker and assembler in the
@@ -63,10 +67,12 @@ if {![info exists CFLAGS_FOR_TARGET]} {
if ![info exists AR] then {
set AR [findfile $base_dir/../binutils/ar]
}
if {![info exists OBJDUMP]} {
set OBJDUMP [findfile $base_dir/../binutils/objdump]
}
if ![info exists OBJDUMPFLAGS] then {
set OBJDUMPFLAGS {}
}
# load the utility procedures
load_lib ctf-lib.exp

View File

@@ -20,6 +20,51 @@
load_file $srcdir/../../ld/testsuite/lib/ld-lib.exp
# Returns true if the target linker deduplicates CTF.
proc check_ctf_linker_dedup { } {
global ctf_linker_dedup_saved
if {![info exists ctf_linker_dedup_saved]} {
set ctf_linker_dedup_saved 0
if ([check_ctf_available]) {
global objdump srcdir
set basename "tmpdir/ctf_linker_dedups[pid]"
compile_one_cc $srcdir/libctf-lookup/ambiguous-struct-A.c ${basename}-A.o "-gctf -fPIC -c"
compile_one_cc $srcdir/libctf-lookup/ambiguous-struct-B.c ${basename}-B.o "-gctf -fPIC -c"
compile_one_cc "${basename}-A.o ${basename}-B.o" $basename.so "-gctf -fPIC -shared"
if {! [remote_file host exists $basename.so] } {
return 0
}
# Don't use run_host_cmd: it dumps the entire output into the log,
# even on success.
set cmdret [remote_exec host [concat sh -c [list "$objdump --ctf $basename.so >dump.out 2>dump.err"]] "" "/dev/null"]
set cmdret [lindex $cmdret 0]
remote_upload host "dump.out"
remote_upload host "dump.err"
set dump_out [prune_warnings [file_contents "dump.out"]]
set dump_err [prune_warnings [file_contents "dump.err"]]
remote_file host delete "dump.out" "dump.err"
remote_file build delete "dump.out" "dump.err"
if {$cmdret != 0} {
verbose -log "failed with $cmdret: stderr: $dump_err"
verbose -log "output: $dump_out"
return 0;
}
remote_file host delete $basename.so ${basename}-A.o ${basename}-B.o
if [regexp {CTF archive member: } $dump_out] {
set ctf_linker_dedup_saved 1
}
}
}
return $ctf_linker_dedup_saved
}
proc run_native_host_cmd { command } {
global link_output
global ld

View File

@@ -28,6 +28,11 @@ if {![check_ctf_available]} {
return 0
}
if {![check_ctf_linker_dedup]} {
unsupported "no CTF deduplication support in the linker"
return 0
}
if {[info exists env(LC_ALL)]} {
set old_lc_all $env(LC_ALL)
}

View File

@@ -37,6 +37,11 @@ if {![check_ctf_available]} {
return 0
}
if {![check_ctf_linker_dedup]} {
unsupported "no CTF deduplication support in the linker"
return 0
}
if {[info exists env(LC_ALL)]} {
set old_lc_all $env(LC_ALL)
}

View File

@@ -23,6 +23,11 @@ if {![check_ctf_available]} {
return 0
}
if {![check_ctf_linker_dedup]} {
unsupported "no CTF deduplication support in the linker"
return 0
}
if ![is_elf_format] {
unsupported "CTF needs bfd changes to be emitted on non-ELF"
return 0