mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
317ff0084b
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.
74 lines
2.5 KiB
C
74 lines
2.5 KiB
C
/* pe-dll.h: Header file for routines used to build Windows DLLs.
|
|
Copyright (C) 1999-2018 Free Software Foundation, Inc.
|
|
|
|
This file is part of the GNU Binutils.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
#ifndef PE_DLL_H
|
|
#define PE_DLL_H
|
|
|
|
#include "sysdep.h"
|
|
#include "bfd.h"
|
|
#include "bfdlink.h"
|
|
#include "deffile.h"
|
|
|
|
extern def_file *pe_def_file;
|
|
extern int pe_dll_export_everything;
|
|
extern int pe_dll_exclude_all_symbols;
|
|
extern int pe_dll_do_default_excludes;
|
|
extern int pe_dll_kill_ats;
|
|
extern int pe_dll_stdcall_aliases;
|
|
extern int pe_dll_warn_dup_exports;
|
|
extern int pe_dll_compat_implib;
|
|
extern int pe_dll_extra_pe_debug;
|
|
extern int pe_use_nul_prefixed_import_tables;
|
|
extern int pe_use_coff_long_section_names;
|
|
extern int pe_leading_underscore;
|
|
|
|
typedef enum { EXCLUDESYMS, EXCLUDELIBS, EXCLUDEFORIMPLIB } exclude_type;
|
|
|
|
extern void pe_dll_id_target
|
|
(const char *);
|
|
extern void pe_dll_add_excludes
|
|
(const char *, const exclude_type);
|
|
extern void pe_dll_generate_def_file
|
|
(const char *);
|
|
extern void pe_dll_generate_implib
|
|
(def_file *, const char *, struct bfd_link_info *);
|
|
extern void pe_process_import_defs
|
|
(bfd *, struct bfd_link_info *);
|
|
extern bfd_boolean pe_implied_import_dll
|
|
(const char *);
|
|
extern void pe_dll_build_sections
|
|
(bfd *, struct bfd_link_info *);
|
|
extern void pe_exe_build_sections
|
|
(bfd *, struct bfd_link_info *);
|
|
extern void pe_dll_fill_sections
|
|
(bfd *, struct bfd_link_info *);
|
|
extern void pe_exe_fill_sections
|
|
(bfd *, struct bfd_link_info *);
|
|
extern void pe_find_data_imports
|
|
(const char *, void (*cb) (arelent *, asection *, char *, const char *));
|
|
extern void pe_create_import_fixup
|
|
(arelent * rel, asection *, bfd_vma, char *, const char *);
|
|
extern bfd_boolean pe_bfd_is_dll
|
|
(bfd *);
|
|
extern void pe_output_file_set_long_section_names
|
|
(bfd *);
|
|
|
|
#endif /* PE_DLL_H */
|