/* Test plugin for the GNU linker. Check non-object IR file as well as
get_input_file, get_view and release_input_file interfaces.
- Copyright (C) 2015 Free Software Foundation, Inc.
+ Copyright (C) 2015-2019 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
static bfd_boolean register_allsymbolsread_hook = FALSE;
static bfd_boolean register_cleanup_hook = FALSE;
static bfd_boolean dumpresolutions = FALSE;
+static bfd_boolean allsymbolsread_silent = FALSE;
/* The master list of all claimable/claimed files. */
static claim_file_t *claimfiles_list = NULL;
register_claimfile_hook = yesno;
else if (!strcmp ("allsymbolsread", whichhook))
register_allsymbolsread_hook = yesno;
+ else if (!strcmp ("allsymbolsreadsilent", whichhook))
+ {
+ register_allsymbolsread_hook = yesno;
+ allsymbolsread_silent = TRUE;
+ }
else if (!strcmp ("cleanup", whichhook))
register_cleanup_hook = yesno;
else
static enum ld_plugin_status
parse_option (const char *opt)
{
- if (!strncmp ("fail", opt, 4))
+ if (!strncmp ("fatal", opt, 5))
+ {
+ TV_MESSAGE (LDPL_FATAL, "Fatal error");
+ fflush (NULL);
+ }
+ else if (!strncmp ("error", opt, 5))
+ {
+ TV_MESSAGE (LDPL_ERROR, "Error");
+ fflush (NULL);
+ }
+ else if (!strncmp ("warning", opt, 7))
+ {
+ TV_MESSAGE (LDPL_WARNING, "Warning");
+ fflush (NULL);
+ }
+ else if (!strncmp ("fail", opt, 4))
return set_ret_val (opt + 4, LDPS_ERR);
else if (!strncmp ("pass", opt, 4))
return set_ret_val (opt + 4, LDPS_OK);
return LDPS_OK;
}
-/* Output contents of transfer vector array entry in human-readable form. */
-static void
-dump_tv_tag (size_t n, struct ld_plugin_tv *tv)
-{
- size_t tag;
- char unknownbuf[40];
- const char *name;
-
- for (tag = 0; tag < ARRAY_SIZE (tag_names); tag++)
- if (tag_names[tag].tag == tv->tv_tag)
- break;
- sprintf (unknownbuf, "unknown tag #%d", tv->tv_tag);
- name = (tag < ARRAY_SIZE (tag_names)) ? tag_names[tag].name : unknownbuf;
- switch (tv->tv_tag)
- {
- case LDPT_OPTION:
- case LDPT_OUTPUT_NAME:
- TV_MESSAGE (LDPL_INFO, "tv[%d]: %s '%s'", n, name,
- tv->tv_u.tv_string);
- break;
- case LDPT_REGISTER_CLAIM_FILE_HOOK:
- case LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK:
- case LDPT_REGISTER_CLEANUP_HOOK:
- case LDPT_ADD_SYMBOLS:
- case LDPT_GET_SYMBOLS:
- case LDPT_GET_SYMBOLS_V2:
- 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:
- TV_MESSAGE (LDPL_INFO, "tv[%d]: %s func@0x%p", n, name,
- (void *)(tv->tv_u.tv_message));
- break;
- case LDPT_NULL:
- case LDPT_API_VERSION:
- case LDPT_GOLD_VERSION:
- case LDPT_LINKER_OUTPUT:
- case LDPT_GNU_LD_VERSION:
- default:
- TV_MESSAGE (LDPL_INFO, "tv[%d]: %s value %W (%d)", n, name,
- (bfd_vma)tv->tv_u.tv_val, tv->tv_u.tv_val);
- break;
- }
-}
-
/* Handle/record information received in a transfer vector entry. */
static enum ld_plugin_status
parse_tv_tag (struct ld_plugin_tv *tv)
char buffer[30];
int fd;
char *filename;
- TV_MESSAGE (LDPL_INFO, "hook called: all symbols read.");
+ if (! allsymbolsread_silent)
+ TV_MESSAGE (LDPL_INFO, "hook called: all symbols read.");
for ( ; claimfile; claimfile = claimfile->next)
{
enum ld_plugin_status rv;
#define EXPECTED_VIEW "/* The first line of this file must match the expectation of"
#define EXPECTED_VIEW_LENGTH (sizeof (EXPECTED_VIEW) - 1)
if (file.filesize != SIZE_OF_FUNC_C
- || SIZE_OF_FUNC_C < sizeof EXPECTED_VIEW_LENGTH
+ || SIZE_OF_FUNC_C < EXPECTED_VIEW_LENGTH
|| memcmp (view, EXPECTED_VIEW, EXPECTED_VIEW_LENGTH) != 0)
{
char result[EXPECTED_VIEW_LENGTH + 1];
}
if (read (fd, buffer, sizeof (buffer)) >= 0)
{
- rv == LDPS_ERR;
TV_MESSAGE (LDPL_FATAL, "Unreleased file descriptor on: %s",
claimfile->file.name);
+ free (filename);
+ return LDPS_ERR;
}
free (filename);
}