annotate dynodump/i386/_relocate.c @ 4407:4ee73bbe4f8e

Always use boyer_moore in ASCII or Latin-1 buffers with ASCII search strings. 2007-12-26 Aidan Kehoe <kehoea@parhasard.net> * casetab.c: Extend and correct some case table documentation. * search.c (search_buffer): Correct a bug where only the first entry for a character in the case equivalence table was examined in determining if the Boyer-Moore search algorithm is appropriate. If there are case mappings outside of the charset and row of the characters specified in the search string, those case mappings can be safely ignored (and Boyer-Moore search can be used) if we know from the buffer statistics that the corresponding characters cannot occur. * search.c (boyer_moore): Assert that we haven't been passed a string with varying characters sets or rows within character sets. That's what simple_search is for. In the very rare event that a character in the search string has a canonical case mapping that is not in the same character set and row, don't try to search for the canonical character, search for some other character that is in the the desired character set and row. Assert that the case table isn't corrupt. Do not search for any character case mappings that cannot possibly occur in the buffer, given the buffer metadata about its contents.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 26 Dec 2007 17:30:16 +0100
parents 25f70ba0133c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
153
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
1 /*
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
2 * Copyright (c) 1995 by Sun Microsystems, Inc.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
3 * All rights reserved.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
4 *
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
5 * This source code is a product of Sun Microsystems, Inc. and is provided
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
6 * for unrestricted use provided that this legend is included on all tape
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
7 * media and as a part of the software program in whole or part. Users
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
8 * may copy or modify this source code without charge, but are not authorized
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
9 * to license or distribute it to anyone else except as part of a product or
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
10 * program developed by the user.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
11 *
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
12 * THIS PROGRAM CONTAINS SOURCE CODE COPYRIGHTED BY SUN MICROSYSTEMS, INC.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
13 * SUN MICROSYSTEMS, INC., MAKES NO REPRESENTATIONS ABOUT THE SUITABLITY
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
14 * OF SUCH SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
15 * EXPRESS OR IMPLIED WARRANTY OF ANY KIND. SUN MICROSYSTEMS, INC. DISCLAIMS
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
16 * ALL WARRANTIES WITH REGARD TO SUCH SOURCE CODE, INCLUDING ALL IMPLIED
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
18 * NO EVENT SHALL SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
19 * INCIDENTAL, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
20 * FROM USE OF SUCH SOURCE CODE, REGARDLESS OF THE THEORY OF LIABILITY.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
21 *
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
22 * This source code is provided with no support and without any obligation on
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
23 * the part of Sun Microsystems, Inc. to assist in its use, correction,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
24 * modification or enhancement.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
25 *
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
26 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
27 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
28 * SOURCE CODE OR ANY PART THEREOF.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
29 *
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
30 * Sun Microsystems, Inc.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
31 * 2550 Garcia Avenue
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
32 * Mountain View, California 94043
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
33 */
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
34
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
35 #pragma ident "@(#) $Id: _relocate.c,v 1.3 1997/05/29 04:23:02 steve Exp $ - SMI"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
36
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
37 /* LINTLIBRARY */
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
38
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
39 #include <libelf.h>
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
40 #include <string.h>
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
41 #include <machdep.h>
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
42 #include "_dynodump.h"
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
43
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
44 void
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
45 update_reloc(Cache *ocache, Cache *_ocache,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
46 Cache *icache, Cache *_icache,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
47 Half shnum)
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
48 {
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
49 Shdr *shdr;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
50 Rel *rels;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
51 int reln, cnt;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
52 Cache *orcache, *ircache;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
53
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
54 /*
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
55 * Set up to readh the output relocation table.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
56 */
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
57 shdr = _ocache->c_shdr;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
58 rels = (Rel *) _ocache->c_data->d_buf;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
59 reln = shdr->sh_size / shdr->sh_entsize;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
60
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
61 /*
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
62 * Determine the section that is being relocated.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
63 */
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
64 orcache = &ocache[shdr->sh_info];
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
65 shdr = _icache->c_shdr;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
66 ircache = &icache[shdr->sh_info];
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
67
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
68 /*
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
69 * Determine the section that is being relocated. Note that for this
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
70 * stupid architecture the .rel.plt actually contains offsets into the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
71 * .got.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
72 */
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
73 if (strcmp(_ocache->c_name, ".rel.plt")) {
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
74 orcache = &ocache[shdr->sh_info];
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
75 shdr = _icache->c_shdr;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
76 ircache = &icache[shdr->sh_info];
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
77 } else {
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
78 Half ndx;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
79 Cache * __ocache = ocache;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
80
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
81 for (__ocache++, ndx = 1; ndx != shnum; ndx++, __ocache++) {
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
82 if (strcmp(__ocache->c_name, ".got") == 0) {
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
83 orcache = __ocache;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
84 ircache = &icache[ndx];
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
85 break;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
86 }
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
87 }
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
88 }
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
89
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
90 /*
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
91 * Loop through the relocation table.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
92 */
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
93 for (cnt = 0; cnt < reln; cnt++, rels++) {
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
94 unsigned char *iaddr, *oaddr;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
95 Addr off;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
96 unsigned char type = ELF_R_TYPE(rels->r_info);
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
97
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
98 /*
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
99 * Ignore some relocations as these can be safely carried out
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
100 * twice (they simply override any existing data). In fact,
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
101 * some relocations like __iob's copy relocation must be carried
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
102 * out each time the process restarts, otherwise stdio blows up.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
103 */
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
104 if ((type == R_386_COPY) || (type == R_386_NONE))
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
105 continue;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
106
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
107 /*
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
108 * If we are required to restore the relocation location
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
109 * to its value prior to relocation, then read the
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
110 * location's original contents from the input image and
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
111 * copy it to the output image.
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
112 */
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
113 off = rels->r_offset - ircache->c_shdr->sh_addr;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
114 iaddr = (unsigned char *) ircache->c_data->d_buf + off;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
115 oaddr = (unsigned char *) orcache->c_data->d_buf + off;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
116 *(unsigned long *) oaddr = *(unsigned long *) iaddr;
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
117 }
25f70ba0133c Import from CVS: tag r20-3b3
cvs
parents:
diff changeset
118 }