X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Ftestplug.c;h=2181d7a13bc474b7a676697f636cff1c75578758;hb=c3614cffc85be28c07ff5320fe5554e6717ee87c;hp=3be1ed4142d435c2089b045426fb37bd06b0c5b7;hpb=69ee6ab254ad1fd822840f9fd2c1907e13620467;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/testplug.c b/ld/testplug.c index 3be1ed4142..2181d7a13b 100644 --- a/ld/testplug.c +++ b/ld/testplug.c @@ -1,5 +1,5 @@ /* Test plugin for the GNU linker. - Copyright 2010 Free Software Foundation, Inc. + Copyright (C) 2010-2019 Free Software Foundation, Inc. This file is part of the GNU Binutils. @@ -24,6 +24,8 @@ /* For ARRAY_SIZE macro only - we don't link the library itself. */ #include "libiberty.h" +#include /* For isdigit. */ + extern enum ld_plugin_status onload (struct ld_plugin_tv *tv); static enum ld_plugin_status onclaim_file (const struct ld_plugin_input_file *file, int *claimed); @@ -87,6 +89,7 @@ static const tag_name_t tag_names[] = ADDENTRY(LDPT_ADD_INPUT_FILE), ADDENTRY(LDPT_MESSAGE), ADDENTRY(LDPT_GET_INPUT_FILE), + ADDENTRY(LDPT_GET_VIEW), ADDENTRY(LDPT_RELEASE_INPUT_FILE), ADDENTRY(LDPT_ADD_INPUT_LIBRARY), ADDENTRY(LDPT_OUTPUT_NAME), @@ -104,6 +107,7 @@ static ld_plugin_get_symbols tv_get_symbols_v2 = 0; static ld_plugin_add_input_file tv_add_input_file = 0; static ld_plugin_message tv_message = 0; static ld_plugin_get_input_file tv_get_input_file = 0; +static ld_plugin_get_view tv_get_view = 0; static ld_plugin_release_input_file tv_release_input_file = 0; static ld_plugin_add_input_library tv_add_input_library = 0; static ld_plugin_set_extra_library_path tv_set_extra_library_path = 0; @@ -137,6 +141,10 @@ static add_file_t *addfiles_list = NULL; /* We keep a tail pointer for easy linking on the end. */ static add_file_t **addfiles_tail_chain_ptr = &addfiles_list; +/* Number of bytes read in claim file before deciding if the file can be + claimed. */ +static int bytes_to_read_before_claim = 0; + /* Add a new claimfile on the end of the chain. */ static enum ld_plugin_status record_claim_file (const char *file) @@ -157,6 +165,25 @@ record_claim_file (const char *file) return LDPS_OK; } +/* How many bytes to read before claiming (or not) an input file. */ +static enum ld_plugin_status +record_read_length (const char *length) +{ + const char *tmp; + + tmp = length; + while (*tmp != '\0' && isdigit (*tmp)) + ++tmp; + if (*tmp != '\0' || *length == '\0') + { + fprintf (stderr, "APB: Bad length string: %s\n", tmp); + return LDPS_ERR; + } + + bytes_to_read_before_claim = atoi (length); + return LDPS_OK; +} + /* Add a new addfile on the end of the chain. */ static enum ld_plugin_status record_add_file (const char *file, addfile_enum_t type) @@ -168,7 +195,7 @@ record_add_file (const char *file, addfile_enum_t type) return LDPS_ERR; newfile->next = NULL; newfile->name = file; - newfile->type = type;; + newfile->type = type; /* Chain it on the end of the list. */ *addfiles_tail_chain_ptr = newfile; addfiles_tail_chain_ptr = &newfile->next; @@ -323,6 +350,8 @@ parse_option (const char *opt) return set_register_hook (opt + 10, FALSE); else if (!strncmp ("claim:", opt, 6)) return record_claim_file (opt + 6); + else if (!strncmp ("read:", opt, 5)) + return record_read_length (opt + 5); else if (!strncmp ("sym:", opt, 4)) return record_claimed_file_symbol (opt + 4); else if (!strncmp ("add:", opt, 4)) @@ -367,6 +396,7 @@ dump_tv_tag (size_t n, struct ld_plugin_tv *tv) case LDPT_ADD_INPUT_FILE: case LDPT_MESSAGE: case LDPT_GET_INPUT_FILE: + case LDPT_GET_VIEW: case LDPT_RELEASE_INPUT_FILE: case LDPT_ADD_INPUT_LIBRARY: case LDPT_SET_EXTRA_LIBRARY_PATH: @@ -433,6 +463,9 @@ parse_tv_tag (struct ld_plugin_tv *tv) case LDPT_GET_INPUT_FILE: SETVAR(tv_get_input_file); break; + case LDPT_GET_VIEW: + SETVAR(tv_get_view); + break; case LDPT_RELEASE_INPUT_FILE: SETVAR(tv_release_input_file); break; @@ -521,6 +554,20 @@ onload (struct ld_plugin_tv *tv) static enum ld_plugin_status onclaim_file (const struct ld_plugin_input_file *file, int *claimed) { + /* Possible read of some bytes out of the input file into a buffer. This + simulates a plugin that reads some file content in order to decide if + the file should be claimed or not. */ + if (bytes_to_read_before_claim > 0) + { + char *buffer = malloc (bytes_to_read_before_claim); + + if (buffer == NULL) + return LDPS_ERR; + if (read (file->fd, buffer, bytes_to_read_before_claim) < 0) + return LDPS_ERR; + free (buffer); + } + /* Let's see if we want to claim this file. */ claim_file_t *claimfile = claimfiles_list; while (claimfile)