LTO Plugin
Kai
LTO Plugin Interface
• lto-plugin/lto-plugin.c
• Exported interface: void onload(struct ld_plugin_tv *tv)
GCC plugin onload
• process transfer vector (tv)
• collect plugin options to lto-wrapper
• call register_claim_file (MUST have)
• call register_cleanup (optional)
• call register_all_symbols_read (optional)
• getenv (“COLLECT_GCC_OPTIONS”)
• check “-fno-use-linker-plugin”
Transfer Vector
tv_tag tv_val / tv_ptr
LDPT_MESSAGE message O
LDPT_API_VERSION 1
LDPT_GNU_LD_VERSION major * 100 + minor
LDPT_LINKER_OUTPUT LDPO_REL / LDPO_EXEC / LDPO_PIE / LDPO_DYN
LDPT_OUTPUT_NAME output_filename
LDPT_REGISTER_CLAIM_FILE_HOOK register_claim_file O
LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK register_all_symbols_read O
LDPT_REGISTER_CLEANUP_HOOK register_cleanup O
LDPT_ADD_SYMBOLS add_symbols O
LDPT_GET_INPUT_FILE get_input_file
LDPT_GET_VIEW get_view
LDPT_RELEASE_INPUT_FILE release_input_file
LDPT_GET_SYMBOLS get_symbols_v1 O
LDPT_GET_SYMBOLS_V2 get_symbols_v2 O
LDPT_ADD_INPUT_FILE add_input_file O
LDPT_ADD_INPUT_LIBRARY add_input_library O
LDPT_SET_EXTRA_LIBRARY_PATH set_extra_library_path
LDPT_OPTION $PREFIX/libexec/gcc/x86_64-unknown-linux-gnu/5.4.1/lto-wrapper
LDPT_OPTION -fresolution=/tmp/ccCVtp8y.res
LDPT_NULL 0
GCC Plugin Callbacks from
Linker
GCC Plugin
Callbacks
LD Functions
message message
add_symbols add_symbols
get_symbols_v2 get_symbols_v2
get_symbols get_symbols_v1
add_input_file add_input_file
add_input_library add_input_library
Linker Callbacks from GCC
Plugin
LD Callbacks GCC Functions
called_plugin->claim_file_handler claim_file_handler
called_plugin->all_symbols_read_handler all_symbols_read_handler
called_plugin->cleanup_handler cleanup_handler
claim_file_handler
• process symtab
• read out gnu.lto_.symtab
• use add_symbols to add symbols to linker
symbol table
• decide if the opened file is LTO object or not
all_symbols_read_handler
• write_resolution
• use get_symbols_v2 to find out symbol resolution
• prepare arguments for lto-wrapper
• put arguments into a file and pass the file to lto-wrapper
• execute lto-wrapper
• get result filenames after lto-wrapper
• use add_input_file to pass to the linker
cleanup_handler
• remove arguments file
• remove output files

LTO plugin

  • 1.
  • 2.
    LTO Plugin Interface •lto-plugin/lto-plugin.c • Exported interface: void onload(struct ld_plugin_tv *tv)
  • 3.
    GCC plugin onload •process transfer vector (tv) • collect plugin options to lto-wrapper • call register_claim_file (MUST have) • call register_cleanup (optional) • call register_all_symbols_read (optional) • getenv (“COLLECT_GCC_OPTIONS”) • check “-fno-use-linker-plugin”
  • 4.
    Transfer Vector tv_tag tv_val/ tv_ptr LDPT_MESSAGE message O LDPT_API_VERSION 1 LDPT_GNU_LD_VERSION major * 100 + minor LDPT_LINKER_OUTPUT LDPO_REL / LDPO_EXEC / LDPO_PIE / LDPO_DYN LDPT_OUTPUT_NAME output_filename LDPT_REGISTER_CLAIM_FILE_HOOK register_claim_file O LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK register_all_symbols_read O LDPT_REGISTER_CLEANUP_HOOK register_cleanup O LDPT_ADD_SYMBOLS add_symbols O LDPT_GET_INPUT_FILE get_input_file LDPT_GET_VIEW get_view LDPT_RELEASE_INPUT_FILE release_input_file LDPT_GET_SYMBOLS get_symbols_v1 O LDPT_GET_SYMBOLS_V2 get_symbols_v2 O LDPT_ADD_INPUT_FILE add_input_file O LDPT_ADD_INPUT_LIBRARY add_input_library O LDPT_SET_EXTRA_LIBRARY_PATH set_extra_library_path LDPT_OPTION $PREFIX/libexec/gcc/x86_64-unknown-linux-gnu/5.4.1/lto-wrapper LDPT_OPTION -fresolution=/tmp/ccCVtp8y.res LDPT_NULL 0
  • 5.
    GCC Plugin Callbacksfrom Linker GCC Plugin Callbacks LD Functions message message add_symbols add_symbols get_symbols_v2 get_symbols_v2 get_symbols get_symbols_v1 add_input_file add_input_file add_input_library add_input_library
  • 6.
    Linker Callbacks fromGCC Plugin LD Callbacks GCC Functions called_plugin->claim_file_handler claim_file_handler called_plugin->all_symbols_read_handler all_symbols_read_handler called_plugin->cleanup_handler cleanup_handler
  • 8.
    claim_file_handler • process symtab •read out gnu.lto_.symtab • use add_symbols to add symbols to linker symbol table • decide if the opened file is LTO object or not
  • 9.
    all_symbols_read_handler • write_resolution • useget_symbols_v2 to find out symbol resolution • prepare arguments for lto-wrapper • put arguments into a file and pass the file to lto-wrapper • execute lto-wrapper • get result filenames after lto-wrapper • use add_input_file to pass to the linker
  • 10.
    cleanup_handler • remove argumentsfile • remove output files