This issue happens only with position-independent executables. Adding
the main objfile for the new inferior (the fork child) causes GDB to try
to reset the breakpoints. However, that new objfile has not been
relocated yet. So the breakpoint on "break_here" resolves to an
unrelocated address, from which we are trying to read/write to set a
breakpoint. Passing SYMFILE_DEFER_BP_RESET avoids that problem. The
executable is relocated just after, in the follow_fork_inferior
function.
The buildbot seems happy with this patch. I don't think it's necessary
to add a new test. Just changing this made many tests go from FAIL to
PASS on my machine, where gcc produces PIE executables by default. If
anything, I think we would need to add a board file that produces
position-independent executables, so that we can run all the tests with
PIE, even on machines where that is not the default.
gdb/ChangeLog:
* progspace.c (clone_program_space): Pass SYMFILE_DEFER_BP_RESET
to symbol_file_add_main.
Simon Marchi [Sat, 7 Apr 2018 17:48:05 +0000 (13:48 -0400)]
Implement write_async_safe for mi_console_file (PR 22299)
Enabling "set debug lin-lwp 1" with the MI interpreter doesn't work.
When the sigchld_handler function wants to print a debug output
("sigchld\n"), it uses ui_file_write_async_safe. This ends up in the
default implementation of ui_file::write_async_safe, which aborts GDB.
This patch implements the write_async_safe method for mi_console_file.
The "normal" MI output is line buffered, which means the output
accumulates in m_buffer until a \n is written, at which point it's
flushed in m_raw. The implementation of write_async_safe provided by
this patch bypasses this buffer and writes directly to m_raw. There are
two reasons for this:
(1) Appending to m_buffer (therefore to an std::string) is probably not
async-safe, as it may allocate memory.
(2) We may have a partial output already in m_buffer, so that would lead
to some nested MI output, not so great.
There is probably still a chance to have bad MI output, if
sigchld_handler is invoked in the middle of mi_console_file's flush, and
the line being flushed is only partially sent to m_raw. The solution
would probably be to block signals during flushing. Since this is only
used for debug output, I don't know if it's worth the effort to do that.
To implement write_async_safe, I needed to use the fputstrn_unfiltered,
which does the necessary escaping (e.g. replace \n with \\n). I started
by adding printchar's callback parameters to fputstrn_unfiltered, to be
able to pass async-safe versions of them. It's not easy to provide an
async-safe version of do_fprintf, but it turns out that we can easily
replace printchar's callbacks with a single do_fputc quite easily. The
async-safe version of do_fputc simply calls the underlying ui_file's
write_async_safe method.
gdb/ChangeLog:
PR mi/22299
* mi/mi-console.c (do_fputc_async_safe): New.
(mi_console_file::write_async_safe): New.
(mi_console_file::flush): Adjust calls to fputstrn_unfiltered.
* mi/mi-console.h (class mi_console_file) <write_async_safe>:
New.
* ui-file.c (ui_file::putstrn): Adjust call to
fputstrn_unfiltered.
* utils.c (printchar): Replace do_fputs and do_fprintf
parameters by do_fputc.
(fputstr_filtered): Adjust call to printchar.
(fputstr_unfiltered): Likewise.
(fputstrn_filtered): Likewise.
(fputstrn_unfiltered): Add do_fputc parameter, pass to
printchar.
* utils.h (do_fputc_ftype): New typedef.
(fputstrn_unfiltered): Add do_fputc parameter.
Simon Marchi [Sat, 7 Apr 2018 17:24:58 +0000 (13:24 -0400)]
Fix generation of x86-64 gdbarch with osabi none (PR 22979)
When a 64-bits (x86-64) gdbarch is created, it is first born as a
32-bits gdbarch in i386_gdbarch_init. The call gdbarch_init_osabi will
call the handler register for the selected (arch, osabi) pair, such as
amd64_linux_init_abi. The various amd64 handlers call amd64_init_abi,
which turns the gdbarch into a 64-bits one.
When selecting the i386:x86-64 architecture with no osabi, no such
handler is ever called, so the gdbarch stays (wrongfully) a 32-bits one.
My first idea was to manually call amd64_init_abi & al in
i386_gdbarch_init when the osabi is GDB_OSABI_NONE. However, this
doesn't work in a build of GDB where i386 is included as a target but
not amd64. My next option (implemented in this patch), is to allow
registering handlers for GDB_OSABI_NONE. I added two such handlers in
amd64-tdep.c, so now it works the same as for the "normal" osabis. It
required re-ordering things in gdbarch_init_osabi to allow running
handlers for GDB_OSABI_NONE.
Without this patch applied (but with the previous one*) :
(gdb) set osabi none
(gdb) set architecture i386:x86-64
The target architecture is assumed to be i386:x86-64
(gdb) p sizeof(void*)
$1 = 4
and now:
(gdb) set osabi none
(gdb) set architecture i386:x86-64
The target architecture is assumed to be i386:x86-64
(gdb) p sizeof(void*)
$1 = 8
* Before the previous patch, which fixed "set osabi none", this bug was
hidden because we didn't actually try to generate a gdbarch for no
osabi, it would always fall back on Linux. Generating the gdbarch for
amd64/linux did work.
gdb/ChangeLog:
PR gdb/22979
* amd64-tdep.c (amd64_none_init_abi): New function.
(amd64_x32_none_init_abi): New function.
(_initialize_amd64_tdep): Register handlers for x86-64 and
x64_32 with GDB_OSABI_NONE.
* osabi.c (gdbarch_init_osabi): Allow running handlers for the
GDB_OSABI_NONE osabi.
gdb/testsuite/ChangeLog:
PR gdb/22979
* gdb.arch/amd64-osabi.exp: New file.
This is because the value GDB_OSABI_UNKNOWN has an unclear role,
sometimes meaning "no osabi" and sometimes "please selected
automatically". Doing "set osabi none" sets the requested osabi to
GDB_OSABI_UNKNOWN, in which case gdbarch_info_fill overrides it with a
value from the target description, or the built-in default osabi. This
means that it's impossible to force GDB not to use an osabi with "set
osabi". Since my GDB's built-in default osabi is Linux, it always falls
back to GDB_OSABI_LINUX.
To fix it, I introduced GDB_OSABI_NONE, which really means "I don't want
any osabi". GDB_OSABI_UNKNOWN can then be used only for "not set yet,
please auto-detect". GDB_OSABI_UNINITIALIZED now seems unnecessary
since it overlaps with GDB_OSABI_UNKNOWN, so I think it can be removed
and gdbarch_info::osabi can be initialized to GDB_OSABI_UNKNOWN.
Simon Marchi [Sat, 7 Apr 2018 17:19:12 +0000 (13:19 -0400)]
Make target_read_alloc & al return vectors
This patch started by changing target_read_alloc_1 to return a
byte_vector, to avoid manual memory management (in target_read_alloc_1
and in the callers). To communicate failures to the callers, it
actually returns a gdb::optional<gdb::byte_vector>.
Adjusting target_read_stralloc was a bit more tricky, since it wants to
return a buffer of char, and not gdb_byte. Since you can't just cast a
gdb::byte_vector into a gdb::def_vector<char>, I made
target_read_alloc_1 templated, so both versions (that return vectors of
gdb_byte and char) are generated. Since target_read_stralloc now
returns a gdb::char_vector instead of a gdb::unique_xmalloc_ptr<char>, a
few callers need to be adjusted.
Further improve warnings for relocations referring to discarded sections.
Relocations referring to discarded sections are now treated as errors
instead of warnings.
Also with this patch, we will now print the section group signature and the
object file with the prevailing definition of that group along with the
name of the symbol that the relocation is referring to. This additional
information should be much more useful to anyone trying to track down
the source of such errors.
To do so, we now map each discarded section to the Kept_section info in
the Layout class, and defer the logic that maps a discarded section to
its counterpart in the kept group. This gives us the information we need
to identify the signature symbol given the discarded section, and the
name of the object file that provided the prevailing (i.e., first)
definition of that group.
gold/
* object.cc (Sized_relobj_file::include_section_group): Store
reference to Kept_section info for discarded comdat sections
regardless of size. Move size checking to map_to_kept_section.
(Sized_relobj_file::include_linkonce_section): Likewise.
(Sized_relobj_file::map_to_kept_section): Add section name parameter.
Insert size checking logic from above functions.
(Sized_relobj_file::find_kept_section_object): New method.
(Sized_relobj_file::get_symbol_name): New method.
* object.h (Sized_relobj_file::map_to_kept_section): Add section_name
parameter. Adjust all callers.
(Sized_relobj_file::find_kept_section_object): New method.
(Sized_relobj_file::get_symbol_name): New method.
(Sized_relobj_file::Kept_comdat_section): Replace object and shndx
fields with sh_size, kept_section, symndx, and is_comdat fields.
(Sized_relobj_file::set_kept_comdat_section): Replace kept_object
and kept_shndx parameters with is_comdat, symndx, sh_size, and
kept_section.
(Sized_relobj_file::get_kept_comdat_section): Likewise.
* target-reloc.h (enum Comdat_behavior): Change CB_WARNING to CB_ERROR.
Adjust all references.
(issue_undefined_symbol_error): New function template.
(relocate_section): Pass section name to map_to_kept_section.
Move discarded section code to new function above.
* aarch64.cc (Target_aarch64::scan_reloc_section_for_stubs): Move
declaration for gsym out one level. Call issue_discarded_error.
* arm.cc (Target_arm::scan_reloc_section_for_stubs): Likewise.
* powerpc.cc (Relocate_comdat_behavior): Change CB_WARNING to CB_ERROR.
Tom Tromey [Wed, 4 Apr 2018 03:52:31 +0000 (21:52 -0600)]
Remove value::next and value::released
This patch converts all_values to simply hold a list of references to
values. Now, there's no need to have a value record whether or not it
is released -- there is only a single reference-counting mechanism for
values. So, this also removes value::next, value::released, and
value_next.
gdb/ChangeLog
2018-04-06 Tom Tromey <tom@tromey.com>
* value.c (struct value) <released, next>: Remove.
(all_values): Now a std::vector.
(allocate_value_lazy): Update.
(value_next): Remove.
(value_mark, value_free_to_mark, release_value)
(value_release_to_mark): Update.
Tom Tromey [Wed, 4 Apr 2018 02:20:01 +0000 (20:20 -0600)]
Remove free_value_chain
This patch changes value_release_to_mark and fetch_subexp_value to
return a std::vector of value references, rather than relying on the
"next" field that is contained in a struct value. This makes it
simpler to reason about the returned values, and also allows for the
removal of free_value_chain.
gdb/ChangeLog
2018-04-06 Tom Tromey <tom@tromey.com>
* value.h (fetch_subexp_value, value_release_to_mark): Update.
(free_value_chain): Remove.
* value.c (free_value_chain): Remove.
(value_release_to_mark): Return a std::vector.
* ppc-linux-nat.c (num_memory_accesses): Change "chain" to a
std::vector.
(check_condition): Update.
* eval.c (fetch_subexp_value): Change "val_chain" to a
std::vector.
* breakpoint.c (update_watchpoint): Update.
(can_use_hardware_watchpoint): Change "vals" to a std::vector.
Tom Tromey [Wed, 4 Apr 2018 00:23:30 +0000 (18:23 -0600)]
Change value history to use value_ref_ptr
This simplifies the value history implementation by replacing the
current data structure with a std::vector, and by making the value
history simply hold a reference to each value.
gdb/ChangeLog
2018-04-06 Tom Tromey <tom@tromey.com>
Tom Tromey [Tue, 3 Apr 2018 23:58:58 +0000 (17:58 -0600)]
Change breakpoints to use value_ref_ptr
Now that value_ref_ptr exists, it is possible to simplify breakpoint
and bpstat memory management by using a value_ref_ptr rather than
manually handling the reference counts.
gdb/ChangeLog
2018-04-06 Tom Tromey <tom@tromey.com>
* value.c (release_value): Update.
* breakpoint.h (struct watchpoint) <val>: Now a value_ref_ptr.
(struct bpstats) <val>: Now a value_ref_ptr.
* breakpoint.c (update_watchpoint, breakpoint_init_inferior)
(~bpstats, bpstats, bpstat_clear_actions, watchpoint_check)
(~watchpoint, print_it_watchpoint, watch_command_1)
(invalidate_bp_value_on_memory_change): Update.
Tom Tromey [Tue, 3 Apr 2018 23:45:21 +0000 (17:45 -0600)]
Introduce a gdb_ref_ptr specialization for struct value
struct value is internally reference counted and so, while it also has
some ownership rules unique to it, it makes sense to use a gdb_ref_ptr
when managing it automatically.
This patch removes the existing unique_ptr specialization in favor of
a reference-counted pointer. It also introduces two other
clarifications:
1. Rename value_free to value_decref, which I think is more in line
with what the function actually does; and
2. Change release_value to return a gdb_ref_ptr. This change allows
us to remove the confusing release_value_or_incref function,
primarily by making it much simpler to reason about the result of
release_value.
gdb/ChangeLog
2018-04-06 Tom Tromey <tom@tromey.com>
Simon Marchi [Fri, 6 Apr 2018 20:11:51 +0000 (16:11 -0400)]
Add -Wno-error=deprecated-register to gdb build flags
As shown in PR 23022, building with clang-6 and Python 2 trips on the
fact that the Python 2 headers use the "register" keyword:
/usr/include/python2.7/unicodeobject.h:534:5: error: 'register' storage class specifier is deprecated and incompatible with C++17 [-Werror,-Wdeprecated-register]
register PyObject *obj, /* Object */
^~~~~~~~~
This patch adds -Wno-error=deprecated-register to our flags, so that we can
still see this class of warnings, but they don't cause a build failure.
H.J. Lu [Fri, 6 Apr 2018 12:06:08 +0000 (05:06 -0700)]
x86-64: Don't mask out R_X86_64_converted_reloc_bit
R_X86_64_converted_reloc_bit is set in elf_x86_64_convert_load_reloc
which is called from elf_x86_64_check_relocs. Since it is used only
internally by linker, there is no need to mask it out in
elf_x86_64_info_to_howto.
* elf64-x86-64.c (elf_x86_64_info_to_howto): Don't mask out
R_X86_64_converted_reloc_bit.
H.J. Lu [Thu, 5 Apr 2018 22:31:41 +0000 (15:31 -0700)]
Use dlsym to check if libdl is needed for plugin
config/plugins.m4 has
if test "$plugins" = "yes"; then
AC_SEARCH_LIBS([dlopen], [dl])
fi
Plugin uses dlsym, but libasan.so only intercepts dlopen, not dlsym:
[hjl@gnu-tools-1 binutils-text]$ nm -D /lib64/libasan.so.4| grep " dl" 0000000000038580 W dlclose
U dl_iterate_phdr 000000000004dc50 W dlopen
U dlsym
U dlvsym
[hjl@gnu-tools-1 binutils-text]$
Testing dlopen for libdl leads to false negative when -fsanitize=address
is used. It results in link failure:
../bfd/.libs/libbfd.a(plugin.o): undefined reference to symbol 'dlsym@@GLIBC_2.16'
dlsym should be used to check if libdl is needed for plugin.
MIPS/binutils/testsuite: Fix `.dc.l' typo in `strip-13mips64.s'
Fix a typo: `.dc.w' -> `.dc.l' in `strip-13mips64.s', correcting a bug
from commit 2f8ceb38991e ("binutils/testsuite: Support REL and MIPS64
reloc formats with `strip-13'"). For relocation format correctness only
as there is no observable change in test results due to the lack of
connection between the second relocation entry affected and the examined
error message produced.
binutils/
* testsuite/binutils-all/strip-13mips64.s: Use `.dc.l' rather
than `.dc.w' in second relocation.
James Cowgill [Thu, 5 Apr 2018 15:47:53 +0000 (08:47 -0700)]
MIPS: Fix GOT page counter in multi-got links
The record_got_page_entry function records and updates the maximum
number of GOT page entries which may be required by an object. In the
case where an existing GOT page entry was expanded, only the entry
belonging to output GOT would have its page count updated. This leaves
the entry belonging to the object GOT with the num_pages count of 1 it
was originally initialized with. Later on when GOTs are being merged in a
multi-got link, this causes the value of entry->num_pages in
add_got_page_entries to always be 1 and underestimates the number of pages
required for the new entry. This in turn leads to an assertion failure in
get_got_page_offset where we run out of pages.
Fix by obtaining the object's GOT entry unconditionally and not just
the first time it gets created. Now that entry2 is always valid, remove
the useless NULL checks.
gold/
PR gold/22770
* mips.cc (Mips_got_info::record_got_page_entry): Fetch existing
page entries for the object's GOT.
Nick Clifton [Thu, 5 Apr 2018 13:44:05 +0000 (14:44 +0100)]
Stop the IA64 linker from removing unwind tables when garbage collecting.
PR 23030
* emulparams/elf64_ia64.sh (OTHER_READONLY_SECTIONS): Make sure
that the .IA_64.unwind_info and .IA_64.unwind sections are not
subject to garbage collection.
Tom Tromey [Sat, 31 Mar 2018 18:52:57 +0000 (12:52 -0600)]
Remove typep and VEC(typep) from linespec.c
This removes VEC(typep) from linespec.c in favor of std::vector. It
also removes the "typep" typedef. This change allowed the removal of
some cleanups.
I believe the previous cleanup code in find_superclass_methods could
result in a memory leak, so this patch is an improvement in that way
as well.
ChangeLog
2018-04-05 Tom Tromey <tom@tromey.com>
* linespec.c (typep): Remove typedef.
(find_methods, find_superclass_methods): Take a std::vector.
(find_method): Use std::vector.
Tom Tromey [Sat, 31 Mar 2018 18:43:56 +0000 (12:43 -0600)]
More use of std::vector in linespec.c
This changes some spots in linespec.c to take a std::vector. This
patch spilled out to objc-lang.c a bit as well. This change allows
for the removal of some cleanups.
ChangeLog
2018-04-05 Tom Tromey <tom@tromey.com>
* utils.c (compare_strings): Remove.
* utils.h (compare_strings): Remove.
* objc-lang.h (find_imps): Update.
* objc-lang.c (find_methods): Take a std::vector.
(uniquify_strings, find_imps): Likewise.
* linespec.c (find_methods): Take a std::vector.
(decode_objc): Use std::vector.
(add_all_symbol_names_from_pspace, find_superclass_methods): Take
a std::vector.
(find_method, find_function_symbols): Use std::vector.
Tom Tromey [Sun, 1 Apr 2018 15:33:13 +0000 (09:33 -0600)]
Change streq to return bool
I wanted to use streq with std::unique in another (upcoming) patch in
this seres, so I changed it to return bool. To my surprise, this lead
to regressions. The cause turned out to be that streq was used as an
htab callback -- by casting it to the correct function type. This
sort of cast is invalid, so this patch adds a variant which is
directly suitable for use by htab. (Note that I did not add an
overload, as I could not get that to work with template deduction in
the other patch.)
Tom Tromey [Sat, 31 Mar 2018 17:01:55 +0000 (11:01 -0600)]
Return std::string from canonical_to_fullform
This changes canonical_to_fullform to return a std::string, and
changes decode_line_2 to use std::vector. This allows for the removal
of some cleanups.
ChangeLog
2018-04-05 Tom Tromey <tom@tromey.com>
* linespec.c (canonical_to_fullform): Return std::string.
(filter_results): Update.
(struct decode_line_2_item): Add constructor.
<fullform, displayform>: Now std::string.
(decode_line_2_compare_items): Now a std::sort comparator.
(decode_line_2): Update.
Tom Tromey [Sat, 31 Mar 2018 16:32:00 +0000 (10:32 -0600)]
Remove some cleanups from search_minsyms_for_name
This changes struct collect_minsyms to use a std::vector, which
enables the removal of a cleanup from search_minsyms_for_name. This
also changes iterate_over_minimal_symbols to take a
gdb::function_view, which makes a function in linespec.c more
type-safe.
ChangeLog
2018-04-05 Tom Tromey <tom@tromey.com>
* minsyms.h (iterate_over_minimal_symbols): Update.
* minsyms.c (iterate_over_minimal_symbols): Take a
gdb::function_view.
* linespec.c (struct collect_minsyms): Remove.
(compare_msyms): Now a std::sort comparator.
(add_minsym): Add parameters.
(search_minsyms_for_name): Update. Use std::vector.
binutils/testsuite: Tighten the error message check with `strip-13'
Avoid false positives and actually verify both that an `unsupported
relocation type 0x8f' message is produced and that no other message is,
except for the final `bad value', in the `strip-13' test. This ensures
that it is a relocation processing error and not a different issue that
has caused `strip' to terminate unsuccessfully, and that the number
representing the unsupported relocation has not been clobbered.
binutils/
* testsuite/binutils-all/strip-13.d: Also expect `unsupported
relocation type 0x8f' error message.
binutils/testsuite: Support REL and MIPS64 reloc formats with `strip-13'
Add source variants for the `strip-13' test that produce relocations in
the REL and MIPS64 formats, fixing a failure for the `mips64el-openbsd'
target. This also corrects output for `i*86-*', `i960-*', `m6812-*' and
`m68hc12-*', o32 `mips*-*', and `score*-*' targets, which however does
not show up as a test result change due to lax error message matching
causing `bad value' previously produced by `strip' as a result of input
file rejection to be accepted as a test pass.
For `m6811-*' aka `m68hc11-*' targets this causes a phantom regression,
because they use 16-bit addressing and therefore `.dc.a' emits 16-bit
quantities causing relocation data constructed in assembly not to be as
expected. Previously input was rejected by `strip' with a `bad value'
message and now it is accepted, however due to the relocation data error
the relocation number is not one of the unsupported ones and the tool
completes successfully, which scores as a test failure.
Disable the test case for `m6811-*' and `m68hc11-*' targets then, as it
is a test case bug rather than a problem with the relevant backend. A
separate change to the test case is required to correct this problem, at
which point the test case can be enabled for the affected targets.
binutils/
* testsuite/binutils-all/strip-13.s: Rename to...
* testsuite/binutils-all/strip-13rela.s: ... this.
* testsuite/binutils-all/strip-13rel.s: New test source.
* testsuite/binutils-all/strip-13mips64.s: New test source.
* testsuite/binutils-all/strip-13.d: Remove `arm-*', `d10v-*',
`dlx-*' and `xgate-*' from `not-target' list. Add `m6811-*' and
`m68hc11-*' to `not-target' list.
* testsuite/binutils-all/objcopy.exp: Switch between sources for
`strip-13'.
binutils/testsuite: Enable `strip-13' test for `hppa*-*'
Based on relocations defined in include/elf/*.h files we have relocation
numbers: 143, 159, 214 and 215 currently not used by any of our ELF
targets. Use 143 then instead of 241 to enable the `strip-13' test for
`hppa*-*' targets. It has a side effect with some targets of verifying
that unused relocations whose numbers are below the respective R_*_max
value are handled correctly.
binutils/
* testsuite/binutils-all/strip-13.s: Use 143 (0x8f) rather than
241 (0xf1) for the relocation number and RELA addend.
* testsuite/binutils-all/strip-13.d: Remove `hppa*-*' from the
`not-target' list.
H.J. Lu [Wed, 4 Apr 2018 11:36:44 +0000 (04:36 -0700)]
i386: Clear vex instead of vex.evex
"vex" has many fields to control how to decode an instruction. Clear
all fields in "vex" before decoding an instruction to avoid using values
left from the previous instruction.
gas/
PR binutils/23025
* testsuite/gas/i386/prefix.s: Add tests for vcvtpd2dq with
VEX and EVEX prefixes.
* testsuite/gas/i386/prefix.d: Updated.
opcodes/
PR binutils/23025
* i386-dis.c (get_valid_dis386): Don't set vex.prefix nor vex.w
to 0.
(print_insn): Clear vex instead of vex.evex.
Eric Botcazou [Wed, 4 Apr 2018 10:13:05 +0000 (12:13 +0200)]
Speed up direct linking with DLLs on Windows (2/2).
This patch deals with the generation of the import library on the fly.
The implementation is inefficient because the linker makes a lot of
calls to realloc and memmove when importing the symbols in order to
maintain a sorted list of symbols.
This is fixable by relying on the fact that, for every linked DLL,
the list of symbols it exports is already sorted so you can import
them en masse once you have found the insertion point.
ld/
* deffile.h (def_file_add_import_from): Declare.
(def_file_add_import_at): Likewise.
* deffilep.y (fill_in_import): New function extracted from...
(def_file_add_import): ...here. Call it.
(def_file_add_import_from): New function.
(def_file_add_import_at): Likewise.
* pe-dll.c (pe_implied_import_dll): Use an optimized version of the
insertion loop for imported symbols if possible.
Eric Botcazou [Wed, 4 Apr 2018 10:07:50 +0000 (12:07 +0200)]
Speed up direct linking with DLLs on Windows (1/2).
This patch deals with the auto-import feature. There are 2 versions
of this feature: the original one, which was piggybacked on the OS
loader with an optional help from the runtime (--enable-auto-import
--enable-runtime-pseudo-reloc-v1) and is still the one mostly
documented in the sources and manual; the enhanced one by Kai Tietz,
which is entirely piggybacked on the runtime (--enable-auto-import
--enable-runtime-pseudo-reloc-v2) and is the default for Mingw and
Cygwin nowadays.
The implementation is inefficient because of pe[p]_find_data_imports:
for every undefined symbol, the function walks the entire set of
relocations for all the input files and does a direct name comparison
for each of them.
This is easily fixable by using a hash-based map for v1 and a simple
hash table for v2. This patch leaves v1 alone and only changes v2.
It also factors out pe[p]_find_data_imports into a common function,
removes old cruft left and right, and attempts to better separate
the implementations of v1 and v2 in the code.
ld/
* emultempl/pe.em (U_SIZE): Delete.
(pe_data_import_dll): Likewise.
(make_import_fixup): Return void, take 4th parameter and pass it down
in call to pe_create_import_fixup.
(pe_find_data_imports): Move to...
(gld_${EMULATION_NAME}_after_open): Run the stdcall fixup pass after
the auto-import pass and add a guard before running the latter.
* emultempl/pep.em (U_SIZE): Delete.
(pep_data_import_dll): Likewise.
(make_import_fixup): Return void, take 4th parameter and pass it down
in call to pe_create_import_fixup.
(pep_find_data_imports): Move to...
(gld_${EMULATION_NAME}_after_open): Run the stdcall fixup pass after
the auto-import pass and add a guard before running the latter.
* pe-dll.c (runtime_pseudp_reloc_v2_init): Change type to bfd_boolean.
(pe_walk_relocs_of_symbol): Rename into...
(pe_walk_relocs): ...this. Add 2 more parameters,4th parameter to the
callback prototype and pass 4th parameter in calls to the callback.
If the import hash table is present, invoke the callback on the reloc
if the symbol name is in the table.
(pe_find_data_imports): ...here. Take 2 parameters. Build an import
hash table for the pseudo-relocation support version 2. When it is
built, walk the relocations only once at the end; when it is not, do
not build a fixup when the symbol isn't part of an import table.
Issue the associated warning only after a first fixup is built.
(tmp_seq2): Delete.
(make_singleton_name_imp): Likewise.
(make_import_fixup_mark): Return const char * and a stable string.
(make_import_fixup_entry): Do not deal with the pseudo-relocation
support version 2.
(make_runtime_pseudo_reloc): Factor out code and fix formatting.
(pe_create_import_fixup): Add 5th parameter. Clearly separate the
pseudo-relocation support version 2 from the rest. Fix formatting.
* pe-dll.h (pe_walk_relocs_of_symbol): Delete.
(pe_find_data_imports): Declare.
(pe_create_import_fixup): Add 5th parameter.
* pep-dll.c (pe_data_import_dll): Delete.
(pe_find_data_imports): Define.
(pe_walk_relocs_of_symbol): Delete.
* pep-dll.h (pep_walk_relocs_of_symbol): Delete.
(pep_find_data_imports): Declare.
(pep_create_import_fixup): Add 5th parameter.
* ld.texinfo (--enable-auto-import): Adjust to new implementation.
PR binutils/22875: HPPA/ELF: Also fail with relocation placeholders
Do not consider R_PARISC_UNIMPLEMENTED placeholder relocation entries of
the `elf_hppa_howto_table' table valid in `info_to_howto' HPPA handlers.
Instead issue an unsupported relocation type error and return a NULL
howto as with relocations whose number is R_PARISC_UNIMPLEMENTED or
beyond.
bfd/
* elf-hppa.h (elf_hppa_info_to_howto): Also return
unsuccessfully for unimplemented relocations.
(elf_hppa_info_to_howto_rel): Likewise.
Complement commit f3185997ac09 ("PR 22875: Stop strip corrupting unknown
relocs"), <https://sourceware.org/ml/binutils/2018-02/msg00445.html>,
and also set the `bfd_error_bad_value' error and report an unsupported
relocation type if a howto lookup fails with the i860 backend, fixing a
confusing `no error' error message and removing a binutils test failure:
failed with: <.../binutils/strip-new: tmpdir/bintest.o: no error>, expected: <.* bad value>
.../binutils/strip-new: tmpdir/bintest.o: no error
FAIL: binutils-all/strip-13
with the `i860-stardent-elf' target.
bfd/
* elf32-i860.c (lookup_howto): Add `abfd' parameter. Set the
`bfd_error_bad_value' error and call `_bfd_error_handler' on a
howto lookup failure.
(elf32_i860_reloc_type_lookup): Adjust `lookup_howto' call
accordingly.
(elf32_i860_info_to_howto_rela): Likewise.
(elf32_i860_relocate_splitn): Likewise.
(elf32_i860_relocate_pc16): Likewise.
(elf32_i860_relocate_pc26): Likewise.
(elf32_i860_relocate_section): Likewise.
PR binutils/22875: Visium/ELF: Prevent an out-of-bounds howto table access
Prevent an out-of-bounds `visium_elf_howto_table' table access in
`visium_info_to_howto_rela' by using the size of the table rather than
R_VISIUM_max to determine the number of entries in the contiguous
regular Visium relocation range defined and described in the table.
bfd/
* elf32-visium.c (visium_info_to_howto_rela): Correct the range
check for `visium_elf_howto_table' table access.
PR binutils/22875: IQ2000/ELF: Prevent an out-of-bounds howto table access
Prevent an out-of-bounds `iq2000_elf_howto_table' table access in
`iq2000_info_to_howto_rela' by using the size of the table rather than
R_IQ2000_max to determine the number of entries in the contiguous
regular IQ2000 relocation range defined and described in the table.
bfd/
* elf32-iq2000.c (iq2000_info_to_howto_rela): Correct the range
check for `iq2000_elf_howto_table' table access.
PR binutils/22875: FRV/ELF: Prevent an out-of-bounds howto table access
Prevent an out-of-bounds `elf32_frv_howto_table' table access in
`frv_info_to_howto_rela' by using the size of the table rather than
R_FRV_max to determine the number of entries in the contiguous regular
FRV relocation range defined and described in the table.
bfd/
* elf32-frv.c (frv_info_to_howto_rela): Correct the range check
for `elf32_frv_howto_table' table access.
PR binutils/22875: MIPS/ELF: Also fail with relocation placeholders
Do not consider placeholder EMPTY_HOWTO relocation entries valid in
`rtype_to_howto' MIPS handlers. Instead issue an unsupported relocation
type error and return a NULL howto as with relocations outside the three
ISA-specific min-max ranges.
bfd/
* elf32-mips.c (mips_elf32_rtype_to_howto): Also return
unsuccessfully for placeholder howtos.
* elf64-mips.c (mips_elf64_rtype_to_howto): Likewise.
* elfn32-mips.c (mips_elf_n32_rtype_to_howto): Likewise.
MIPS/LD/testsuite: Correct LD emulations for `mips*-*-kfreebsd*-gnu'
Complement commit 86b24e15c45b ("MIPS/LD/testsuite: Correct
comm-data.exp test ABI/emul/endian arrangement") and set LD emulations
correctly for `mips*-*-kfreebsd*-gnu' targets in comm-data.exp, removing
test suite failures:
FAIL: MIPS o32/copyreloc common symbol override test (auxiliary shared object build)
FAIL: MIPS o32/copyreloc common symbol override test
FAIL: MIPS o32/nocopyreloc common symbol override test (auxiliary shared object build)
FAIL: MIPS o32/nocopyreloc common symbol override test
ld/
* testsuite/ld-mips-elf/comm-data.exp: Correct support for
`mips*-*-kfreebsd*-gnu' targets.
Fix problem where mixed section types can cause internal error during a -r link.
During a -r (or --emit-relocs) link, if two sections had the same name but
different section types, gold would put relocations for both sections into
the same relocation section even though the data sections remained separate.
For .eh_frame sections, when one section is PROGBITS and another is
X86_64_UNWIND, we really should be using the UNWIND section type and
combining the sections anyway. For other sections, we should be
creating one relocation section for each output data section.
gold/
PR gold/23016
* incremental.cc (can_incremental_update): Check for unwind section
type.
* layout.h (Layout::layout): Add sh_type parameter.
* layout.cc (Layout::layout): Likewise.
(Layout::layout_reloc): Create new output reloc section if data
section does not already have one.
(Layout::layout_eh_frame): Check for unwind section type.
(Layout::make_eh_frame_section): Use unwind section type for .eh_frame
and .eh_frame_hdr.
* object.h (Sized_relobj_file::Shdr_write): New typedef.
(Sized_relobj_file::layout_section): Add sh_type parameter.
(Sized_relobj_file::Deferred_layout::Deferred_layout): Add sh_type
parameter.
* object.cc (Sized_relobj_file::check_eh_frame_flags): Check for
unwind section type.
(Sized_relobj_file::layout_section): Add sh_type parameter; pass it
to Layout::layout.
(Sized_relobj_file::do_layout): Make local copy of sh_type.
Force .eh_frame sections to unwind section type.
Pass sh_type to layout_section.
(Sized_relobj_file<size, big_endian>::do_layout_deferred_sections):
Pass sh_type to layout_section.
* output.cc (Output_section::Output_section): Initialize reloc_section_.
* output.h (Output_section::reloc_section): New method.
(Output_section::set_reloc_section): New method.
(Output_section::reloc_section_): New data member.
* target.h (Target::unwind_section_type): New method.
(Target::Target_info::unwind_section_type): New data member.
* testsuite/Makefile.am (pr23016_1, pr23016_2): New test cases.
* testsuite/Makefile.in: Regenerate.
* testsuite/testfile.cc: Add unwind_section_type.
* testsuite/pr23016_1.sh: New test script.
* testsuite/pr23016_1a.s: New source file.
* testsuite/pr23016_1b.s: New source file.
* testsuite/pr23016_2.sh: New test script.
* testsuite/pr23016_2a.s: New source file.
* testsuite/pr23016_2b.s: New source file.
Weimin Pan [Wed, 28 Mar 2018 19:23:48 +0000 (13:23 -0600)]
Fix infinite recursion when printing static member with typedef
The original problem was fixed (see related PR 22242). But using a typedef
as the declared type for a static member variable, as commented in this PR,
is still causing gdb to get into infinite loop when printing the static
member's value. This problem can be reproduced as follows:
% cat t.cc
class A {
typedef A type;
public:
bool operator==(const type& other) { return true; }
static const type INSTANCE;
};
const A A::INSTANCE;
int main() {
A a;
if (a == A::INSTANCE) {
return -1;
}
return 0;
}
% g++ -g t.cc
% gdb -ex "start" -ex "p a" a.out
The fix is rather trivial - in cp_print_static_field(), should call
check_typedef() to get the static member's real type and use it to
check whether it's a struct or an array.
As Simon suggested, I've added a new test case to the testsuite
and am passing the original type, not the real type, as argument
to both cp_print_value_fields() and val_print().
Re-tested on both aarch64-linux-gnu and amd64-linux-gnu. No regressions.
Simon Marchi [Fri, 30 Mar 2018 21:18:54 +0000 (17:18 -0400)]
Use std::vector in uploaded_tp
This patch changes the VEC(char_ptr) fields in uploaded_tp to use
std::vector<char *>. At first, I wanted to creep in more changes, like
using std::string, but it was making the patch too big and less focused,
so I decided to keep it to just that.
It also looks like the strings in those vectors are never free'd. If
so, we can fix that in another patch.
gdb/ChangeLog:
* tracepoint.h (struct uploaded_tp): Initialize fields.
<actions, step_actions, cmd_strings>: Change type to
std::vector<char *>.
* tracepoint.c (get_uploaded_tp): Allocate with new.
(free_uploaded_tps): Free with delete.
(parse_tracepoint_definition): Adjust to std::vector change.
* breakpoint.c (read_uploaded_action): Likewise.
(create_tracepoint_from_upload): Likewise.
* ctf.c (ctf_write_uploaded_tp): Likewise.
(SET_ARRAY_FIELD): Likewise.
* tracefile-tfile.c (tfile_write_uploaded_tp): Likewise.
Tom Tromey [Wed, 28 Mar 2018 21:35:46 +0000 (15:35 -0600)]
Remove free_dwo_file_cleanup
This removes free_dwo_file_cleanup, the last cleanup in dwarf2read.c.
This is replaced with a unique_ptr; which, despite the fact that a
dwo_file is obstack-allocated, seemed like the best fit.
gdb/ChangeLog
2018-03-30 Tom Tromey <tom@tromey.com>
* dwarf2read.c (struct free_dwo_file_cleanup_data): Remove.
(struct dwo_file_deleter): New.
(dwo_file_up): New typedef.
(open_and_init_dwo_file): Use dwo_file_up.
(free_dwo_file_cleanup): Remove.
Tom Tromey [Wed, 28 Mar 2018 21:04:30 +0000 (15:04 -0600)]
Remove free_cached_comp_units cleanups
This changes free_cached_comp_units from a cleanup function to an RAII
class.
gdb/ChangeLog
2018-03-30 Tom Tromey <tom@tromey.com>
* dwarf2read.c (class free_cached_comp_units): New class.
(dw2_instantiate_symtab, dwarf2_build_psymtabs_hard): Use it.
(free_cached_comp_units): Remove function.
Tom Tromey [Wed, 28 Mar 2018 21:49:24 +0000 (15:49 -0600)]
Remove make_cleanup_unpush_target
This removes make_cleanup_unpush_target, replacing it with a
unique_ptr. This may seem odd, because the object in question is not
actually freed, but unique_ptr provided the necessary functionality.
Tested by the buildbot.
gdb/ChangeLog
2018-03-30 Tom Tromey <tom@tromey.com>
Remove a duplicate `unsupported relocation type' message and the setting
of the `bfd_error_bad_value' error from `mips_elf32_rtype_to_howto',
added with commit f3185997ac09 ("PR 22875: Stop strip corrupting unknown
relocs"), <https://sourceware.org/ml/binutils/2018-02/msg00445.html>.
This message is already produced and the `bfd_error_bad_value' error set
by `mips_elf32_rtype_to_howto' before a NULL howto is returned, so there
is no need to repeat these actions here.
bfd/
* elf32-mips.c (mips_info_to_howto_rel): Remove the calls to
`_bfd_error_handler' and to set the `bfd_error_bad_value' error.
BFD/PA: Remove ATTRIBUTE_UNUSED from `elf_hppa_info_to_howto_rel'
Remove ATTRIBUTE_UNUSED annotation from the `abfd' parameter in
`elf_hppa_info_to_howto' now that commit f3185997ac09 ("PR 22875: Stop
strip corrupting unknown relocs"),
<https://sourceware.org/ml/binutils/2018-02/msg00445.html>, made it
used.
bfd/
* elf-hppa.h (elf_hppa_info_to_howto_rel): Remove
ATTRIBUTE_UNUSED from `abfd'.
MIPS/BFD: Call `mips_elf32_rtype_to_howto' directly with o32
Call `mips_elf32_rtype_to_howto' directly rather than via the
`->elf_backend_mips_rtype_to_howto' method in the o32 backend,
complementing commit 861fb55ab50a ("Defer allocation of R_MIPS_REL32 GOT
slots"), <https://sourceware.org/ml/binutils/2008-08/msg00096.html>, and
reverting the change to `mips_info_to_howto_rel' originally made with
commit 0a44bf6950b3 ("mips-vxworks support"),
<https://sourceware.org/ml/binutils/2006-03/msg00179.html>.
With `mips_vxworks_rtype_to_howto' gone there is a single backend method
used across all o32 targets, so there in no need for the indirection and
the associated extra cost. This also makes the o32 backend consistent
with the n32 and n64 backends.
bfd/
* elf32-mips.c (mips_info_to_howto_rel): Call
`mips_elf32_rtype_to_howto' directly rather than via
`->elf_backend_mips_rtype_to_howto'.
Renlin Li [Wed, 28 Mar 2018 17:06:05 +0000 (18:06 +0100)]
[2/2][LD][AARCH64]Add BFD_RELOC_AARCH64_TLSLE_LDST8/16/32/64_TPREL_LO12 support in LD.
This patch adds the following relocation support into binutils bfd linker.
BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12,
BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC,
BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12,
BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC,
BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12,
BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC,
BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12,
BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC.
Those relocations includes both ip64 and ilp32 variant.
Renlin Li [Wed, 28 Mar 2018 17:03:55 +0000 (18:03 +0100)]
[1/2][GAS][AARCH64]Add BFD_RELOC_AARCH64_TLSLE_LDST8/16/32/64_TPREL_LO12 support in GAS.
This patch adds the following relocation support into binutils gas.
BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12,
BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC,
BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12,
BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC,
BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12,
BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC,
BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12,
BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC.
Those relocations includes both ip64 and ilp32 variant.
Jan Beulich [Wed, 28 Mar 2018 12:25:07 +0000 (14:25 +0200)]
x86: drop VecESize
It again can be inferred from other information.
The vpopcntd templates all need to have Dword added to their memory
operands; the lack thereof was actually a bug preventing certain Intel
syntax code to assemble, so test cases get extended.
Jan Beulich [Wed, 28 Mar 2018 12:22:00 +0000 (14:22 +0200)]
x86: don't show suffixes for to-scalar-int conversion insns
In the course of folding their patterns (possible now that the pointless
and partly even bogus VecESize are no longer in the way) I've noticed
that vcvt*2usi, other than their vcvt*2si counterparts, don't allow for
any suffixes. As that is supposedly intentional, make the disassembler
consistently omit suffixes for all to-scalar-int conversion insns.
Eric Botcazou [Wed, 28 Mar 2018 10:17:15 +0000 (12:17 +0200)]
PR ld/22972 on SPARC.
This is a regression for the corner case of a hidden symbol in a PIC/PIE
binary which is subject to both a new-style GOTDATA relocation and an
old-style GOT relocation. In this case, depending on the link order,
the R_SPARC_RELATIVE dynamic relocation for the GOT slot needed because
of the old-style relocation can be replaced with R_SPARC_NONE coming
from the GOTDATA relocation.
The fix simply records whether an old-style GOT relocation is seen for a
symbol and prevents the R_SPARC_NONE from being generated in this case.
bfd/
* elfxx-sparc.c (struct _bfd_sparc_elf_link_hash_entry): Add new flag
has_old_style_got_reloc.
(_bfd_sparc_elf_check_relocs) <GOT relocations>: Set it for old-style
relocations. Fix a couple of long lines.
(_bfd_sparc_elf_relocate_section) <R_SPARC_GOTDATA_OP>: Do not generate
a R_SPARC_NONE for the GOT slot if the symbol is also subject to
old-style GOT relocations.
ld/
* testsuite/ld-sparc/sparc.exp: Add test for mixed GOTDATA/GOT relocs.
* testsuite/ld-sparc/gotop-hidden.c: New file.
* testsuite/ld-sparc/got-hidden32.s: Likewise.
* testsuite/ld-sparc/got-hidden64.s: Likewise.
* testsuite/ld-sparc/pass.out: Likewise.