summaryrefslogtreecommitdiffstats
path: root/gnu
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1993-12-02 00:56:40 +0000
committerjkh <jkh@FreeBSD.org>1993-12-02 00:56:40 +0000
commit6c95372161273c81a57543f7887cbf8276856eba (patch)
tree7b5a5762468dd0cff60429ff55065dd75c051b6d /gnu
parent1b23c6f7345e82af173ac114373cd23fb1184e7d (diff)
downloadFreeBSD-src-6c95372161273c81a57543f7887cbf8276856eba.zip
FreeBSD-src-6c95372161273c81a57543f7887cbf8276856eba.tar.gz
Second attempt to integrate Paul K's changes.
Diffstat (limited to 'gnu')
-rw-r--r--gnu/usr.bin/ld/Makefile10
-rw-r--r--gnu/usr.bin/ld/ld.c4
-rw-r--r--gnu/usr.bin/ld/lib.c38
-rw-r--r--gnu/usr.bin/ld/rrs.c4
4 files changed, 36 insertions, 20 deletions
diff --git a/gnu/usr.bin/ld/Makefile b/gnu/usr.bin/ld/Makefile
index 09b9b11..0e55c98 100644
--- a/gnu/usr.bin/ld/Makefile
+++ b/gnu/usr.bin/ld/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.9 1993/12/01 14:45:35 ache Exp $
+# $Id: Makefile,v 1.8 1993/11/03 13:01:36 cgd Exp $
#
PROG= ld
@@ -7,13 +7,9 @@ CFLAGS += -static -I$(.CURDIR) -I$(.CURDIR)/$(MACHINE)
LDADD+= -lgnumalloc
DPADD+= /usr/lib/libgnumalloc.a
-LDFLAGS+= -Xlinker -Bstatic
-SUBDIR= ldconfig ldd
-.if !defined(NOPIC)
-SUBDIR+= rtld
-.endif
-
+SUBDIR= ldconfig ldd rtld
+
.PATH: $(.CURDIR)/$(MACHINE)
.include <bsd.prog.mk>
diff --git a/gnu/usr.bin/ld/ld.c b/gnu/usr.bin/ld/ld.c
index 7285e5d..5b93e9e 100644
--- a/gnu/usr.bin/ld/ld.c
+++ b/gnu/usr.bin/ld/ld.c
@@ -32,7 +32,7 @@ static char sccsid[] = "@(#)ld.c 6.10 (Berkeley) 5/22/91";
Set, indirect, and warning symbol features added by Randy Smith. */
/*
- * $Id: ld.c,v 1.11 1993/11/30 20:47:25 jkh Exp $
+ * $Id: ld.c,v 1.10 1993/11/22 19:04:40 jkh Exp $
*/
/* Define how to initialize system-dependent header fields. */
@@ -2111,13 +2111,13 @@ write_header ()
if (relocatable_output)
nsyms += set_symbol_count;
-#ifdef DEBUG
printf("global symbols %d (defined %d, undefined %d), locals: %d, \
debug symbols: %d, set_symbols %d, aliases %d --> nsyms %d\n",
global_sym_count,
defined_global_sym_count, undefined_global_sym_count,
local_sym_count, debugger_sym_count,
set_symbol_count, global_alias_count, nsyms);
+#ifdef DEBUG
#endif
outheader.a_syms = nsyms * sizeof (struct nlist);
diff --git a/gnu/usr.bin/ld/lib.c b/gnu/usr.bin/ld/lib.c
index 674f131..c75209e 100644
--- a/gnu/usr.bin/ld/lib.c
+++ b/gnu/usr.bin/ld/lib.c
@@ -78,11 +78,11 @@ decode_library_subfile(desc, library_entry, subfile_offset, length_loc)
{
int bytes_read;
register int namelen;
- int member_length;
+ int member_length, content_length;
register char *name;
struct ar_hdr hdr1;
register struct file_entry *subentry;
-
+ int starting_offset;
lseek(desc, subfile_offset, 0);
bytes_read = read(desc, &hdr1, sizeof hdr1);
@@ -104,22 +104,44 @@ decode_library_subfile(desc, library_entry, subfile_offset, length_loc)
&& hdr1.ar_name[namelen] != '/';
namelen++);
- name = (char *) xmalloc(namelen + 1);
- strncpy(name, hdr1.ar_name, namelen);
- name[namelen] = 0;
-
+ starting_offset = subfile_offset + sizeof hdr1;
+ content_length = member_length;
+#ifdef AR_EFMT1
+ /*
+ * BSD 4.4 extended AR format: #1/<namelen>, with name as the
+ * first <namelen> bytes of the file
+ */
+ if ((hdr1.ar_name[0]=='#') &&
+ (hdr1.ar_name[1]=='1') &&
+ (hdr1.ar_name[2]=='/') &&
+ (isdigit(hdr1.ar_name[3])))
+ {
+ namelen = atoi (&hdr1.ar_name[3]);
+ name = (char *) xmalloc(namelen + 1);
+ read (desc, name, namelen);
+ name[namelen] = 0;
+ content_length -= namelen;
+ starting_offset += namelen;
+ } else
+#endif
+ {
+ name = (char *) xmalloc(namelen + 1);
+ strncpy(name, hdr1.ar_name, namelen);
+ name[namelen] = 0;
+ }
+
subentry->filename = name;
subentry->local_sym_name = name;
subentry->symbols = 0;
subentry->strings = 0;
subentry->subfiles = 0;
- subentry->starting_offset = subfile_offset + sizeof hdr1;
+ subentry->starting_offset = starting_offset;
subentry->superfile = library_entry;
subentry->library_flag = 0;
subentry->header_read_flag = 0;
subentry->just_syms_flag = 0;
subentry->chain = 0;
- subentry->total_size = member_length;
+ subentry->total_size = content_length;
(*length_loc) = member_length;
diff --git a/gnu/usr.bin/ld/rrs.c b/gnu/usr.bin/ld/rrs.c
index 8ab992d..6a3bf08 100644
--- a/gnu/usr.bin/ld/rrs.c
+++ b/gnu/usr.bin/ld/rrs.c
@@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: rrs.c,v 1.5 1993/11/30 20:47:29 jkh Exp $
+ * $Id: rrs.c,v 1.4 1993/11/22 19:04:44 jkh Exp $
*/
#include <sys/param.h>
@@ -319,10 +319,8 @@ long *relocation;
struct relocation_info *r = rrs_next_reloc();
if (rp->r_address < text_start + text_size)
-#ifdef DEBUG
error("%s: RRS text relocation at %#x for \"%s\"",
get_file_name(entry), rp->r_address, sp->name);
-#endif
#ifdef DEBUG
printf("claim_rrs_reloc: %s in %s\n", sp->name, get_file_name(entry));
OpenPOWER on IntegriCloud