forked from KolibriOS/kolibrios
binutils: build AR.
git-svn-id: svn://kolibrios.org@5219 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
ea910a143c
commit
3e62747fb5
36
contrib/toolchain/binutils/bfd/plugin.h
Normal file
36
contrib/toolchain/binutils/bfd/plugin.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/* Plugin support for BFD.
|
||||||
|
Copyright 2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of BFD, the Binary File Descriptor library.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||||
|
MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifndef _PLUGIN_H_
|
||||||
|
#define _PLUGIN_H_
|
||||||
|
|
||||||
|
#include "bfd.h"
|
||||||
|
|
||||||
|
void bfd_plugin_set_program_name (const char *);
|
||||||
|
void bfd_plugin_set_plugin (const char *);
|
||||||
|
|
||||||
|
typedef struct plugin_data_struct
|
||||||
|
{
|
||||||
|
int nsyms;
|
||||||
|
const struct ld_plugin_symbol *syms;
|
||||||
|
}
|
||||||
|
plugin_data_struct;
|
||||||
|
|
||||||
|
#endif
|
@ -1,4 +1,3 @@
|
|||||||
NAME= objcopy-new
|
|
||||||
|
|
||||||
LIB_DIR:= $(SDK_DIR)/lib
|
LIB_DIR:= $(SDK_DIR)/lib
|
||||||
|
|
||||||
@ -20,22 +19,37 @@ LDFLAGS = -static -nostdlib --stack 12582912 -T$(SDK_DIR)/sources/newlib/app.lds
|
|||||||
|
|
||||||
|
|
||||||
SRCS = \
|
SRCS = \
|
||||||
|
arparse.c arlex.c ar.c \
|
||||||
|
not-ranlib.c arsup.c \
|
||||||
|
binemul.c emul_vanilla.c \
|
||||||
objcopy.c not-strip.c rename.c \
|
objcopy.c not-strip.c rename.c \
|
||||||
rddbg.c debug.c stabs.c ieee.c \
|
rddbg.c debug.c stabs.c ieee.c \
|
||||||
rdcoff.c wrstabs.c bucomm.c \
|
rdcoff.c wrstabs.c bucomm.c \
|
||||||
version.c filemode.c
|
version.c filemode.c
|
||||||
|
|
||||||
|
OCOPY = \
|
||||||
|
objcopy.o not-strip.o rename.o \
|
||||||
|
rddbg.o debug.o stabs.o ieee.o \
|
||||||
|
rdcoff.o wrstabs.o bucomm.o \
|
||||||
|
version.o filemode.o
|
||||||
|
|
||||||
|
OAR = \
|
||||||
OBJS = $(patsubst %.cpp, %.o, $(patsubst %.c, %.o, $(SRCS)))
|
arparse.o arlex.o ar.o \
|
||||||
|
not-ranlib.o arsup.o rename.o \
|
||||||
|
binemul.o emul_vanilla.o \
|
||||||
|
bucomm.o version.o filemode.o
|
||||||
|
|
||||||
# targets
|
# targets
|
||||||
|
|
||||||
all: $(NAME)
|
all: objcopy ar
|
||||||
|
|
||||||
$(NAME): $(OBJS) Makefile
|
objcopy: $(OCOPY) Makefile
|
||||||
$(LD) $(LDFLAGS) $(LIBPATH) -o $@ $(OBJS) $(LIBS)
|
$(LD) $(LDFLAGS) $(LIBPATH) -o $@ $(OCOPY) $(LIBS)
|
||||||
kos32-objcopy $@ kos32-objcopy -O binary
|
kos32-objcopy $@ -O binary
|
||||||
|
|
||||||
|
ar: $(OAR) Makefile
|
||||||
|
$(LD) $(LDFLAGS) $(LIBPATH) -o $@ $(OAR) $(LIBS)
|
||||||
|
kos32-objcopy $@ -O binary
|
||||||
|
|
||||||
%.o : %.c Makefile
|
%.o : %.c Makefile
|
||||||
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $<
|
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
|
1478
contrib/toolchain/binutils/binutils/ar.c
Normal file
1478
contrib/toolchain/binutils/binutils/ar.c
Normal file
File diff suppressed because it is too large
Load Diff
2036
contrib/toolchain/binutils/binutils/arlex.c
Normal file
2036
contrib/toolchain/binutils/binutils/arlex.c
Normal file
File diff suppressed because it is too large
Load Diff
1770
contrib/toolchain/binutils/binutils/arparse.c
Normal file
1770
contrib/toolchain/binutils/binutils/arparse.c
Normal file
File diff suppressed because it is too large
Load Diff
102
contrib/toolchain/binutils/binutils/arparse.h
Normal file
102
contrib/toolchain/binutils/binutils/arparse.h
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
/* A Bison parser, made by GNU Bison 2.3. */
|
||||||
|
|
||||||
|
/* Skeleton interface for Bison's Yacc-like parsers in C
|
||||||
|
|
||||||
|
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, you may create a larger work that contains
|
||||||
|
part or all of the Bison parser skeleton and distribute that work
|
||||||
|
under terms of your choice, so long as that work isn't itself a
|
||||||
|
parser generator using the skeleton or a modified version thereof
|
||||||
|
as a parser skeleton. Alternatively, if you modify or redistribute
|
||||||
|
the parser skeleton itself, you may (at your option) remove this
|
||||||
|
special exception, which will cause the skeleton and the resulting
|
||||||
|
Bison output files to be licensed under the GNU General Public
|
||||||
|
License without this special exception.
|
||||||
|
|
||||||
|
This special exception was added by the Free Software Foundation in
|
||||||
|
version 2.2 of Bison. */
|
||||||
|
|
||||||
|
/* Tokens. */
|
||||||
|
#ifndef YYTOKENTYPE
|
||||||
|
# define YYTOKENTYPE
|
||||||
|
/* Put the tokens into the symbol table, so that GDB and other debuggers
|
||||||
|
know about them. */
|
||||||
|
enum yytokentype {
|
||||||
|
NEWLINE = 258,
|
||||||
|
VERBOSE = 259,
|
||||||
|
FILENAME = 260,
|
||||||
|
ADDLIB = 261,
|
||||||
|
LIST = 262,
|
||||||
|
ADDMOD = 263,
|
||||||
|
CLEAR = 264,
|
||||||
|
CREATE = 265,
|
||||||
|
DELETE = 266,
|
||||||
|
DIRECTORY = 267,
|
||||||
|
END = 268,
|
||||||
|
EXTRACT = 269,
|
||||||
|
FULLDIR = 270,
|
||||||
|
HELP = 271,
|
||||||
|
QUIT = 272,
|
||||||
|
REPLACE = 273,
|
||||||
|
SAVE = 274,
|
||||||
|
OPEN = 275
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
/* Tokens. */
|
||||||
|
#define NEWLINE 258
|
||||||
|
#define VERBOSE 259
|
||||||
|
#define FILENAME 260
|
||||||
|
#define ADDLIB 261
|
||||||
|
#define LIST 262
|
||||||
|
#define ADDMOD 263
|
||||||
|
#define CLEAR 264
|
||||||
|
#define CREATE 265
|
||||||
|
#define DELETE 266
|
||||||
|
#define DIRECTORY 267
|
||||||
|
#define END 268
|
||||||
|
#define EXTRACT 269
|
||||||
|
#define FULLDIR 270
|
||||||
|
#define HELP 271
|
||||||
|
#define QUIT 272
|
||||||
|
#define REPLACE 273
|
||||||
|
#define SAVE 274
|
||||||
|
#define OPEN 275
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
||||||
|
typedef union YYSTYPE
|
||||||
|
#line 38 "arparse.y"
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
struct list *list ;
|
||||||
|
|
||||||
|
}
|
||||||
|
/* Line 1529 of yacc.c. */
|
||||||
|
#line 95 "arparse.h"
|
||||||
|
YYSTYPE;
|
||||||
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||||
|
# define YYSTYPE_IS_DECLARED 1
|
||||||
|
# define YYSTYPE_IS_TRIVIAL 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern YYSTYPE yylval;
|
||||||
|
|
481
contrib/toolchain/binutils/binutils/arsup.c
Normal file
481
contrib/toolchain/binutils/binutils/arsup.c
Normal file
@ -0,0 +1,481 @@
|
|||||||
|
/* arsup.c - Archive support for MRI compatibility
|
||||||
|
Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003,
|
||||||
|
2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU Binutils.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||||
|
MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
|
||||||
|
/* Contributed by Steve Chamberlain
|
||||||
|
sac@cygnus.com
|
||||||
|
|
||||||
|
This file looks after requests from arparse.y, to provide the MRI
|
||||||
|
style librarian command syntax + 1 word LIST. */
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
|
#include "bfd.h"
|
||||||
|
#include "libiberty.h"
|
||||||
|
#include "filenames.h"
|
||||||
|
#include "bucomm.h"
|
||||||
|
#include "arsup.h"
|
||||||
|
|
||||||
|
static void map_over_list
|
||||||
|
(bfd *, void (*function) (bfd *, bfd *), struct list *);
|
||||||
|
static void ar_directory_doer (bfd *, bfd *);
|
||||||
|
static void ar_addlib_doer (bfd *, bfd *);
|
||||||
|
|
||||||
|
extern int verbose;
|
||||||
|
|
||||||
|
static bfd *obfd;
|
||||||
|
static char *real_name;
|
||||||
|
static FILE *outfile;
|
||||||
|
|
||||||
|
static void
|
||||||
|
map_over_list (bfd *arch, void (*function) (bfd *, bfd *), struct list *list)
|
||||||
|
{
|
||||||
|
bfd *head;
|
||||||
|
|
||||||
|
if (list == NULL)
|
||||||
|
{
|
||||||
|
bfd *next;
|
||||||
|
|
||||||
|
head = arch->archive_next;
|
||||||
|
while (head != NULL)
|
||||||
|
{
|
||||||
|
next = head->archive_next;
|
||||||
|
function (head, (bfd *) NULL);
|
||||||
|
head = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct list *ptr;
|
||||||
|
|
||||||
|
/* This may appear to be a baroque way of accomplishing what we
|
||||||
|
want. however we have to iterate over the filenames in order
|
||||||
|
to notice where a filename is requested but does not exist in
|
||||||
|
the archive. Ditto mapping over each file each time -- we
|
||||||
|
want to hack multiple references. */
|
||||||
|
for (ptr = list; ptr; ptr = ptr->next)
|
||||||
|
{
|
||||||
|
bfd_boolean found = FALSE;
|
||||||
|
bfd *prev = arch;
|
||||||
|
|
||||||
|
for (head = arch->archive_next; head; head = head->archive_next)
|
||||||
|
{
|
||||||
|
if (head->filename != NULL
|
||||||
|
&& FILENAME_CMP (ptr->name, head->filename) == 0)
|
||||||
|
{
|
||||||
|
found = TRUE;
|
||||||
|
function (head, prev);
|
||||||
|
}
|
||||||
|
prev = head;
|
||||||
|
}
|
||||||
|
if (! found)
|
||||||
|
fprintf (stderr, _("No entry %s in archive.\n"), ptr->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
ar_directory_doer (bfd *abfd, bfd *ignore ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
print_arelt_descr(outfile, abfd, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_directory (char *ar_name, struct list *list, char *output)
|
||||||
|
{
|
||||||
|
bfd *arch;
|
||||||
|
|
||||||
|
arch = open_inarch (ar_name, (char *) NULL);
|
||||||
|
if (output)
|
||||||
|
{
|
||||||
|
outfile = fopen(output,"w");
|
||||||
|
if (outfile == 0)
|
||||||
|
{
|
||||||
|
outfile = stdout;
|
||||||
|
fprintf (stderr,_("Can't open file %s\n"), output);
|
||||||
|
output = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
outfile = stdout;
|
||||||
|
|
||||||
|
map_over_list (arch, ar_directory_doer, list);
|
||||||
|
|
||||||
|
bfd_close (arch);
|
||||||
|
|
||||||
|
if (output)
|
||||||
|
fclose (outfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
prompt (void)
|
||||||
|
{
|
||||||
|
extern int interactive;
|
||||||
|
|
||||||
|
if (interactive)
|
||||||
|
{
|
||||||
|
printf ("AR >");
|
||||||
|
fflush (stdout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
maybequit (void)
|
||||||
|
{
|
||||||
|
if (! interactive)
|
||||||
|
xexit (9);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_open (char *name, int t)
|
||||||
|
{
|
||||||
|
char *tname = (char *) xmalloc (strlen (name) + 10);
|
||||||
|
const char *bname = lbasename (name);
|
||||||
|
real_name = name;
|
||||||
|
|
||||||
|
/* Prepend tmp- to the beginning, to avoid file-name clashes after
|
||||||
|
truncation on filesystems with limited namespaces (DOS). */
|
||||||
|
sprintf (tname, "%.*stmp-%s", (int) (bname - name), name, bname);
|
||||||
|
obfd = bfd_openw (tname, NULL);
|
||||||
|
|
||||||
|
if (!obfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: Can't open output archive %s\n"),
|
||||||
|
program_name, tname);
|
||||||
|
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!t)
|
||||||
|
{
|
||||||
|
bfd **ptr;
|
||||||
|
bfd *element;
|
||||||
|
bfd *ibfd;
|
||||||
|
|
||||||
|
ibfd = bfd_openr (name, NULL);
|
||||||
|
|
||||||
|
if (!ibfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr,_("%s: Can't open input archive %s\n"),
|
||||||
|
program_name, name);
|
||||||
|
maybequit ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bfd_check_format(ibfd, bfd_archive))
|
||||||
|
{
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: file %s is not an archive\n"),
|
||||||
|
program_name, name);
|
||||||
|
maybequit ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = &(obfd->archive_head);
|
||||||
|
element = bfd_openr_next_archived_file (ibfd, NULL);
|
||||||
|
|
||||||
|
while (element)
|
||||||
|
{
|
||||||
|
*ptr = element;
|
||||||
|
ptr = &element->archive_next;
|
||||||
|
element = bfd_openr_next_archived_file (ibfd, element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bfd_set_format (obfd, bfd_archive);
|
||||||
|
|
||||||
|
obfd->has_armap = 1;
|
||||||
|
obfd->is_thin_archive = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ar_addlib_doer (bfd *abfd, bfd *prev)
|
||||||
|
{
|
||||||
|
/* Add this module to the output bfd. */
|
||||||
|
if (prev != NULL)
|
||||||
|
prev->archive_next = abfd->archive_next;
|
||||||
|
|
||||||
|
abfd->archive_next = obfd->archive_head;
|
||||||
|
obfd->archive_head = abfd;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_addlib (char *name, struct list *list)
|
||||||
|
{
|
||||||
|
if (obfd == NULL)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: no output archive specified yet\n"), program_name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bfd *arch;
|
||||||
|
|
||||||
|
arch = open_inarch (name, (char *) NULL);
|
||||||
|
if (arch != NULL)
|
||||||
|
map_over_list (arch, ar_addlib_doer, list);
|
||||||
|
|
||||||
|
/* Don't close the bfd, since it will make the elements disappear. */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_addmod (struct list *list)
|
||||||
|
{
|
||||||
|
if (!obfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: no open output archive\n"), program_name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (list)
|
||||||
|
{
|
||||||
|
bfd *abfd = bfd_openr (list->name, NULL);
|
||||||
|
|
||||||
|
if (!abfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: can't open file %s\n"),
|
||||||
|
program_name, list->name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
abfd->archive_next = obfd->archive_head;
|
||||||
|
obfd->archive_head = abfd;
|
||||||
|
}
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_clear (void)
|
||||||
|
{
|
||||||
|
if (obfd)
|
||||||
|
obfd->archive_head = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_delete (struct list *list)
|
||||||
|
{
|
||||||
|
if (!obfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: no open output archive\n"), program_name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (list)
|
||||||
|
{
|
||||||
|
/* Find this name in the archive. */
|
||||||
|
bfd *member = obfd->archive_head;
|
||||||
|
bfd **prev = &(obfd->archive_head);
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
while (member)
|
||||||
|
{
|
||||||
|
if (FILENAME_CMP(member->filename, list->name) == 0)
|
||||||
|
{
|
||||||
|
*prev = member->archive_next;
|
||||||
|
found = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
prev = &(member->archive_next);
|
||||||
|
|
||||||
|
member = member->archive_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: can't find module file %s\n"),
|
||||||
|
program_name, list->name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_save (void)
|
||||||
|
{
|
||||||
|
if (!obfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: no open output archive\n"), program_name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *ofilename = xstrdup (bfd_get_filename (obfd));
|
||||||
|
|
||||||
|
bfd_close (obfd);
|
||||||
|
|
||||||
|
smart_rename (ofilename, real_name, 0);
|
||||||
|
obfd = 0;
|
||||||
|
free (ofilename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_replace (struct list *list)
|
||||||
|
{
|
||||||
|
if (!obfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: no open output archive\n"), program_name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (list)
|
||||||
|
{
|
||||||
|
/* Find this name in the archive. */
|
||||||
|
bfd *member = obfd->archive_head;
|
||||||
|
bfd **prev = &(obfd->archive_head);
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
while (member)
|
||||||
|
{
|
||||||
|
if (FILENAME_CMP (member->filename, list->name) == 0)
|
||||||
|
{
|
||||||
|
/* Found the one to replace. */
|
||||||
|
bfd *abfd = bfd_openr (list->name, 0);
|
||||||
|
|
||||||
|
if (!abfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: can't open file %s\n"),
|
||||||
|
program_name, list->name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*prev = abfd;
|
||||||
|
abfd->archive_next = member->archive_next;
|
||||||
|
found = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prev = &(member->archive_next);
|
||||||
|
}
|
||||||
|
member = member->archive_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
bfd *abfd = bfd_openr (list->name, 0);
|
||||||
|
|
||||||
|
fprintf (stderr,_("%s: can't find module file %s\n"),
|
||||||
|
program_name, list->name);
|
||||||
|
if (!abfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: can't open file %s\n"),
|
||||||
|
program_name, list->name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*prev = abfd;
|
||||||
|
}
|
||||||
|
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* And I added this one. */
|
||||||
|
void
|
||||||
|
ar_list (void)
|
||||||
|
{
|
||||||
|
if (!obfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: no open output archive\n"), program_name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bfd *abfd;
|
||||||
|
|
||||||
|
outfile = stdout;
|
||||||
|
verbose =1 ;
|
||||||
|
printf (_("Current open archive is %s\n"), bfd_get_filename (obfd));
|
||||||
|
|
||||||
|
for (abfd = obfd->archive_head;
|
||||||
|
abfd != (bfd *)NULL;
|
||||||
|
abfd = abfd->archive_next)
|
||||||
|
ar_directory_doer (abfd, (bfd *) NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_end (void)
|
||||||
|
{
|
||||||
|
if (obfd)
|
||||||
|
{
|
||||||
|
bfd_cache_close (obfd);
|
||||||
|
unlink (bfd_get_filename (obfd));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_extract (struct list *list)
|
||||||
|
{
|
||||||
|
if (!obfd)
|
||||||
|
{
|
||||||
|
fprintf (stderr, _("%s: no open archive\n"), program_name);
|
||||||
|
maybequit ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (list)
|
||||||
|
{
|
||||||
|
/* Find this name in the archive. */
|
||||||
|
bfd *member = obfd->archive_head;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
while (member && !found)
|
||||||
|
{
|
||||||
|
if (FILENAME_CMP (member->filename, list->name) == 0)
|
||||||
|
{
|
||||||
|
extract_file (member);
|
||||||
|
found = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
member = member->archive_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
bfd_openr (list->name, 0);
|
||||||
|
fprintf (stderr, _("%s: can't find module file %s\n"),
|
||||||
|
program_name, list->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
list = list->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
63
contrib/toolchain/binutils/binutils/arsup.h
Normal file
63
contrib/toolchain/binutils/binutils/arsup.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/* arsup.h - archive support header file
|
||||||
|
Copyright 1992, 1993, 1994, 1996, 2001, 2002, 2003, 2005, 2007
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU Binutils.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||||
|
MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
struct list {
|
||||||
|
char *name;
|
||||||
|
struct list *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
void maybequit (void);
|
||||||
|
|
||||||
|
void prompt (void);
|
||||||
|
|
||||||
|
void ar_clear (void);
|
||||||
|
|
||||||
|
void ar_replace (struct list *);
|
||||||
|
|
||||||
|
void ar_delete (struct list *);
|
||||||
|
|
||||||
|
void ar_save (void);
|
||||||
|
|
||||||
|
void ar_list (void);
|
||||||
|
|
||||||
|
void ar_open (char *, int);
|
||||||
|
|
||||||
|
void ar_directory (char *, struct list *, char *);
|
||||||
|
|
||||||
|
void ar_addmod (struct list *);
|
||||||
|
|
||||||
|
void ar_addlib (char *, struct list *);
|
||||||
|
|
||||||
|
void ar_end (void);
|
||||||
|
|
||||||
|
void ar_extract (struct list *);
|
||||||
|
|
||||||
|
bfd *open_inarch (const char *archive_filename, const char *);
|
||||||
|
|
||||||
|
extern int yylex (void);
|
||||||
|
|
||||||
|
int yyparse (void);
|
||||||
|
|
||||||
|
/* Functions from ar.c */
|
||||||
|
|
||||||
|
void extract_file (bfd * abfd);
|
||||||
|
|
||||||
|
extern int interactive;
|
149
contrib/toolchain/binutils/binutils/binemul.c
Normal file
149
contrib/toolchain/binutils/binutils/binemul.c
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/* Binutils emulation layer.
|
||||||
|
Copyright 2002, 2003, 2005, 2007, 2008, 2010
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
Written by Tom Rix, Red Hat Inc.
|
||||||
|
|
||||||
|
This file is part of GNU Binutils.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||||
|
MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#include "binemul.h"
|
||||||
|
|
||||||
|
extern bin_emulation_xfer_type bin_dummy_emulation;
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_emul_usage (FILE *fp)
|
||||||
|
{
|
||||||
|
if (bin_dummy_emulation.ar_usage)
|
||||||
|
bin_dummy_emulation.ar_usage (fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ar_emul_default_usage (FILE *fp)
|
||||||
|
{
|
||||||
|
AR_EMUL_USAGE_PRINT_OPTION_HEADER (fp);
|
||||||
|
/* xgettext:c-format */
|
||||||
|
fprintf (fp, _(" No emulation specific options\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
bfd_boolean
|
||||||
|
ar_emul_append (bfd **after_bfd, char *file_name, const char *target,
|
||||||
|
bfd_boolean verbose, bfd_boolean flatten)
|
||||||
|
{
|
||||||
|
if (bin_dummy_emulation.ar_append)
|
||||||
|
return bin_dummy_emulation.ar_append (after_bfd, file_name, target,
|
||||||
|
verbose, flatten);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bfd_boolean
|
||||||
|
any_ok (bfd *new_bfd ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bfd_boolean
|
||||||
|
do_ar_emul_append (bfd **after_bfd, bfd *new_bfd,
|
||||||
|
bfd_boolean verbose, bfd_boolean flatten,
|
||||||
|
bfd_boolean (*check) (bfd *))
|
||||||
|
{
|
||||||
|
/* When flattening, add the members of an archive instead of the
|
||||||
|
archive itself. */
|
||||||
|
if (flatten && bfd_check_format (new_bfd, bfd_archive))
|
||||||
|
{
|
||||||
|
bfd *elt;
|
||||||
|
bfd_boolean added = FALSE;
|
||||||
|
|
||||||
|
for (elt = bfd_openr_next_archived_file (new_bfd, NULL);
|
||||||
|
elt;
|
||||||
|
elt = bfd_openr_next_archived_file (new_bfd, elt))
|
||||||
|
{
|
||||||
|
if (do_ar_emul_append (after_bfd, elt, verbose, TRUE, check))
|
||||||
|
{
|
||||||
|
added = TRUE;
|
||||||
|
after_bfd = &((*after_bfd)->archive_next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return added;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!check (new_bfd))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
AR_EMUL_APPEND_PRINT_VERBOSE (verbose, new_bfd->filename);
|
||||||
|
|
||||||
|
new_bfd->archive_next = *after_bfd;
|
||||||
|
*after_bfd = new_bfd;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bfd_boolean
|
||||||
|
ar_emul_default_append (bfd **after_bfd, char *file_name,
|
||||||
|
const char *target, bfd_boolean verbose,
|
||||||
|
bfd_boolean flatten)
|
||||||
|
{
|
||||||
|
bfd *new_bfd;
|
||||||
|
|
||||||
|
new_bfd = bfd_openr (file_name, target);
|
||||||
|
AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
|
||||||
|
return do_ar_emul_append (after_bfd, new_bfd, verbose, flatten, any_ok);
|
||||||
|
}
|
||||||
|
|
||||||
|
bfd_boolean
|
||||||
|
ar_emul_replace (bfd **after_bfd, char *file_name, const char *target,
|
||||||
|
bfd_boolean verbose)
|
||||||
|
{
|
||||||
|
if (bin_dummy_emulation.ar_replace)
|
||||||
|
return bin_dummy_emulation.ar_replace (after_bfd, file_name,
|
||||||
|
target, verbose);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bfd_boolean
|
||||||
|
ar_emul_default_replace (bfd **after_bfd, char *file_name,
|
||||||
|
const char *target, bfd_boolean verbose)
|
||||||
|
{
|
||||||
|
bfd *new_bfd;
|
||||||
|
|
||||||
|
new_bfd = bfd_openr (file_name, target);
|
||||||
|
AR_EMUL_ELEMENT_CHECK (new_bfd, file_name);
|
||||||
|
|
||||||
|
AR_EMUL_REPLACE_PRINT_VERBOSE (verbose, file_name);
|
||||||
|
|
||||||
|
new_bfd->archive_next = *after_bfd;
|
||||||
|
*after_bfd = new_bfd;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bfd_boolean
|
||||||
|
ar_emul_parse_arg (char *arg)
|
||||||
|
{
|
||||||
|
if (bin_dummy_emulation.ar_parse_arg)
|
||||||
|
return bin_dummy_emulation.ar_parse_arg (arg);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bfd_boolean
|
||||||
|
ar_emul_default_parse_arg (char *arg ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
71
contrib/toolchain/binutils/binutils/binemul.h
Normal file
71
contrib/toolchain/binutils/binutils/binemul.h
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/* Binutils emulation layer.
|
||||||
|
Copyright 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Tom Rix, Red Hat Inc.
|
||||||
|
|
||||||
|
This file is part of GNU Binutils.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||||
|
MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifndef BINEMUL_H
|
||||||
|
#define BINEMUL_H
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
|
#include "bfd.h"
|
||||||
|
#include "bucomm.h"
|
||||||
|
|
||||||
|
extern void ar_emul_usage (FILE *);
|
||||||
|
extern void ar_emul_default_usage (FILE *);
|
||||||
|
extern bfd_boolean ar_emul_append (bfd **, char *, const char *,
|
||||||
|
bfd_boolean, bfd_boolean);
|
||||||
|
extern bfd_boolean ar_emul_default_append (bfd **, char *, const char *,
|
||||||
|
bfd_boolean, bfd_boolean);
|
||||||
|
extern bfd_boolean do_ar_emul_append (bfd **, bfd *,
|
||||||
|
bfd_boolean, bfd_boolean,
|
||||||
|
bfd_boolean (*)(bfd *));
|
||||||
|
extern bfd_boolean ar_emul_replace (bfd **, char *, const char *,
|
||||||
|
bfd_boolean);
|
||||||
|
extern bfd_boolean ar_emul_default_replace (bfd **, char *,
|
||||||
|
const char *, bfd_boolean);
|
||||||
|
extern bfd_boolean ar_emul_parse_arg (char *);
|
||||||
|
extern bfd_boolean ar_emul_default_parse_arg (char *);
|
||||||
|
|
||||||
|
/* Macros for common output. */
|
||||||
|
|
||||||
|
#define AR_EMUL_USAGE_PRINT_OPTION_HEADER(fp) \
|
||||||
|
/* xgettext:c-format */ \
|
||||||
|
fprintf (fp, _(" emulation options: \n"))
|
||||||
|
|
||||||
|
#define AR_EMUL_ELEMENT_CHECK(abfd, file_name) \
|
||||||
|
do { if ((abfd) == NULL) bfd_fatal (file_name); } while (0)
|
||||||
|
|
||||||
|
#define AR_EMUL_APPEND_PRINT_VERBOSE(verbose, file_name) \
|
||||||
|
do { if (verbose) printf ("a - %s\n", file_name); } while (0)
|
||||||
|
|
||||||
|
#define AR_EMUL_REPLACE_PRINT_VERBOSE(verbose, file_name) \
|
||||||
|
do { if (verbose) printf ("r - %s\n", file_name); } while (0)
|
||||||
|
|
||||||
|
typedef struct bin_emulation_xfer_struct
|
||||||
|
{
|
||||||
|
/* Print out the extra options. */
|
||||||
|
void (* ar_usage) (FILE *fp);
|
||||||
|
bfd_boolean (* ar_append) (bfd **, char *, const char *, bfd_boolean,
|
||||||
|
bfd_boolean);
|
||||||
|
bfd_boolean (* ar_replace) (bfd **, char *, const char *, bfd_boolean);
|
||||||
|
bfd_boolean (* ar_parse_arg) (char *);
|
||||||
|
}
|
||||||
|
bin_emulation_xfer_type;
|
||||||
|
|
||||||
|
#endif
|
30
contrib/toolchain/binutils/binutils/emul_vanilla.c
Normal file
30
contrib/toolchain/binutils/binutils/emul_vanilla.c
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/* Binutils emulation layer.
|
||||||
|
Copyright (C) 2002, 2005, 2007 Free Software Foundation, Inc.
|
||||||
|
Written by Tom Rix, Red Hat Inc.
|
||||||
|
|
||||||
|
This file is part of GNU Binutils.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
||||||
|
MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#include "binemul.h"
|
||||||
|
|
||||||
|
struct bin_emulation_xfer_struct bin_vanilla_emulation =
|
||||||
|
{
|
||||||
|
ar_emul_default_usage,
|
||||||
|
ar_emul_default_append,
|
||||||
|
ar_emul_default_replace,
|
||||||
|
ar_emul_default_parse_arg,
|
||||||
|
};
|
22
contrib/toolchain/binutils/binutils/not-ranlib.c
Normal file
22
contrib/toolchain/binutils/binutils/not-ranlib.c
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/* Copyright 2007 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU Binutils.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
||||||
|
02110-1301, USA. */
|
||||||
|
|
||||||
|
/* Linked with ar.o to flag that this program is 'ar' (not 'ranlib'). */
|
||||||
|
|
||||||
|
int is_ranlib = 0;
|
Loading…
Reference in New Issue
Block a user