aboutsummaryrefslogtreecommitdiff
path: root/bfd
AgeCommit message (Collapse)AuthorFilesLines
2024-09-13Automatic date update in version.inGDB Administrator1-1/+1
2024-09-12Automatic date update in version.inGDB Administrator1-1/+1
2024-09-11arm: Handle undefweak with ST_BRANCH_UNKNOWNChristophe Lyon1-1/+6
A previous patch made ld fail early on Thumb-only where branch_type is ST_BRANCH_UNKNOWN. However, this fails erroneously when the target is undefweak: in that case the branch should be replaced by a branch to the next instruction (or nop.w on thumb2). This patch accepts this case and restores the previous behaviour in such cases. This was reported by failures in the GCC testsuite, where we fail to link executables because __deregister_frame_info is undefweak: (__deregister_frame_info): Unknown destination type (ARM/Thumb) in ...crtbegin.o crtbegin.o: in function `__do_global_dtors_aux': crtstuff.c:(.text+0x52): dangerous relocation: unsupported relocation
2024-09-11Automatic date update in version.inGDB Administrator1-1/+1
2024-09-09bfd: Pass true to ld_plugin_object_pH.J. Lu1-1/+5
Since linker calls bfd_plugin_object_p, which calls ld_plugin_object_p, only for command-line input objects, pass true to ld_plugin_object_p so that the same input IR file won't be included twice if the new LTO hook, LDPT_REGISTER_CLAIM_FILE_HOOK_V2 isn't used. PR ld/32153 * plugin.c (bfd_plugin_object_p): Pass true to ld_plugin_object_p. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2024-09-10Automatic date update in version.inGDB Administrator1-1/+1
2024-09-09Automatic date update in version.inGDB Administrator1-1/+1
2024-09-08Automatic date update in version.inGDB Administrator1-1/+1
2024-09-07Not append rela for absolute symbolXin Wang1-1/+18
LoongArch: Not append rela for absolute symbol Use la.global to get absolute symbol like la.abs. la.global put address of a global symbol into a got entry and append a rela for it, which will be used to relocate by dynamic linker. Dynamic linker should not relocate for got entry of absolute symbol as it stores symval not symbol's address.
2024-09-07Add macros to get opcode of instructions approriatelyXin Wang1-33/+29
LoongArch: Add macros to get opcode and register of instructions appropriately Currently, we get opcode of an instruction by manipulate the binary with it's mask, it's a bit of a pain. Now a macro is defined to do this and a macro to get the RD and RJ registers which is applicable to most instructions of LoongArch are added.
2024-09-07Automatic date update in version.inGDB Administrator1-1/+1
2024-09-06bfd: Fix GCC warning when CFLAGS="-Og" is usedShahab Vahedi1-1/+1
This patch initializes the "op" variable in skip_cfa_op() function of bfd/elf-eh-frame.c to "0" at its declaration point to avoid the "maybe-uninitialized" warning. Building binutils on a system with GCC version 13.2.0 and a configure command that sets the optimization level to "-Og" leads to a build failure because of a warning being treated as an error: --------------------------------------------------------------------- $ ./configure CFLAGS="-Og" $ make ... CC elf-eh-frame.lo /src/gdb/bfd/elf-eh-frame.c: In function 'skip_cfa_op': /src/gdb/bfd/elf-eh-frame.c:354:33: error: 'op' may be used uninitialized [-Werror=maybe-uninitialized] 354 | switch (op & 0xc0 ? op & 0xc0 : op) | ~~~~~~~~~~~~~~~~~~~~~~^~~~ /src/gdb/bfd/elf-eh-frame.c:348:12: note: 'op' was declared here 348 | bfd_byte op; | ^~ cc1: all warnings being treated as errors ... --------------------------------------------------------------------- The relevant code snippet related to this warning looks like: --------------------------------------------------------------------- static inline bool read_byte (bfd_byte **iter, bfd_byte *end, unsigned char *result) { if (*iter >= end) return false; *result = *((*iter)++); return true; } static bool skip_cfa_op (bfd_byte **iter, bfd_byte *end,...) { bfd_byte op; if (!read_byte (iter, end, &op)) return false; switch (op & 0xc0 ? op & 0xc0 : op) ... } --------------------------------------------------------------------- This warning probably happens because "-Og" results in GCC not inlining the "read_byte()" function. Therefore, GCC treats its invocation inside "skip_cfa_op()" like a black box and that ends in the aforementioned warning. Acknowledgement: Lancelot Six -- for coming with the idea behind this fix. Jan Beulich -- for reviewing. bfd/ChangeLog: * elf-eh-frame.c (skip_cfa_op): Initialize the "op" variable.
2024-09-06bfd/PE: correct SizeOfImage calculationJan Beulich1-2/+2
We don't really want to align the last section's size to object alignment (when that section may itself not be aligned as much), we want image size to be a multiple thereof.
2024-09-06Automatic date update in version.inGDB Administrator1-1/+1
2024-09-05bfd/pdb: fix -Wmaybe-uninitialized warningMark Harmstone1-1/+1
Initialize stream0_start to fix spurious -Wmaybe-uninitialized warning on some versions of gcc.
2024-09-05PR32136, Use-of-uninitialized-memory in evax_bfd_print_imageAlan Modra1-15/+31
PR 32136 * vms-alpha.c (evax_bfd_print_image): Sanity check various string lengths.
2024-09-05LoongArch: Fixed ABI v1.00 TLS dynamic relocation generation bugLulu Cai1-47/+45
Commit "b67a17aa7c0c478a" modified the logic of allocating dynamic relocation space for TLS GD/IE, but only modified the logic of generation dynamic relocations for TLS GD/IE in ABI v2.00. When linking an object file of ABI v1.00 with bfd ld of ABI v2.00, it will cause an assertion failure. Modified the dynamic relocation generation logic of TLS GD/IE in ABI v1.00 to be consistent with ABI v2.00.
2024-09-05Automatic date update in version.inGDB Administrator1-1/+1
2024-09-04arm: Do not insert stubs needing Arm code on Thumb-only cores.Christophe Lyon1-12/+87
We recently fixed a bug in libgcc (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115360) where a symbol was missing a %function .type decoration. This meant the linker would silently pick the wrong type of 'farcall stub', involving Arm-mode instructions on Thumb-only CPUs. This patch emits an error instead, and warns in some other cases, to encourage users to add the missing '.type foo,%function' directive. In practice: in arm_type_of_stub() we no longer try to infer which stub to use if the destination is of unknown type and the CPU is Thumb-only; so we won't lie to elf32_arm_size_stubs() which does not check branch_type. If branch_type is ST_BRANCH_TO_ARM but the CPU is Thumb-only, we now convert it to ST_BRANCH_TO_THUMB only if the destination is of absolute type. This is to support the case where the destination of the branch is defined by the linker script (see thumb-b-lks-sym.s and thumb-bl-lks-sym.s testcases for instance). The motivating case is covered by the new farcall-missing-type testcase, where we now emit an error message. We do not emit an error when branch_type is ST_BRANCH_UNKNOWN and the CPU supports Arm-mode: a lot of legacy code (e.g. newlib's crt0.S) lacks the corresponding '.type foo, %function' directives and even a (too verbose) warning could be perceived as a nuisance. Existing testcases where such a warning would trigger: arm-static-app.s (app_func, app_func2) arm-rel32.s (foo) arm-app.s (app_func) rel32-reject.s () main) fix-arm1176.s (func_to_branch_to) but this list is not exhaustive. For the sake of clarity, the patch replaces occurrences of sym.st_target_internal = 0; with sym.st_target_internal = ST_BRANCH_TO_ARM; enum arm_st_branch_type is defined in include/elf/arm.h, and relies on ST_BRANCH_TO_ARM==0, as sym.st_target_internal is also initialized to 0 in other target-independent parts of BFD code. (For instance, swapping the ST_BRANCH_TO_ARM and ST_BRANCH_TO_THUMB entries in the enum definition leads to 'interesting' results...) Regarding the testsuite: * new expected warning for thumb-b-lks-sym and thumb-bl-lks-sym * new testcase farcall-missing-type to check the new error case * attr-merge-arch-2b.s, branch-futures (and bfs-1.s) updated to avoid a diagnostic Tested on arm-eabi and arm-pe with no regression.
2024-09-04bfd/pdb: fix bitmap generation in pdb_write_bitmapMark Harmstone1-9/+48
MSVC 2022 is more pedantic than MSVC 2019 when it comes to loading PDB files in readonly mode, and was rejecting PDB files generated by binutils because of their invalid free-space bitmaps. It's unknown what would have happened if you tried to use MS tools to modify a PDB created by binutils, but it probably would have led to a corrupted file. This patch fixes pdb_write_bitmap so we generate files that MSVC will accept. Specifically there were three things we were doing wrong: - We weren't including the superblock (block 0) - We were setting bits in bytes backwards (MSB to LSB, rather than LSB to MSB) - We should have been marking the contents of stream 0 as free. This is because, as the comment says, it's intended to be used for the directory for the previous write, to allow atomic updates.
2024-09-04Automatic date update in version.inGDB Administrator1-1/+1
2024-09-03RISC-V: Add support for XCVsimd extension in CV32E40PMary Bennett1-0/+5
Spec: https://docs.openhwgroup.org/projects/cv32e40p-user-manual/en/latest/instruction_set_extensions.html Contributors: Mary Bennett <mary.bennett682@gmail.com> Nandni Jamnadas <nandni.jamnadas@embecosm.com> Pietra Ferreira <pietra.ferreira@embecosm.com> Charlie Keaney Jessica Mills Craig Blackmore <craig.blackmore@embecosm.com> Simon Cook <simon.cook@embecosm.com> Jeremy Bennett <jeremy.bennett@embecosm.com> Helene Chelin <helene.chelin@embecosm.com> bfd/ChangeLog: * elfxx-riscv.c (riscv_multi_subset_supports): Add `xcvsimd` instruction class. (riscv_multi_subset_supports_ext): Likewise. gas/ChangeLog: * NEWS: Updated. * config/tc-riscv.c (validate_riscv_insn): Add custom operands. (riscv_ip): Likewise. * doc/c-riscv.texi: Note XCVsimd as an additional ISA extension for CORE-V. * testsuite/gas/riscv/march-help.l: Add xcvsimd. * testsuite/gas/riscv/x-cv-simd.d: New test. * testsuite/gas/riscv/x-cv-simd.s: New test. * testsuite/gas/riscv/x-cv-simd-fail.d: New test. * testsuite/gas/riscv/x-cv-simd-fail.l: New test. * testsuite/gas/riscv/x-cv-simd-fail.s: New test. include/ChangeLog: * opcode/riscv-opc.h: Add corresponding MATCH and MASK macros for XCVsimd. * opcode/riscv.h: Add corresponding EXTRACT and ENCODE macros for XCVsimd. (enum riscv_insn_class): Add the XCVsimd instruction class. opcodes/ChangeLog: * riscv-dis.c (print_insn_args): Add custom operands. * riscv-opc.c: Add XCVsimd instructions.
2024-09-03Automatic date update in version.inGDB Administrator1-1/+1
2024-09-02Automatic date update in version.inGDB Administrator1-1/+1
2024-09-01Automatic date update in version.inGDB Administrator1-1/+1
2024-08-31x86: Fix comment typos in TLS relocation checkH.J. Lu2-13/+13
R_386_TLS_IE is used only in movl foo@indntpoff, %eax movl foo@indntpoff, %reg addl foo@indntpoff, %reg R_386_TLS_DESC_CALL and R_X86_64_TLSDESC_CALL are used only in call *x@tlscall(%[er]ax) * elf32-i386.c (elf_i386_check_tls_transition): Use foo@indntpoff in comments for R_386_TLS_IE check. (elf_i386_tls_transition): Use @tlscall in comments for R_386_TLS_DESC_CALL check. * elf64-x86-64.c (elf_x86_64_tls_transition): Use @tlscall in comments for R_X86_64_TLSDESC_CALL check. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2024-08-31Automatic date update in version.inGDB Administrator1-1/+1
2024-08-30x86: Check invalid TLS descriptor callH.J. Lu2-41/+74
TLS descriptor call, call *x@tlsdesc(%rax) or call *x@tlsdesc(%eax) calls _dl_tlsdesc_return which expects that RAX/EAX points to the TLS descriptor. Update x86 linker to issue an error with or without TLS transition. bfd/ PR ld/32123 * elf32-i386.c (elf_i386_check_tls_transition): Move R_386_TLS_DESC_CALL to ... (elf_i386_tls_transition): Here. * elf64-x86-64.c (elf_x86_64_check_tls_transition): Move. R_X86_64_TLSDESC_CALL check to ... (elf_x86_64_tls_transition): Here. ld/ PR ld/32123 * testsuite/ld-i386/i386.exp: Run tlsgdesc3. * testsuite/ld-i386/tlsgdesc3.d: New file. * testsuite/ld-x86-64/tlsdesc5.d: Likewise. * testsuite/ld-x86-64/x86-64.exp: Run tlsdesc5. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2024-08-30Automatic date update in version.inGDB Administrator1-1/+1
2024-08-29Automatic date update in version.inGDB Administrator1-1/+1
2024-08-28x86: Report expected register for elf_x86_tls_error_indirect_callH.J. Lu2-6/+9
Since R_386_TLS_DESC_CALL can only be used with call *variable@TLSCALL(%eax) and R_X86_64_TLSDESC_CALL can only be used with call *variable@TLSCALL(%rax) update TLS transition error report to display the expected register in indirect CALL. bfd/ PR ld/32017 * elfxx-x86.c (_bfd_x86_elf_link_hash_table_create): Initialize the ax_register field. (_bfd_x86_elf_link_report_tls_transition_error): Report the expected register in elf_x86_tls_error_indirect_call error. * elfxx-x86.h (elf_x86_link_hash_table): Add ax_register. ld/ PR ld/32017 * testsuite/ld-i386/tlsgdesc2.d: Updated. * testsuite/ld-i386/tlsgdesc2.s: Change jmp to call via ECX. * testsuite/ld-x86-64/tlsdesc4.d: Updated. * testsuite/ld-x86-64/tlsdesc4.s: Change jmp to call via RCX. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2024-08-28Automatic date update in version.inGDB Administrator1-1/+1
2024-08-27Automatic date update in version.inGDB Administrator1-1/+1
2024-08-26LoongArch: Fix wrong relocation handling of symbols defined by PROVIDELulu Cai1-1/+1
If the symbol defined by PROVIDE in the link script is not in SECTION, the symbol is placed in the ABS section. The linker considers that symbols in the ABS section do not need to calculate PC relative offsets. Symbols in ABS sections should calculate PC relative offsets normally based on relocations.
2024-08-26PR32109, aborting at bfd/bfd.c:1236 in int _bfd_doprntAlan Modra1-8/+5
Since bfd_section for .strtab isn't set, print the section index instead. Also, don't return NULL on this error as that results in multiple mmap/read of the string table. (We could return NULL if we arranged to set sh_size zero first, but just what we do with fuzzed object files is of no concern, and terminating the table might make a faulty object file usable.) PR 32109 * elf.c (bfd_elf_get_str_section): Remove outdated comment, and tweak shstrtabsize test to suit. Don't use string tab bfd_section in error message, use index instead. Don't return NULL on unterminated string section, terminate it. (_bfd_elf_get_dynamic_symbols): Similarly terminate string table section.
2024-08-26Automatic date update in version.inGDB Administrator1-1/+1
2024-08-25Automatic date update in version.inGDB Administrator1-1/+1
2024-08-24Automatic date update in version.inGDB Administrator1-1/+1
2024-08-23Automatic date update in version.inGDB Administrator1-1/+1
2024-08-22Automatic date update in version.inGDB Administrator1-1/+1
2024-08-21Automatic date update in version.inGDB Administrator1-1/+1
2024-08-20Automatic date update in version.inGDB Administrator1-1/+1
2024-08-19Automatic date update in version.inGDB Administrator1-1/+1
2024-08-18Automatic date update in version.inGDB Administrator1-1/+1
2024-08-17Automatic date update in version.inGDB Administrator1-1/+1
2024-08-16Automatic date update in version.inGDB Administrator1-1/+1
2024-08-15lto: Don't include unused LTO archive members in outputH.J. Lu5-8/+22
When plugin_object_p is called by elf_link_is_defined_archive_symbol to check if a symbol in archive is a real definition, set archive member plugin_format to bfd_plugin_yes_unused to avoid including the unused LTO archive members in linker output. When plugin_object_p is called as known used, call plugin claim_file if plugin_format is bfd_plugin_unknown or bfd_plugin_yes_unused. To get the proper support for archives with LTO common symbols with GCC, the GCC fix for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116361 is needed. bfd/ PR ld/32083 * archures.c (bfd_arch_get_compatible): Treat bfd_plugin_yes_unused the same as bfd_plugin_yes. * elflink.c (elf_link_is_defined_archive_symbol): Likewise. * bfd.c (bfd_plugin_format): Add bfd_plugin_yes_unused. * plugin.c (try_claim): Try claim_file_v2 first. * bfd-in2.h: Regenerated. ld/ PR ld/32083 * plugin.c (plugin_call_claim_file): Add an argument to return if LDPT_REGISTER_CLAIM_FILE_HOOK_V2 is used. (plugin_object_p): When KNOWN_USED is false, we call plugin claim_file if plugin_format is bfd_plugin_unknown and set plugin_format to bfd_plugin_yes_unused on LTO object. When KNOWN_USED is true, we call plugin claim_file if plugin_format is bfd_plugin_unknown or bfd_plugin_yes_unused. Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
2024-08-15Automatic date update in version.inGDB Administrator1-1/+1
2024-08-14LoongArch: Fix DT_RELR and relaxation interactionXi Ruoyao1-0/+15
Due to the way BFD implements DT_RELR as a part of relaxation, if in a relax trip size_relative_relocs has changed the layout, when relax_section runs only the vma of the section being relaxed is guaranteed to be updated. Then bad thing can happen. For example, when linking an auxilary program _freeze_module in the Python 3.12.4 building system (with PGO + LTO), before sizing the .relr.dyn section, the vma of .text is 30560 and the vma of .rodata is 2350944; in the final executable the vma of .text is 36704 and the vma of .rodata is 2357024. The vma increase is expected because .relr.dyn is squashed somewhere before .text. But size_relative_relocs may see the state in which .text is at 36704 but .rodata "is" still at 2350944. Thus the distance between .text and .rodata can be under-estimated and overflowing R_LARCH_PCREL20_S2 reloc can be created. To avoid this issue, if size_relative_relocs is updating the size of .relr.dyn, just supress the normal relaxation in this relax trip. In this situation size_relative_relocs should have been demending the next relax trip, so the normal relaxation can happen in the next trip. I tried to make a reduced test case but failed. Signed-off-by: Xi Ruoyao <xry111@xry111.site>
2024-08-14LoongArch: Fix assertion failure with DT_RELRXi Ruoyao1-1/+2
In the DT_RELR implementation I missed a code path emiting relative reloc entries. Then the already packed relative reloc entries will be (unnecessarily) pushed into .rela.dyn but we've not allocated the space for them, triggering an assertion failure. Unfortunately I failed to notice the issue until profiled bootstrapping GCC with LTO and -Wl,-z,pack-relative-relocs. The failure can be easily triggered by linking a "hello world" program with -fprofile-generate and LTO: $ PATH=$HOME/ld-test:$PATH gcc hw.c -fprofile-generate -Wl,-z,pack-relative-relocs -flto /home/xry111/git-repos/binutils-build/TEST/ld: BFD (GNU Binutils) 2.43.50.20240802 assertion fail ../../binutils-gdb/bfd/elfnn-loongarch.c:2628 /home/xry111/git-repos/binutils-build/TEST/ld: BFD (GNU Binutils) 2.43.50.20240802 assertion fail ../../binutils-gdb/bfd/elfnn-loongarch.c:2628 collect2: error: ld returned 1 exit status And the reduced test case is just incredibly simple (included in the patch) so it seems I'm just stupid enough to fail to detect it before. Let's fix it now anyway. Signed-off-by: Xi Ruoyao <xry111@xry111.site>