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
|
||||
|
||||
@ -20,22 +19,37 @@ LDFLAGS = -static -nostdlib --stack 12582912 -T$(SDK_DIR)/sources/newlib/app.lds
|
||||
|
||||
|
||||
SRCS = \
|
||||
arparse.c arlex.c ar.c \
|
||||
not-ranlib.c arsup.c \
|
||||
binemul.c emul_vanilla.c \
|
||||
objcopy.c not-strip.c rename.c \
|
||||
rddbg.c debug.c stabs.c ieee.c \
|
||||
rdcoff.c wrstabs.c bucomm.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
|
||||
|
||||
|
||||
OBJS = $(patsubst %.cpp, %.o, $(patsubst %.c, %.o, $(SRCS)))
|
||||
OAR = \
|
||||
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
|
||||
|
||||
all: $(NAME)
|
||||
all: objcopy ar
|
||||
|
||||
$(NAME): $(OBJS) Makefile
|
||||
$(LD) $(LDFLAGS) $(LIBPATH) -o $@ $(OBJS) $(LIBS)
|
||||
kos32-objcopy $@ kos32-objcopy -O binary
|
||||
objcopy: $(OCOPY) Makefile
|
||||
$(LD) $(LDFLAGS) $(LIBPATH) -o $@ $(OCOPY) $(LIBS)
|
||||
kos32-objcopy $@ -O binary
|
||||
|
||||
ar: $(OAR) Makefile
|
||||
$(LD) $(LDFLAGS) $(LIBPATH) -o $@ $(OAR) $(LIBS)
|
||||
kos32-objcopy $@ -O binary
|
||||
|
||||
%.o : %.c Makefile
|
||||
$(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