bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug ld/12291] "ld -r" doesn't work with mixed IR/non-IR objects


From: cvs-commit at gcc dot gnu.org
Subject: [Bug ld/12291] "ld -r" doesn't work with mixed IR/non-IR objects
Date: Mon, 13 Jan 2025 21:27:13 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=12291

--- Comment #11 from Sourceware Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by H.J. Lu <hjl@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9b854f169df9b9853dc7284114beca8d8ab4f99f

commit 9b854f169df9b9853dc7284114beca8d8ab4f99f
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Mon Nov 4 09:17:45 2013 -0800

    ld: Add LTO and none-LTO output support for ld -r

    Link with mixed IR/non-IR objects

    * 2 kinds of object files
      o non-IR object file has
        * non-IR sections
      o IR object file has
        * IR sections
        * non-IR sections
        * The output of "ld -r" with mixed IR/non-IR objects should work with:
            o Compilers/linkers with IR support.
            o Compilers/linkers without IR support.
    * Add the mixed object file which has
      o IR sections
      o non-IR sections:
        * Object codes from IR sections.
        * Object codes from non-IR object files.
      o Object-only section:
        * With section name ".gnu_object_only" and SHT_GNU_OBJECT_ONLY type
        on ELF:
        https://gitlab.com/x86-psABIs/Linux-ABI
        #define SHT_GNU_OBJECT_ONLY 0x6ffffff8      /* Object only */
        * Contain non-IR object file.
        * Input is discarded after link.
    * Linker action:
      o Classify each input object file:
        * If there is a ".gnu_object_only" section, it is a mixed object file.
        * If there is a IR section, it is an IR object file.
        * Otherwise, it is a non-IR object file.
      o Relocatable non-IR link:
        * Prepare for an object-only output.
        * Prepare for a regular output.
        * For each mixed object file:
          * Add IR and non-IR sections to the regular output.
          * For object-only section:
            * Extract object only file.
            * Add it to the object-only output.
            * Discard object-only section.
        * For each IR object file:
          * Add IR and non-IR sections to the regular output.
        * For each non-IR object file:
          * Add non-IR sections to the regular output.
          * Add non-IR sections to the object-only output.
        * Final output:
          * If there are IR objects, non-IR objects and the object-only
          output isn't empty:
            * Put the object-only output into the object-only section.
            * Add the object-only section to the regular output.
            * Remove the object-only output.
      o Normal link and relocatable IR link:
        * Prepare for output.
        * IR link:
          * For each mixed object file:
            * Compile and add IR sections to the output.
            * Discard non-IR sections.
            * Object-only section:
              * Extract object only file.
              * Add it to the output.
              * Discard object-only section.
          * For each IR object file:
            * Compile and add IR sections to the output.
            * Discard non-IR sections.
          * For each non-IR object file:
            * Add non-IR sections to the output.
        * Non-IR link:
          * For each mixed object file:
            * Add non-IR sections to the output.
            * Discard IR sections and object-only section.
          * For each IR object file:
            * Add non-IR sections to the output.
            * Discard IR sections.
          * For each non-IR object file:
            * Add non-IR sections to the output.

    This is useful for Linux kernel build with LTO.

    bfd/

            PR ld/12291
            PR ld/12430
            PR ld/13298
            * bfd.c (bfd_lto_object_type): Add lto_mixed_object.
            (bfd): Add object_only_section.
            (bfd_group_signature): New.
            * elf.c (special_sections_g): Add .gnu_object_only.
            * format.c: Include "plugin-api.h" and "plugin.h" if
            BFD_SUPPORTS_PLUGINS is defined.
            (bfd_set_lto_type): Set type to lto_mixed_object for
            GNU_OBJECT_ONLY_SECTION_NAME section.
            (bfd_check_format_matches): Don't check the plugin target twice
            if the plugin target is explicitly specified.
            * opncls.c (bfd_extract_object_only_section): New.
            * plugin.c (bfd_plugin_fake_text_section): New.
            (bfd_plugin_fake_data_section): Likewise.
            (bfd_plugin_fake_bss_section): Likewise.
            (bfd_plugin_fake_common_section): Likewise.
            (bfd_plugin_get_symbols_in_object_only): Likewise.
            * plugin.c (add_symbols): Call
            bfd_plugin_get_symbols_in_object_only and count
            plugin_data->object_only_nsyms.
            (bfd_plugin_get_symtab_upper_bound): Count
            plugin_data->object_only_nsyms.
            bfd_plugin_get_symbols_in_object_only and add symbols from
            object only section.
            (bfd_plugin_canonicalize_symtab): Remove fake_section,
            fake_data_section, fake_bss_section and fake_common_section.
            Set udata.p to NULL.  Use bfd_plugin_fake_text_section,
            bfd_plugin_fake_data_section, bfd_plugin_fake_bss_section and
            bfd_plugin_fake_common_section.
            Set udata.p to NULL.
            * plugin.h (plugin_data_struct): Add object_only_nsyms and
            object_only_syms.
            * section.c (GNU_OBJECT_ONLY_SECTION_NAME): New.
            * bfd-in2.h: Regenerated.

    binutils/

            PR ld/12291
            PR ld/12430
            PR ld/13298
            * objcopy.c (group_signature): Removed.
            (is_strip_section): Replace group_signature with
            bfd_group_signature.
            (setup_section): Likewise.
            * readelf.c (get_os_specific_section_type_name): Handle
            SHT_GNU_OBJECT_ONLY.

    gas/

            PR ld/12291
            PR ld/12430
            PR ld/13298
            * testsuite/gas/elf/section9.s: Add the .gnu_object_only test.
            * testsuite/gas/elf/section9.d: Updated.

    include/

            PR ld/12291
            PR ld/12430
            PR ld/13298
            * elf/common.h (SHT_GNU_OBJECT_ONLY): New.

    ld/

            PR ld/12291
            PR ld/12430
            PR ld/13298
            * ld.h (ld_config_type): Add emit_gnu_object_only and
            emitting_gnu_object_only.
            * ldelf.c (orphan_init_done): Make it file scope.
            (ldelf_place_orphan): Rename hold to orig_hold.  Initialize hold
            from orig_hold at run-time.
            (ldelf_finish): New.
            * ldelf.h (ldelf_finish): New.
            * ldexp.c (ldexp_init): Take a bfd_boolean argument to supprt
            object-only output.
            (ldexp_finish): Likewise.
            * ldexp.h (ldexp_init): Take a bfd_boolean argument.
            (ldexp_finish): Likewise.
            * ldfile.c (ldfile_try_open_bfd): Call
            cmdline_check_object_only_section.
            * ldlang.c: Include "ldwrite.h" and elf-bfd.h.
            * ldlang.c (cmdline_object_only_file_list): New.
            (cmdline_object_only_archive_list): Likewise.
            (cmdline_temp_object_only_list): Likewise.
            (cmdline_lists_init): Likewise.
            (cmdline_list_new): Likewise.
            (cmdline_list_append): Likewise.
            (print_cmdline_list): Likewise.
            (cmdline_on_object_only_archive_list_p): Likewise.
            (cmdline_object_only_list_append): Likewise.
            (cmdline_get_object_only_input_files): Likewise.
            (cmdline_arg): Likewise.
            (setup_section): Likewise.
            (copy_section): Likewise.
            (cmdline_fopen_temp): Likewise.
            (cmdline_add_object_only_section): Likewise.
            (cmdline_emit_object_only_section): Likewise.
            (cmdline_extract_object_only_section): Likewise.
            (cmdline_check_object_only_section): Likewise.
            (cmdline_remove_object_only_files): Likewise.
            (lang_init): Take a bfd_boolean argument to supprt object-only
            output.  Call cmdline_lists_init.
            (load_symbols): Call cmdline_on_object_only_archive_list_p
            to check if an archive member should be loaded.
            (lang_process): Handle object-only link.
            * ldlang.h (lang_init): Take a bfd_boolean argument.
            (cmdline_enum_type): New.
            (cmdline_header_type): Likewise.
            (cmdline_file_type): Likewise.
            (cmdline_bfd_type): Likewise.
            (cmdline_union_type): Likewise.
            (cmdline_list_type): Likewise.
            (cmdline_emit_object_only_section): Likewise.
            (cmdline_check_object_only_section): Likewise.
            (cmdline_remove_object_only_files): Likewise.
            * ldmain.c (main): Call xatexit with
            cmdline_remove_object_only_files.  Pass FALSE to lang_init,
            ldexp_init and ldexp_finish.  Use ld_parse_linker_script.
            Set link_info.output_bfd to NULL after close.  Call
            cmdline_emit_object_only_section if needed.
            (add_archive_element): Call cmdline_check_object_only_section.
            (ld_parse_linker_script): New.
            * ldmain.h (ld_parse_linker_script): New.
            * plugin.c (plugin_maybe_claim): Call
            cmdline_check_object_only_section on claimed IR files.
            * scripttempl/elf.sc: Also discard .gnu_object_only sections.
            * scripttempl/elf64hppa.sc: Likewise.
            * scripttempl/elfxtensa.sc: Likewise.
            * scripttempl/mep.sc: Likewise.
            * scripttempl/pe.sc: Likewise.
            * scripttempl/pep.sc: Likewise.
            * emultempl/aarch64elf.em (gld${EMULATION_NAME}_finish): Replace
            finish_default with ldelf_finish.
            * emultempl/alphaelf.em (alpha_finish): Likewise.
            * emultempl/avrelf.em (avr_finish): Likewise.
            * emultempl/elf.em (ld_${EMULATION_NAME}_emulation): Likewise.
            * emultempl/ppc32elf.em (ppc_finish): Likewise.
            * emultempl/ppc64elf.em (gld${EMULATION_NAME}_finish): Likewise.
            * emultempl/spuelf.em (gld${EMULATION_NAME}_finish): Likewise.
            * testsuite/ld-plugin/lto-10.out: New file.
            * testsuite/ld-plugin/lto-10a.c: Likewise.
            * testsuite/ld-plugin/lto-10b.c: Likewise.
            * testsuite/ld-plugin/lto-10r.d: Likewise.
            * testsuite/ld-plugin/lto-4.out: Likewise.
            * testsuite/ld-plugin/lto-4a.c: Likewise.
            * testsuite/ld-plugin/lto-4b.c: Likewise.
            * testsuite/ld-plugin/lto-4c.c: Likewise.
            * testsuite/ld-plugin/lto-4r-a.d: Likewise.
            * testsuite/ld-plugin/lto-4r-b.d: Likewise.
            * testsuite/ld-plugin/lto-4r-c.d: Likewise.
            * testsuite/ld-plugin/lto-4r-d.d: Likewise.
            * testsuite/ld-plugin/lto.exp (lto_link_tests): Prepare for
            "LTO 4[acd]", "lto-4r-[abcd]" and "LTO 10" tests.
            (lto_run_tests): Add "LTO 4[acd]" and "LTO 10" tests.
            Build liblto-4.a.  Run "lto-4r-[abcd]" tests.
            Run lto-10r and create tmpdir/lto-10.o.
            Add test for nm on mixed LTO/non-LTO object.

    Signed-off-by: H.J. Lu <hjl.tools@gmail.com>

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]