mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-24 04:29:49 +00:00
Add --redefine-sym to objcopy.
This commit is contained in:
parent
c7e79b4bee
commit
57938635f5
@ -1,3 +1,32 @@
|
||||
2000-04-05 Alan Modra <alan@linuxcare.com.au>
|
||||
|
||||
* binutils.texi: Remove optional `=' from long options that have
|
||||
an `=' in the argument.
|
||||
* objcopy.1: Here too. Remove extra space on discard-all.
|
||||
|
||||
* binutils.texi (objcopy): Mention --redefine-sym.
|
||||
* objcopy.1: Here too.
|
||||
* NEWS: And here.
|
||||
|
||||
* objcopy.c (parse_flags): Split off flag names from error message
|
||||
gettext as they are not translated.
|
||||
(copy_main): Similarly split off option name for --add-section,
|
||||
--set-section-flags, --change-section-vma, --change-section-lma
|
||||
error messages.
|
||||
Some white space changes.
|
||||
|
||||
from Matthew Benjamin <matt@linuxbox.nu>
|
||||
* objcopy.c (struct redefine_node): New.
|
||||
(redefine_sym_list): New.
|
||||
(redefine_list_append): New.
|
||||
(lookup_sym_redefinition): New.
|
||||
(OPTION_REDEFINE_SYM): New.
|
||||
(copy_options): Add --redefine-sym option.
|
||||
(copy_usage): Mention it.
|
||||
(filter_symbols): Rename symbols on redefine_sym_list.
|
||||
(copy_object): Call filter_symbols if redefine_sym_list != NULL.
|
||||
(copy_main): Handle OPTION_REDEFINE_SYM.
|
||||
|
||||
2000-04-04 H.J. Lu <hjl@gnu.org>
|
||||
|
||||
* readelf.c (process_symbol_table): Correctly read in symbol
|
||||
|
@ -22,14 +22,16 @@ Changes in binutils 2.10:
|
||||
equivalent to --change-section-address. The other --adjust-* options are now
|
||||
renamed to --change-*, although --adjust-* continues to work.
|
||||
|
||||
* objcopy has a --redefine-sym option that lets you rename symbols.
|
||||
|
||||
* objcopy now takes a -j/--only-section option to copy only the specified
|
||||
sections.
|
||||
|
||||
* dlltool now supports the IMPORTS command.
|
||||
|
||||
* dlltool now takes --export-all-symbols, --no-export-all-symbols,
|
||||
--exclude-symbols, and --no-default-excludes options.
|
||||
|
||||
* objcopy now takes a -j/--only-section option to copy only the specified
|
||||
sections.
|
||||
|
||||
Changes in binutils 2.9:
|
||||
|
||||
* Added windres program, which can be used to manipulate resources in WIN32
|
||||
|
@ -878,14 +878,14 @@ objcopy [ -F @var{bfdname} | --target=@var{bfdname} ]
|
||||
[ --gap-fill=@var{val} ] [ --pad-to=@var{address} ]
|
||||
[ --set-start=@var{val} ] [ --adjust-start=@var{incr} ]
|
||||
[ --change-addresses=@var{incr} ]
|
||||
[ --change-section-address=@var{section}@{=,+,-@}@var{val} ]
|
||||
[ --change-section-lma=@var{section}@{=,+,-@}@var{val} ]
|
||||
[ --change-section-vma=@var{section}@{=,+,-@}@var{val} ]
|
||||
[ --change-section-address @var{section}@{=,+,-@}@var{val} ]
|
||||
[ --change-section-lma @var{section}@{=,+,-@}@var{val} ]
|
||||
[ --change-section-vma @var{section}@{=,+,-@}@var{val} ]
|
||||
[ --change-warnings ] [ --no-change-warnings ]
|
||||
[ --set-section-flags=@var{section}=@var{flags} ]
|
||||
[ --add-section=@var{sectionname}=@var{filename} ]
|
||||
[ --set-section-flags @var{section}=@var{flags} ]
|
||||
[ --add-section @var{sectionname}=@var{filename} ]
|
||||
[ --change-leading-char ] [ --remove-leading-char ]
|
||||
[ --weaken ]
|
||||
[ --redefine-sym @var{old}=@var{new} ] [ --weaken ]
|
||||
[ -v | --verbose ] [ -V | --version ] [ --help ]
|
||||
@var{infile} [@var{outfile}]
|
||||
@end smallexample
|
||||
@ -1137,6 +1137,11 @@ different conventions for symbol names. This is different from
|
||||
when appropriate, regardless of the object file format of the output
|
||||
file.
|
||||
|
||||
@item --redefine-sym @var{old}=@var{new}
|
||||
Change the name of a symbol @var{old}, to @var{new}. This can be useful
|
||||
when one is trying link two things together for which you have no
|
||||
source, and there are name collisions.
|
||||
|
||||
@item --weaken
|
||||
Change all global symbols in the file to be weak. This can be useful
|
||||
when building an object which will be linked against other objects using
|
||||
|
@ -38,15 +38,16 @@ objcopy \- copy and translate object files
|
||||
.RB "[\|" \-\-set\-start=\fIval\fR "\|]"
|
||||
.RB "[\|" \-\-change\-start=\fIincr\fR "\|]"
|
||||
.RB "[\|" \-\-change\-addresses=\fIincr\fR "\|]"
|
||||
.RB "[\|" \-\-change\-section\-address=\fIsection{=,+,-}val\fR "\|]"
|
||||
.RB "[\|" \-\-change\-section\-lma=\fIsection{=,+,-}val\fR "\|]"
|
||||
.RB "[\|" \-\-change\-section\-vma=\fIsection{=,+,-}val\fR "\|]"
|
||||
.RB "[\|" \-\-change\-section\-address\ \fIsection{=,+,-}val\fR "\|]"
|
||||
.RB "[\|" \-\-change\-section\-lma\ \fIsection{=,+,-}val\fR "\|]"
|
||||
.RB "[\|" \-\-change\-section\-vma\ \fIsection{=,+,-}val\fR "\|]"
|
||||
.RB "[\|" \-\-change\-warnings\fR "\|]"
|
||||
.RB "[\|" \-\-no\-change\-warnings\fR "\|]"
|
||||
.RB "[\|" \-\-set\-section\-flags=\fIsection=flags\fR "\|]"
|
||||
.RB "[\|" \-\-add\-section=\fIsectionname=filename\fR "\|]"
|
||||
.RB "[\|" \-\-set\-section\-flags\ \fIsection=flags\fR "\|]"
|
||||
.RB "[\|" \-\-add\-section\ \fIsectionname=filename\fR "\|]"
|
||||
.RB "[\|" \-\-change\-leading\-char\fR "\|]"
|
||||
.RB "[\|" \-\-remove\-leading\-char\fR "\|]"
|
||||
.RB "[\|" \-\-redefine\-sym\ \fIold=new\fR "\|]"
|
||||
.RB "[\|" \-\-weaken\fR "\|]"
|
||||
.RB "[\|" \-v\ |\ \-\-verbose\fR "\|]"
|
||||
.RB "[\|" \-V\ |\ \-\-version\fR "\|]"
|
||||
@ -159,7 +160,7 @@ visible externally. This option may be given more than once.
|
||||
.B \-W \fIsymbolname\fR, \fB\-\-weaken\-symbol=\fIsymbolname
|
||||
Make symbol \fIsymbolname\fP weak. This option may be given more than once.
|
||||
.TP
|
||||
.B \-x\fR, \fB \-\-discard\-all
|
||||
.B \-x\fR, \fB\-\-discard\-all
|
||||
Do not copy non-global symbols from the source file.
|
||||
.TP
|
||||
.B \-X\fR, \fB\-\-discard\-locals
|
||||
@ -214,7 +215,7 @@ the sections; if the program expects sections to be loaded at a
|
||||
certain address, and this option is used to change the sections such
|
||||
that they are loaded at a different address, the program may fail.
|
||||
.TP
|
||||
.B \fB\-\-change\-section\-address=\fIsection{=,+,-}val\fR, \fB\-\-adjust\-section\-vma=\fIsection{=,+,-}val
|
||||
.B \fB\-\-change\-section\-address\ \fIsection{=,+,-}val\fR, \fB\-\-adjust\-section\-vma\ \fIsection{=,+,-}val
|
||||
Set or changes the VMA and LMA addresses of the named \fIsection\fP.
|
||||
If \fI=\fP is used, the section address is set to \fIval\fP.
|
||||
Otherwise, \fIval\fP is added to or subtracted from the section
|
||||
@ -222,7 +223,7 @@ address. See the comments under \fB\-\-change\-addresses\fP, above. If
|
||||
\fIsection\fP does not exist in the input file, a warning will be
|
||||
issued, unless \fB\-\-no\-change\-warnings\fP is used.
|
||||
.TP
|
||||
.B \fB\-\-change\-section\-lma=\fIsection{=,+,-}val
|
||||
.B \fB\-\-change\-section\-lma\ \fIsection{=,+,-}val
|
||||
Set or change the LMA address of the named \fIsection\fP. If \fI=\fP is
|
||||
used, the section address is set to \fIval\fP. Otherwise, \fIval\fP
|
||||
is added to or subtracted from the section address. See the comments
|
||||
@ -230,7 +231,7 @@ under \fB\-\-change\-addresses\fP, above. If \fIsection\fP does not exist
|
||||
in the input file, a warning will be issued, unless
|
||||
\fB\-\-no\-change\-warnings\fP is used.
|
||||
.TP
|
||||
.B \fB\-\-change\-section\-vma=\fIsection{=,+,-}val
|
||||
.B \fB\-\-change\-section\-vma\ \fIsection{=,+,-}val
|
||||
Set or change the VMA address of the named \fIsection\fP. If \fI=\fP is
|
||||
used, the section address is set to \fIval\fP. Otherwise, \fIval\fP
|
||||
is added to or subtracted from the section address. See the comments
|
||||
@ -246,14 +247,14 @@ not exist, issue a warning. This is the default.
|
||||
Do not issue a warning if \fB\-\-change\-section\-XXX\fP is used, even
|
||||
if the named section does not exist.
|
||||
.TP
|
||||
.B \fB\-\-set\-section\-flags=\fIsection=flags
|
||||
.B \fB\-\-set\-section\-flags\ \fIsection=flags
|
||||
Set the flags for the named section. The \fIflags\fP argument is a
|
||||
comma separated string of flag names. The recognized names are
|
||||
\fIalloc\fP, \fIcontents\fP, \fIload\fP, \fInoload\fP, \fIreadonly\fP,
|
||||
\fIcode\fP, \fIdata\fP, \fIrom\fP, \fIshare\fP, and \fIdebug\fP. Not
|
||||
all flags are meaningful for all object file formats.
|
||||
.TP
|
||||
.B \fB\-\-add\-section=\fIsectionname=filename
|
||||
.B \fB\-\-add\-section\ \fIsectionname=filename
|
||||
Add a new section named \fIsectionname\fR while copying the file. The
|
||||
contents of the new section are taken from the file \fIfilename\fR.
|
||||
The size of the section will be the size of the file. This option
|
||||
@ -281,6 +282,11 @@ with different conventions for symbol names. This is different from
|
||||
\fB\-\-change\-leading\-char\fP because it always changes the symbol name
|
||||
when appropriate, regardless of the object file format of the output
|
||||
.TP
|
||||
.B \-\-redefine\-sym\ \fIold=new
|
||||
Change the name of symbol \fIold\fR to \fInew\fR. This can be useful
|
||||
when one is trying link two things together for which you have no
|
||||
source, and there are name collisions.
|
||||
.TP
|
||||
.B \-\-weaken
|
||||
Change all global symbols in the file to be weak.
|
||||
.TP
|
||||
|
@ -38,6 +38,14 @@ struct symlist
|
||||
struct symlist *next;
|
||||
};
|
||||
|
||||
/* A list to support redefine_sym. */
|
||||
struct redefine_node
|
||||
{
|
||||
char *source;
|
||||
char *target;
|
||||
struct redefine_node *next;
|
||||
};
|
||||
|
||||
static void copy_usage PARAMS ((FILE *, int));
|
||||
static void strip_usage PARAMS ((FILE *, int));
|
||||
static flagword parse_flags PARAMS ((const char *));
|
||||
@ -60,6 +68,8 @@ static void copy_file
|
||||
PARAMS ((const char *, const char *, const char *, const char *));
|
||||
static int strip_main PARAMS ((int, char **));
|
||||
static int copy_main PARAMS ((int, char **));
|
||||
static const char *lookup_sym_redefinition PARAMS((const char *));
|
||||
static void redefine_list_append PARAMS ((const char *, const char *));
|
||||
|
||||
#define RETURN_NONFATAL(s) {bfd_nonfatal (s); status = 1; return;}
|
||||
|
||||
@ -172,12 +182,13 @@ static boolean change_leading_char = false;
|
||||
|
||||
static boolean remove_leading_char = false;
|
||||
|
||||
/* List of symbols to strip, keep, localize, and weaken. */
|
||||
/* List of symbols to strip, keep, localize, weaken, or redefine. */
|
||||
|
||||
static struct symlist *strip_specific_list = NULL;
|
||||
static struct symlist *keep_specific_list = NULL;
|
||||
static struct symlist *localize_specific_list = NULL;
|
||||
static struct symlist *weaken_specific_list = NULL;
|
||||
static struct redefine_node *redefine_sym_list = NULL;
|
||||
|
||||
/* If this is true, we weaken global symbols (set BSF_WEAK). */
|
||||
|
||||
@ -202,6 +213,7 @@ static boolean weaken = false;
|
||||
#define OPTION_SET_START (OPTION_SET_SECTION_FLAGS + 1)
|
||||
#define OPTION_STRIP_UNNEEDED (OPTION_SET_START + 1)
|
||||
#define OPTION_WEAKEN (OPTION_STRIP_UNNEEDED + 1)
|
||||
#define OPTION_REDEFINE_SYM (OPTION_WEAKEN + 1)
|
||||
|
||||
/* Options to handle if running as "strip". */
|
||||
|
||||
@ -276,6 +288,7 @@ static struct option copy_options[] =
|
||||
{"version", no_argument, 0, 'V'},
|
||||
{"weaken", no_argument, 0, OPTION_WEAKEN},
|
||||
{"weaken-symbol", required_argument, 0, 'W'},
|
||||
{"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM},
|
||||
{0, no_argument, 0, 0}
|
||||
};
|
||||
|
||||
@ -335,6 +348,7 @@ copy_usage (stream, exit_status)
|
||||
--add-section <name>=<file> Add section <name> found in <file> to output\n\
|
||||
--change-leading-char Force output format's leading character style\n\
|
||||
--remove-leading-char Remove leading character from global symbols\n\
|
||||
--redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
|
||||
-v --verbose List all object files modified\n\
|
||||
-V --version Display this program's version number\n\
|
||||
-h --help Display this output\n\
|
||||
@ -423,7 +437,8 @@ parse_flags (s)
|
||||
strncpy (copy, s, len);
|
||||
copy[len] = '\0';
|
||||
non_fatal (_("unrecognized section flag `%s'"), copy);
|
||||
fatal (_("supported flags: alloc, load, noload, readonly, debug, code, data, rom, share, contents"));
|
||||
fatal (_("supported flags: %s"),
|
||||
"alloc, load, noload, readonly, debug, code, data, rom, share, contents");
|
||||
}
|
||||
|
||||
s = snext;
|
||||
@ -469,7 +484,7 @@ find_section_list (name, add)
|
||||
|
||||
/* Add a symbol to strip_specific_list. */
|
||||
|
||||
static void
|
||||
static void
|
||||
add_specific_symbol (name, list)
|
||||
const char *name;
|
||||
struct symlist **list;
|
||||
@ -549,6 +564,15 @@ filter_symbols (abfd, obfd, osyms, isyms, symcount)
|
||||
const char *name = bfd_asymbol_name (sym);
|
||||
int keep;
|
||||
|
||||
if (redefine_sym_list)
|
||||
{
|
||||
const char *old_name, *new_name;
|
||||
|
||||
old_name = bfd_asymbol_name (sym);
|
||||
new_name = lookup_sym_redefinition (old_name);
|
||||
name = bfd_asymbol_name (sym) = new_name;
|
||||
}
|
||||
|
||||
if (change_leading_char
|
||||
&& (bfd_get_symbol_leading_char (abfd)
|
||||
!= bfd_get_symbol_leading_char (obfd))
|
||||
@ -630,6 +654,64 @@ filter_symbols (abfd, obfd, osyms, isyms, symcount)
|
||||
return dst_count;
|
||||
}
|
||||
|
||||
static const char *
|
||||
lookup_sym_redefinition (source)
|
||||
const char *source;
|
||||
{
|
||||
const char *result;
|
||||
struct redefine_node *list;
|
||||
|
||||
result = source;
|
||||
|
||||
for (list = redefine_sym_list; list != NULL; list = list->next)
|
||||
{
|
||||
if (strcmp (source, list->source) == 0)
|
||||
{
|
||||
result = list->target;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Add a node to a symbol redefine list */
|
||||
|
||||
static void
|
||||
redefine_list_append (source, target)
|
||||
const char *source;
|
||||
const char *target;
|
||||
{
|
||||
struct redefine_node **p;
|
||||
struct redefine_node *list;
|
||||
struct redefine_node *new_node;
|
||||
|
||||
for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
|
||||
{
|
||||
if (strcmp (source, list->source) == 0)
|
||||
{
|
||||
fatal (_("%s: Multiple redefinition of symbol \"%s\""),
|
||||
"--redefine-sym",
|
||||
source);
|
||||
}
|
||||
|
||||
if (strcmp (target, list->target) == 0)
|
||||
{
|
||||
fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
|
||||
"--redefine-sym",
|
||||
target);
|
||||
}
|
||||
}
|
||||
|
||||
new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
|
||||
|
||||
new_node->source = strdup (source);
|
||||
new_node->target = strdup (target);
|
||||
new_node->next = NULL;
|
||||
|
||||
*p = new_node;
|
||||
}
|
||||
|
||||
|
||||
/* Keep only every `copy_byte'th byte in MEMHUNK, which is *SIZE bytes long.
|
||||
Adjust *SIZE. */
|
||||
|
||||
@ -690,13 +772,13 @@ copy_object (ibfd, obfd)
|
||||
non_fatal (_("Warning: Output file cannot represent architecture %s"),
|
||||
bfd_printable_arch_mach (bfd_get_arch (ibfd),
|
||||
bfd_get_mach (ibfd)));
|
||||
|
||||
|
||||
if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
|
||||
RETURN_NONFATAL (bfd_get_filename (ibfd));
|
||||
|
||||
if (isympp)
|
||||
free (isympp);
|
||||
|
||||
|
||||
if (osympp != isympp)
|
||||
free (osympp);
|
||||
|
||||
@ -722,7 +804,7 @@ copy_object (ibfd, obfd)
|
||||
else
|
||||
{
|
||||
flagword flags;
|
||||
|
||||
|
||||
if (! bfd_set_section_size (obfd, padd->section, padd->size))
|
||||
RETURN_NONFATAL (bfd_get_filename (obfd));
|
||||
|
||||
@ -734,7 +816,7 @@ copy_object (ibfd, obfd)
|
||||
flags = pset->flags | SEC_HAS_CONTENTS;
|
||||
else
|
||||
flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
|
||||
|
||||
|
||||
if (! bfd_set_section_flags (obfd, padd->section, flags))
|
||||
RETURN_NONFATAL (bfd_get_filename (obfd));
|
||||
|
||||
@ -743,11 +825,11 @@ copy_object (ibfd, obfd)
|
||||
if (pset->change_vma != CHANGE_IGNORE)
|
||||
if (! bfd_set_section_vma (obfd, padd->section, pset->vma_val))
|
||||
RETURN_NONFATAL (bfd_get_filename (obfd));
|
||||
|
||||
|
||||
if (pset->change_lma != CHANGE_IGNORE)
|
||||
{
|
||||
padd->section->lma = pset->lma_val;
|
||||
|
||||
|
||||
if (! bfd_set_section_alignment
|
||||
(obfd, padd->section,
|
||||
bfd_section_alignment (obfd, padd->section)))
|
||||
@ -846,16 +928,16 @@ copy_object (ibfd, obfd)
|
||||
symsize = bfd_get_symtab_upper_bound (ibfd);
|
||||
if (symsize < 0)
|
||||
RETURN_NONFATAL (bfd_get_filename (ibfd));
|
||||
|
||||
|
||||
osympp = isympp = (asymbol **) xmalloc (symsize);
|
||||
symcount = bfd_canonicalize_symtab (ibfd, isympp);
|
||||
if (symcount < 0)
|
||||
RETURN_NONFATAL (bfd_get_filename (ibfd));
|
||||
|
||||
|
||||
if (convert_debugging)
|
||||
dhandle = read_debugging_info (ibfd, isympp, symcount);
|
||||
|
||||
if (strip_symbols == STRIP_DEBUG
|
||||
|
||||
if (strip_symbols == STRIP_DEBUG
|
||||
|| strip_symbols == STRIP_ALL
|
||||
|| strip_symbols == STRIP_UNNEEDED
|
||||
|| discard_locals != LOCALS_UNDEF
|
||||
@ -868,11 +950,12 @@ copy_object (ibfd, obfd)
|
||||
|| convert_debugging
|
||||
|| change_leading_char
|
||||
|| remove_leading_char
|
||||
|| redefine_sym_list
|
||||
|| weaken)
|
||||
{
|
||||
/* Mark symbols used in output relocations so that they
|
||||
are kept, even if they are local labels or static symbols.
|
||||
|
||||
|
||||
Note we iterate over the input sections examining their
|
||||
relocations since the relocations for the output sections
|
||||
haven't been set yet. mark_symbols_used_in_relocations will
|
||||
@ -1135,13 +1218,13 @@ copy_file (input_filename, output_filename, input_target, output_target)
|
||||
else
|
||||
{
|
||||
bfd_nonfatal (input_filename);
|
||||
|
||||
|
||||
if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
|
||||
{
|
||||
list_matching_formats (matching);
|
||||
free (matching);
|
||||
}
|
||||
|
||||
|
||||
status = 1;
|
||||
}
|
||||
}
|
||||
@ -1182,7 +1265,7 @@ setup_section (ibfd, isection, obfdarg)
|
||||
return;
|
||||
|
||||
osection = bfd_make_section_anyway (obfd, bfd_section_name (ibfd, isection));
|
||||
|
||||
|
||||
if (osection == NULL)
|
||||
{
|
||||
err = "making";
|
||||
@ -1197,7 +1280,7 @@ setup_section (ibfd, isection, obfdarg)
|
||||
err = "size";
|
||||
goto loser;
|
||||
}
|
||||
|
||||
|
||||
vma = bfd_section_vma (ibfd, isection);
|
||||
if (p != NULL && p->change_vma == CHANGE_MODIFY)
|
||||
vma += p->vma_val;
|
||||
@ -1205,7 +1288,7 @@ setup_section (ibfd, isection, obfdarg)
|
||||
vma = p->vma_val;
|
||||
else
|
||||
vma += change_section_address;
|
||||
|
||||
|
||||
if (! bfd_set_section_vma (obfd, osection, vma))
|
||||
{
|
||||
err = "vma";
|
||||
@ -1224,7 +1307,7 @@ setup_section (ibfd, isection, obfdarg)
|
||||
}
|
||||
else
|
||||
lma += change_section_address;
|
||||
|
||||
|
||||
osection->lma = lma;
|
||||
|
||||
/* FIXME: This is probably not enough. If we change the LMA we
|
||||
@ -1294,7 +1377,7 @@ copy_section (ibfd, isection, obfdarg)
|
||||
complaints now. */
|
||||
if (status != 0)
|
||||
return;
|
||||
|
||||
|
||||
if ((bfd_get_section_flags (ibfd, isection) & SEC_DEBUGGING) != 0
|
||||
&& (strip_symbols == STRIP_DEBUG
|
||||
|| strip_symbols == STRIP_UNNEEDED
|
||||
@ -1322,7 +1405,7 @@ copy_section (ibfd, isection, obfdarg)
|
||||
relsize = bfd_get_reloc_upper_bound (ibfd, isection);
|
||||
if (relsize < 0)
|
||||
RETURN_NONFATAL (bfd_get_filename (ibfd));
|
||||
|
||||
|
||||
if (relsize == 0)
|
||||
bfd_set_reloc (obfd, osection, (arelent **) NULL, 0);
|
||||
else
|
||||
@ -1331,7 +1414,7 @@ copy_section (ibfd, isection, obfdarg)
|
||||
relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
|
||||
if (relcount < 0)
|
||||
RETURN_NONFATAL (bfd_get_filename (ibfd));
|
||||
|
||||
|
||||
if (strip_symbols == STRIP_ALL)
|
||||
{
|
||||
/* Remove relocations which are not in
|
||||
@ -1339,7 +1422,7 @@ copy_section (ibfd, isection, obfdarg)
|
||||
arelent **temp_relpp;
|
||||
long temp_relcount = 0;
|
||||
long i;
|
||||
|
||||
|
||||
temp_relpp = (arelent **) xmalloc (relsize);
|
||||
for (i = 0; i < relcount; i++)
|
||||
if (is_specified_symbol
|
||||
@ -1353,7 +1436,7 @@ copy_section (ibfd, isection, obfdarg)
|
||||
bfd_set_reloc (obfd, osection,
|
||||
(relcount == 0 ? (arelent **) NULL : relpp), relcount);
|
||||
}
|
||||
|
||||
|
||||
isection->_cooked_size = isection->_raw_size;
|
||||
isection->reloc_done = true;
|
||||
|
||||
@ -1365,7 +1448,7 @@ copy_section (ibfd, isection, obfdarg)
|
||||
size))
|
||||
RETURN_NONFATAL (bfd_get_filename (ibfd));
|
||||
|
||||
if (copy_byte >= 0)
|
||||
if (copy_byte >= 0)
|
||||
filter_bytes (memhunk, &size);
|
||||
|
||||
if (!bfd_set_section_contents (obfd, osection, memhunk, (file_ptr) 0,
|
||||
@ -1720,22 +1803,27 @@ copy_main (argc, argv)
|
||||
if (copy_byte < 0)
|
||||
fatal (_("byte number must be non-negative"));
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
interleave = atoi (optarg);
|
||||
if (interleave < 1)
|
||||
fatal (_("interleave must be positive"));
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
case 's': /* "source" - 'I' is preferred */
|
||||
input_target = optarg;
|
||||
break;
|
||||
|
||||
case 'O':
|
||||
case 'd': /* "destination" - 'O' is preferred */
|
||||
output_target = optarg;
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
input_target = output_target = optarg;
|
||||
break;
|
||||
|
||||
case 'j':
|
||||
p = find_section_list (optarg, true);
|
||||
if (p->remove)
|
||||
@ -1743,6 +1831,7 @@ copy_main (argc, argv)
|
||||
p->copy = true;
|
||||
sections_copied = true;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
p = find_section_list (optarg, true);
|
||||
if (p->copy)
|
||||
@ -1750,45 +1839,59 @@ copy_main (argc, argv)
|
||||
p->remove = true;
|
||||
sections_removed = true;
|
||||
break;
|
||||
|
||||
case 'S':
|
||||
strip_symbols = STRIP_ALL;
|
||||
break;
|
||||
|
||||
case 'g':
|
||||
strip_symbols = STRIP_DEBUG;
|
||||
break;
|
||||
|
||||
case OPTION_STRIP_UNNEEDED:
|
||||
strip_symbols = STRIP_UNNEEDED;
|
||||
break;
|
||||
|
||||
case 'K':
|
||||
add_specific_symbol (optarg, &keep_specific_list);
|
||||
break;
|
||||
|
||||
case 'N':
|
||||
add_specific_symbol (optarg, &strip_specific_list);
|
||||
break;
|
||||
|
||||
case 'L':
|
||||
add_specific_symbol (optarg, &localize_specific_list);
|
||||
break;
|
||||
|
||||
case 'W':
|
||||
add_specific_symbol (optarg, &weaken_specific_list);
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
preserve_dates = true;
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
discard_locals = LOCALS_ALL;
|
||||
break;
|
||||
|
||||
case 'X':
|
||||
discard_locals = LOCALS_START_L;
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
verbose = true;
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
show_version = true;
|
||||
break;
|
||||
|
||||
case OPTION_WEAKEN:
|
||||
weaken = true;
|
||||
break;
|
||||
|
||||
case OPTION_ADD_SECTION:
|
||||
{
|
||||
const char *s;
|
||||
@ -1799,9 +1902,9 @@ copy_main (argc, argv)
|
||||
FILE *f;
|
||||
|
||||
s = strchr (optarg, '=');
|
||||
|
||||
|
||||
if (s == NULL)
|
||||
fatal (_("bad format for --add-section NAME=FILENAME"));
|
||||
fatal (_("bad format for %s"), "--add-section");
|
||||
|
||||
if (stat (s + 1, & st) < 0)
|
||||
fatal (_("cannot stat: %s: %s"), s + 1, strerror (errno));
|
||||
@ -1820,10 +1923,10 @@ copy_main (argc, argv)
|
||||
|
||||
pa->contents = (bfd_byte *) xmalloc (pa->size);
|
||||
f = fopen (pa->filename, FOPEN_RB);
|
||||
|
||||
|
||||
if (f == NULL)
|
||||
fatal (_("cannot open: %s: %s"), pa->filename, strerror (errno));
|
||||
|
||||
|
||||
if (fread (pa->contents, 1, pa->size, f) == 0
|
||||
|| ferror (f))
|
||||
fatal (_("%s: fread failed"), pa->filename);
|
||||
@ -1834,9 +1937,11 @@ copy_main (argc, argv)
|
||||
add_sections = pa;
|
||||
}
|
||||
break;
|
||||
|
||||
case OPTION_CHANGE_START:
|
||||
change_start = parse_vma (optarg, "--change-start");
|
||||
break;
|
||||
|
||||
case OPTION_CHANGE_SECTION_ADDRESS:
|
||||
case OPTION_CHANGE_SECTION_LMA:
|
||||
case OPTION_CHANGE_SECTION_VMA:
|
||||
@ -1847,7 +1952,7 @@ copy_main (argc, argv)
|
||||
char *option = NULL;
|
||||
bfd_vma val;
|
||||
enum change_action what = CHANGE_IGNORE;
|
||||
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case OPTION_CHANGE_SECTION_ADDRESS:
|
||||
@ -1860,7 +1965,7 @@ copy_main (argc, argv)
|
||||
option = "--change-section-vma";
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
s = strchr (optarg, '=');
|
||||
if (s == NULL)
|
||||
{
|
||||
@ -1888,19 +1993,19 @@ copy_main (argc, argv)
|
||||
case '-': val = - val; /* Drop through. */
|
||||
case '+': what = CHANGE_MODIFY; break;
|
||||
}
|
||||
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case OPTION_CHANGE_SECTION_ADDRESS:
|
||||
p->change_vma = what;
|
||||
p->vma_val = val;
|
||||
/* Drop through. */
|
||||
|
||||
|
||||
case OPTION_CHANGE_SECTION_LMA:
|
||||
p->change_lma = what;
|
||||
p->lma_val = val;
|
||||
break;
|
||||
|
||||
|
||||
case OPTION_CHANGE_SECTION_VMA:
|
||||
p->change_vma = what;
|
||||
p->vma_val = val;
|
||||
@ -1908,19 +2013,24 @@ copy_main (argc, argv)
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case OPTION_CHANGE_ADDRESSES:
|
||||
change_section_address = parse_vma (optarg, "--change-addresses");
|
||||
change_start = change_section_address;
|
||||
break;
|
||||
|
||||
case OPTION_CHANGE_WARNINGS:
|
||||
change_warn = true;
|
||||
break;
|
||||
|
||||
case OPTION_CHANGE_LEADING_CHAR:
|
||||
change_leading_char = true;
|
||||
break;
|
||||
|
||||
case OPTION_DEBUGGING:
|
||||
convert_debugging = true;
|
||||
break;
|
||||
|
||||
case OPTION_GAP_FILL:
|
||||
{
|
||||
bfd_vma gap_fill_vma;
|
||||
@ -1930,25 +2040,61 @@ copy_main (argc, argv)
|
||||
if ((bfd_vma) gap_fill != gap_fill_vma)
|
||||
{
|
||||
char buff[20];
|
||||
|
||||
|
||||
sprintf_vma (buff, gap_fill_vma);
|
||||
|
||||
|
||||
non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
|
||||
buff, gap_fill);
|
||||
}
|
||||
gap_fill_set = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case OPTION_NO_CHANGE_WARNINGS:
|
||||
change_warn = false;
|
||||
break;
|
||||
|
||||
case OPTION_PAD_TO:
|
||||
pad_to = parse_vma (optarg, "--pad-to");
|
||||
pad_to_set = true;
|
||||
break;
|
||||
|
||||
case OPTION_REMOVE_LEADING_CHAR:
|
||||
remove_leading_char = true;
|
||||
break;
|
||||
|
||||
case OPTION_REDEFINE_SYM:
|
||||
{
|
||||
/* Push this redefinition onto redefine_symbol_list. */
|
||||
|
||||
int len;
|
||||
const char *s;
|
||||
const char *nextarg;
|
||||
char *source, *target;
|
||||
|
||||
s = strchr (optarg, '=');
|
||||
if (s == NULL)
|
||||
{
|
||||
fatal (_("bad format for %s"), "--redefine-sym");
|
||||
}
|
||||
|
||||
len = s - optarg;
|
||||
source = (char *) xmalloc (len + 1);
|
||||
strncpy (source, optarg, len);
|
||||
source[len] = '\0';
|
||||
|
||||
nextarg = s + 1;
|
||||
len = strlen (nextarg);
|
||||
target = (char *) xmalloc (len + 1);
|
||||
strcpy (target, nextarg);
|
||||
|
||||
redefine_list_append (source, target);
|
||||
|
||||
free (source);
|
||||
free (target);
|
||||
}
|
||||
break;
|
||||
|
||||
case OPTION_SET_SECTION_FLAGS:
|
||||
{
|
||||
const char *s;
|
||||
@ -1957,7 +2103,7 @@ copy_main (argc, argv)
|
||||
|
||||
s = strchr (optarg, '=');
|
||||
if (s == NULL)
|
||||
fatal (_("bad format for --set-section-flags"));
|
||||
fatal (_("bad format for %s"), "--set-section-flags");
|
||||
|
||||
len = s - optarg;
|
||||
name = (char *) xmalloc (len + 1);
|
||||
@ -1970,14 +2116,18 @@ copy_main (argc, argv)
|
||||
p->flags = parse_flags (s + 1);
|
||||
}
|
||||
break;
|
||||
|
||||
case OPTION_SET_START:
|
||||
set_start = parse_vma (optarg, "--set-start");
|
||||
set_start_set = true;
|
||||
break;
|
||||
|
||||
case 0:
|
||||
break; /* we've been given a long option */
|
||||
|
||||
case 'h':
|
||||
copy_usage (stdout, 0);
|
||||
|
||||
default:
|
||||
copy_usage (stderr, 1);
|
||||
}
|
||||
@ -2018,7 +2168,7 @@ copy_main (argc, argv)
|
||||
|
||||
copy_file (input_filename, tmpname, input_target, output_target);
|
||||
if (status == 0)
|
||||
{
|
||||
{
|
||||
if (preserve_dates)
|
||||
set_times (tmpname, &statbuf);
|
||||
smart_rename (tmpname, input_filename, preserve_dates);
|
||||
@ -2044,22 +2194,24 @@ copy_main (argc, argv)
|
||||
char buff [20];
|
||||
|
||||
sprintf_vma (buff, p->vma_val);
|
||||
|
||||
|
||||
/* xgettext:c-format */
|
||||
non_fatal (_("Warning: --change-section-vma %s%c0x%s never used"),
|
||||
non_fatal (_("%s %s%c0x%s never used"),
|
||||
"--change-section-vma",
|
||||
p->name,
|
||||
p->change_vma == CHANGE_SET ? '=' : '+',
|
||||
buff);
|
||||
}
|
||||
|
||||
|
||||
if (p->change_lma != CHANGE_IGNORE)
|
||||
{
|
||||
char buff [20];
|
||||
|
||||
sprintf_vma (buff, p->lma_val);
|
||||
|
||||
|
||||
/* xgettext:c-format */
|
||||
non_fatal (_("Warning: --change-section-lma %s%c0x%s never used"),
|
||||
non_fatal (_("%s %s%c0x%s never used"),
|
||||
"--change-section-lma",
|
||||
p->name,
|
||||
p->change_lma == CHANGE_SET ? '=' : '+',
|
||||
buff);
|
||||
|
Loading…
Reference in New Issue
Block a user