X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/b6fc45ca4c306a4f6f6bdbaf90a69d3dab62777a..a1d144c63e5a202b6215c1eb0d7ab4b17b4d32ca:/binutils/copy.c diff --git a/binutils/copy.c b/binutils/copy.c index 91b5f26a22..fa86cf6e95 100644 --- a/binutils/copy.c +++ b/binutils/copy.c @@ -1,6 +1,24 @@ -/*** copy.c -- copy object file from input to output, optionally massaging it */ -#include "sysdep.h" +/* copy.c -- copy object file from input to output, optionally massaging it. + Copyright (C) 1991 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ + #include "bfd.h" +#include "sysdep.h" asymbol **sympp; char *input_target = NULL; @@ -14,6 +32,11 @@ static void copy_sections(); static boolean strip; static boolean verbose; +/* This flag distinguishes between strip and copy: + 1 means this is 'strip'; 0 means this is 'copy'. + -1 means if we should use argv[0] to decide. */ +extern int is_strip; + /* IMPORTS */ extern char *program_name; extern char *xmalloc(); @@ -92,19 +115,21 @@ bfd *obfd; ibfd->filename, ibfd->xvec->name, obfd->filename, obfd->xvec->name); - if ((bfd_set_start_address(obfd, bfd_get_start_address(ibfd)) == false) || + if ((bfd_set_start_address(obfd, bfd_get_start_address(ibfd)) == false) + || (bfd_set_file_flags(obfd, (bfd_get_file_flags(ibfd) & - ~(HAS_LINENO | HAS_DEBUG | HAS_SYMS | D_PAGED | - HAS_LOCALS))) == false) || - bfd_set_start_address(obfd, bfd_get_start_address(ibfd)) == false) - bfd_fatal(bfd_get_filename(ibfd)); + (HAS_LINENO | HAS_DEBUG | + HAS_RELOC | HAS_SYMS | D_PAGED | + HAS_LOCALS))) == false)) { + bfd_fatal(bfd_get_filename(ibfd)); + } /* Copy architecture of input file to output file */ - if (!bfd_set_arch_mach(obfd, bfd_get_architecture(ibfd), - bfd_get_machine(ibfd))) { + if (!bfd_set_arch_mach(obfd, bfd_get_arch(ibfd), + bfd_get_mach(ibfd))) { fprintf(stderr, "Output file cannot represent architecture %s\n", - bfd_printable_arch_mach(bfd_get_architecture(ibfd), - bfd_get_machine(ibfd))); + bfd_printable_arch_mach(bfd_get_arch(ibfd), + bfd_get_mach(ibfd))); } if (!bfd_set_format(obfd, bfd_get_format(ibfd))) { @@ -114,7 +139,7 @@ bfd *obfd; sympp = (asymbol **) xmalloc(get_symtab_upper_bound(ibfd)); symcount = bfd_canonicalize_symtab(ibfd, sympp); - bfd_set_symtab(obfd, sympp, strip == true ? 0 : symcount); + bfd_set_symtab(obfd, sympp, is_strip ? 0 : symcount); /* bfd mandates that all output sections be created and sizes set before @@ -144,22 +169,23 @@ copy_archive(ibfd, obfd) bfd *ibfd; bfd *obfd; { - bfd **ptr =&( obfd->archive_head); + bfd **ptr = &obfd->archive_head; bfd *this_element; /* Read each archive element in turn from the input, copy the contents to a temp file, and keep the temp file handle */ - char *dir = cat("./",make_tempname(""),"copy-dir"); + char *dir = cat("./#",make_tempname(""),"cd"); /* Make a temp directory to hold the contents */ mkdir(dir,0777); obfd->has_armap = ibfd->has_armap; this_element = bfd_openr_next_archived_file(ibfd, NULL); + ibfd->archive_head = this_element; while (this_element != (bfd *)NULL) { /* Create an output file for this member */ char *output_name = cat(dir, "/",this_element->filename); bfd *output_bfd = bfd_openw(output_name, output_target); - + if (!bfd_set_format(obfd, bfd_get_format(ibfd))) bfd_fatal(output_filename); @@ -177,8 +203,9 @@ bfd *obfd; *ptr = output_bfd; - ptr =&( output_bfd->next); - this_element = bfd_openr_next_archived_file(ibfd, this_element); + ptr = &output_bfd->next; + this_element->next = bfd_openr_next_archived_file(ibfd, this_element); + this_element = this_element->next; } *ptr = (bfd *)NULL; @@ -186,17 +213,16 @@ bfd *obfd; if (!bfd_close(obfd)) bfd_fatal(output_filename); - /* Now delete all the files that we opened - We can't use the names in the obfd list since they may have been - trampled by the archive output code - */ + /* Now delete all the files that we opened. + Construct their names again, unfortunately, but so what; + we're about to exit anyway. */ for (this_element = ibfd->archive_head; this_element != (bfd *)NULL; this_element = this_element->next) { unlink(cat(dir,"/",this_element->filename)); } - unlink(dir); + rmdir(dir); if (!bfd_close(ibfd)) bfd_fatal(input_filename); @@ -221,6 +247,8 @@ copy_file(input_filename, output_filename) copy_object(ibfd, obfd); + if (ibfd->flags & EXEC_P) + obfd->flags |= EXEC_P; if (!bfd_close(obfd)) bfd_fatal(output_filename); @@ -246,10 +274,14 @@ setup_sections(ibfd, isection, obfd) { sec_ptr osection; char *err; - osection = bfd_make_section(obfd, bfd_section_name(ibfd, isection)); + + osection = bfd_get_section_by_name(obfd, bfd_section_name(ibfd, isection)); if (osection == NULL) { - err = "making"; - goto loser; + osection = bfd_make_section(obfd, bfd_section_name(ibfd, isection)); + if (osection == NULL) { + err = "making"; + goto loser; + } } if (!bfd_set_section_size(obfd, @@ -308,16 +340,16 @@ copy_sections(ibfd, isection, obfd) arelent **relpp; int relcount; sec_ptr osection; - unsigned long size; + bfd_size_type size; osection = bfd_get_section_by_name(obfd, bfd_section_name(ibfd, isection)); - size = bfd_section_size(ibfd, isection); + size = isection->size; if (size == 0) return; - if (strip == true || get_reloc_upper_bound(ibfd, isection) == 0) + if (is_strip || get_reloc_upper_bound(ibfd, isection) == 0) { bfd_set_reloc(obfd, osection, (arelent **)NULL, 0); } @@ -331,12 +363,12 @@ copy_sections(ibfd, isection, obfd) if (bfd_get_section_flags(ibfd, isection) & SEC_HAS_CONTENTS) { - unsigned char *memhunk = (unsigned char *) xmalloc(size); + PTR memhunk = (PTR) xmalloc((unsigned)size); - if (!bfd_get_section_contents(ibfd, isection, memhunk, 0, size)) + if (!bfd_get_section_contents(ibfd, isection, memhunk, (file_ptr) 0, size)) bfd_fatal(bfd_get_filename(ibfd)); - if (!bfd_set_section_contents(obfd, osection, memhunk, 0, size)) + if (!bfd_set_section_contents(obfd, osection, memhunk, (file_ptr)0, size)) bfd_fatal(bfd_get_filename(obfd)); free(memhunk); } @@ -352,8 +384,11 @@ main(argc, argv) program_name = argv[0]; - if (strcmp(program_name,"strip") == 0) { - strip = true; + bfd_init(); + + if (is_strip < 0) { + i = strlen (program_name); + is_strip = (i >= 5 && strcmp(program_name+i-5,"strip")); } for (i = 1; i < argc; i++) @@ -368,7 +403,7 @@ main(argc, argv) input_target = output_target = argv[i]; break; case 'S': - strip = true; + is_strip = 1; break; case 's': i++; @@ -410,5 +445,5 @@ main(argc, argv) else { copy_file(input_filename, output_filename); } - return 1; + return 0; }