};
-static char *temp_obj_dir_name;
+static char *arguments_file_name;
static ld_plugin_register_claim_file register_claim_file;
static ld_plugin_add_symbols add_symbols;
static ld_plugin_register_all_symbols_read register_all_symbols_read;
LDPV_HIDDEN
};
- entry->name = strdup (p);
+ entry->name = xstrdup (p);
while (*p)
p++;
p++;
if (strlen (entry->comdat_key) == 0)
entry->comdat_key = NULL;
else
- entry->comdat_key = strdup (entry->comdat_key);
+ entry->comdat_key = xstrdup (entry->comdat_key);
t = *p;
check (t <= 4, LDPL_FATAL, "invalid symbol kind found");
while (data < end)
{
n++;
- syms = realloc (syms, n * sizeof (struct ld_plugin_symbol));
+ syms = xrealloc (syms, n * sizeof (struct ld_plugin_symbol));
check (syms, LDPL_FATAL, "could not allocate memory");
- slots = realloc (slots, n * sizeof (uint32_t));
+ slots = xrealloc (slots, n * sizeof (uint32_t));
check (slots, LDPL_FATAL, "could not allocate memory");
data = parse_table_entry (data, &syms[n - 1], &slots[n - 1]);
}
claimed_files = NULL;
num_claimed_files = 0;
- free (temp_obj_dir_name);
- temp_obj_dir_name = NULL;
-
- if (resolution_file)
- {
- free (resolution_file);
- resolution_file = NULL;
- }
+ if (arguments_file_name)
+ free (arguments_file_name);
+ arguments_file_name = NULL;
}
/* Writes the relocations to disk. */
unsigned int i;
FILE *f;
- if (!resolution_file)
- return;
-
+ check (resolution_file, LDPL_FATAL, "resolution file not specified");
f = fopen (resolution_file, "w");
check (f, LDPL_FATAL, "could not open file");
{
uint32_t slot = symtab->slots[j];
unsigned int resolution = syms[j].resolution;
- fprintf (f, "%d %s\n", slot, lto_resolution_str[resolution]);
+ fprintf (f, "%d %s %s\n", slot, lto_resolution_str[resolution], syms[j].name);
}
}
fclose (f);
static void
add_output_files (FILE *f)
{
- char fname[1000]; /* FIXME: Remove this restriction. */
-
for (;;)
{
+ const unsigned piece = 32;
+ char *buf, *s = xmalloc (piece);
size_t len;
- char *s = fgets (fname, sizeof (fname), f);
- if (!s)
- break;
+ buf = s;
+cont:
+ if (!fgets (buf, piece, f))
+ break;
len = strlen (s);
- check (s[len - 1] == '\n', LDPL_FATAL, "file name too long");
+ if (s[len - 1] != '\n')
+ {
+ s = xrealloc (s, len + piece);
+ buf = s + len;
+ goto cont;
+ }
s[len - 1] = '\0';
num_output_files++;
- output_files = realloc (output_files, num_output_files * sizeof (char *));
- output_files[num_output_files - 1] = strdup (s);
+ output_files
+ = xrealloc (output_files, num_output_files * sizeof (char *));
+ output_files[num_output_files - 1] = s;
add_input_file (output_files[num_output_files - 1]);
}
}
static void
exec_lto_wrapper (char *argv[])
{
- int t;
+ int t, i;
int status;
char *at_args;
- char *args_name;
FILE *args;
FILE *wrapper_output;
char *new_argv[3];
const char *errmsg;
/* Write argv to a file to avoid a command line that is too long. */
- t = asprintf (&at_args, "@%s/arguments", temp_obj_dir_name);
- check (t >= 0, LDPL_FATAL, "asprintf failed");
+ arguments_file_name = make_temp_file ("");
+ check (arguments_file_name, LDPL_FATAL,
+ "Failed to generate a temorary file name");
- args_name = at_args + 1;
- args = fopen (args_name, "w");
+ args = fopen (arguments_file_name, "w");
check (args, LDPL_FATAL, "could not open arguments file");
t = writeargv (&argv[1], args);
t = fclose (args);
check (t == 0, LDPL_FATAL, "could not close arguments file");
+ at_args = concat ("@", arguments_file_name, NULL);
+ check (at_args, LDPL_FATAL, "could not allocate");
+
+ for (i = 1; argv[i]; i++)
+ {
+ char *a = argv[i];
+ if (a[0] == '-' && a[1] == 'v' && a[2] == '\0')
+ {
+ for (i = 0; argv[i]; i++)
+ fprintf (stderr, "%s ", argv[i]);
+ fprintf (stderr, "\n");
+ break;
+ }
+ }
+
new_argv[0] = argv[0];
new_argv[1] = at_args;
new_argv[2] = NULL;
if (debug)
{
- int i;
for (i = 0; new_argv[i]; i++)
fprintf (stderr, "%s ", new_argv[i]);
fprintf (stderr, "\n");
pex_free (pex);
- t = unlink (args_name);
- check (t == 0, LDPL_FATAL, "could not unlink arguments file");
free (at_args);
}
return LDPS_OK;
}
- lto_argv = (char **) calloc (sizeof (char *), num_lto_args);
+ lto_argv = (char **) xcalloc (sizeof (char *), num_lto_args);
lto_arg_ptr = (const char **) lto_argv;
assert (lto_wrapper_argv);
static enum ld_plugin_status
cleanup_handler (void)
{
+ unsigned int i;
int t;
- char *arguments;
- struct stat buf;
if (debug)
return LDPS_OK;
- /* If we are being called from an error handler, it is possible
- that the arguments file is still exists. */
- t = asprintf (&arguments, "%s/arguments", temp_obj_dir_name);
- check (t >= 0, LDPL_FATAL, "asprintf failed");
- if (stat(arguments, &buf) == 0)
+ if (arguments_file_name)
{
- t = unlink (arguments);
+ t = unlink (arguments_file_name);
check (t == 0, LDPL_FATAL, "could not unlink arguments file");
}
- free (arguments);
- t = rmdir (temp_obj_dir_name);
- check (t == 0, LDPL_FATAL, "could not remove temporary directory");
+ for (i = 0; i < num_output_files; i++)
+ {
+ t = unlink (output_files[i]);
+ check (t == 0, LDPL_FATAL, "could not unlink output file");
+ }
+
+ for (i = 0; i < num_output_files; i++)
+ {
+ t = unlink (output_files[i]);
+ check (t == 0, LDPL_FATAL, "could not unlink output file");
+ }
free_2 ();
return LDPS_OK;
Elf *archive;
off_t offset;
/* We pass the offset of the actual file, not the archive header. */
- int t = asprintf (&objname, "%s@%" PRId64, file->name,
+ int t = asprintf (&objname, "%s@0x%" PRIx64, file->name,
(int64_t) file->offset);
check (t >= 0, LDPL_FATAL, "asprintf failed");
lto_file.name = objname;
}
else
{
- lto_file.name = strdup (file->name);
+ lto_file.name = xstrdup (file->name);
elf = elf_begin (file->fd, ELF_C_READ, NULL);
}
lto_file.handle = file->handle;
*claimed = 1;
num_claimed_files++;
claimed_files =
- realloc (claimed_files,
- num_claimed_files * sizeof (struct plugin_file_info));
+ xrealloc (claimed_files,
+ num_claimed_files * sizeof (struct plugin_file_info));
claimed_files[num_claimed_files - 1] = lto_file;
goto cleanup;
debug = 1;
else if (strcmp (option, "-nop") == 0)
nop = 1;
- else if (!strncmp (option, "-resolution=", strlen("-resolution=")))
- {
- resolution_file = strdup (option + strlen("-resolution="));
- }
else if (!strncmp (option, "-pass-through=", strlen("-pass-through=")))
{
num_pass_through_items++;
- pass_through_items = realloc (pass_through_items,
- num_pass_through_items * sizeof (char *));
+ pass_through_items = xrealloc (pass_through_items,
+ num_pass_through_items * sizeof (char *));
pass_through_items[num_pass_through_items - 1] =
- strdup (option + strlen ("-pass-through="));
+ xstrdup (option + strlen ("-pass-through="));
}
else
{
int size;
+ char *opt = xstrdup (option);
lto_wrapper_num_args += 1;
size = lto_wrapper_num_args * sizeof (char *);
- lto_wrapper_argv = (char **) realloc (lto_wrapper_argv, size);
- lto_wrapper_argv[lto_wrapper_num_args - 1] = strdup(option);
+ lto_wrapper_argv = (char **) xrealloc (lto_wrapper_argv, size);
+ lto_wrapper_argv[lto_wrapper_num_args - 1] = opt;
+ if (strncmp (option, "-fresolution=", sizeof ("-fresolution=") - 1) == 0)
+ resolution_file = opt + sizeof ("-fresolution=") - 1;
}
}
{
struct ld_plugin_tv *p;
enum ld_plugin_status status;
- char *t;
unsigned version = elf_version (EV_CURRENT);
check (version != EV_NONE, LDPL_FATAL, "invalid ELF version");
"could not register the all_symbols_read callback");
}
- temp_obj_dir_name = strdup ("tmp_objectsXXXXXX");
- t = mkdtemp (temp_obj_dir_name);
- assert (t == temp_obj_dir_name);
return LDPS_OK;
}