Magellan Linux

Annotation of /trunk/elfutils/patches/elfutils-0.137-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 737 - (hide annotations) (download)
Fri Dec 26 11:32:39 2008 UTC (15 years, 4 months ago) by niro
File size: 5536 byte(s)
patches for elfutils-0.137

1 niro 737 --- elfutils-0.137/libdwfl/ChangeLog
2     +++ elfutils-0.137/libdwfl/ChangeLog
3     @@ -1,3 +1,17 @@
4     +2008-09-29 Roland McGrath <roland@redhat.com>
5     +
6     + * segment.c (insert): Must realloc DWFL->lookup_module here too.
7     + (dwfl_report_segment): Clear DWFL->lookup_module before insert calls.
8     +
9     +2008-08-28 Roland McGrath <roland@redhat.com>
10     +
11     + * segment.c (reify_segments): Fix last change.
12     +
13     +2008-08-27 Roland McGrath <roland@redhat.com>
14     +
15     + * linux-proc-maps.c (read_proc_memory): Return 0 for EINVAL or EPERM
16     + failure from pread64.
17     +
18     2008-08-26 Roland McGrath <roland@redhat.com>
19    
20     * segment.c (reify_segments): Insert a trailing segment for a module
21     --- elfutils-0.137/libdwfl/linux-proc-maps.c
22     +++ elfutils-0.137/libdwfl/linux-proc-maps.c
23     @@ -267,6 +267,9 @@ read_proc_memory (void *arg, void *data,
24     {
25     const int fd = *(const int *) arg;
26     ssize_t nread = pread64 (fd, data, maxread, (off64_t) address);
27     + /* Some kernels don't actually let us do this read, ignore those errors. */
28     + if (nread < 0 && (errno == EINVAL || errno == EPERM))
29     + return 0;
30     if (nread > 0 && (size_t) nread < minread)
31     nread = 0;
32     return nread;
33     --- elfutils-0.137/libdwfl/segment.c
34     +++ elfutils-0.137/libdwfl/segment.c
35     @@ -83,12 +83,26 @@ insert (Dwfl *dwfl, size_t i, GElf_Addr
36     int *nsegndx = realloc (dwfl->lookup_segndx, sizeof nsegndx[0] * n);
37     if (unlikely (nsegndx == NULL))
38     {
39     - free (naddr);
40     + if (naddr != dwfl->lookup_addr)
41     + free (naddr);
42     return true;
43     }
44     dwfl->lookup_alloc = n;
45     dwfl->lookup_addr = naddr;
46     dwfl->lookup_segndx = nsegndx;
47     +
48     + if (dwfl->lookup_module != NULL)
49     + {
50     + /* Make sure this array is big enough too. */
51     + Dwfl_Module **old = dwfl->lookup_module;
52     + dwfl->lookup_module = realloc (dwfl->lookup_module,
53     + sizeof dwfl->lookup_module[0] * n);
54     + if (unlikely (dwfl->lookup_module == NULL))
55     + {
56     + free (old);
57     + return true;
58     + }
59     + }
60     }
61    
62     if (unlikely (i < dwfl->lookup_elts))
63     @@ -175,9 +189,17 @@ reify_segments (Dwfl *dwfl)
64     return true;
65     ++idx;
66     }
67     + else if (dwfl->lookup_addr[idx] < start)
68     + {
69     + /* The module starts past the end of this segment.
70     + Add a new one. */
71     + if (unlikely (insert (dwfl, idx + 1, start, end, -1)))
72     + return true;
73     + ++idx;
74     + }
75    
76     - if (((size_t) idx + 1 == dwfl->lookup_elts
77     - || end < dwfl->lookup_addr[idx + 1])
78     + if ((size_t) idx + 1 < dwfl->lookup_elts
79     + && end < dwfl->lookup_addr[idx + 1]
80     /* The module ends in the middle of this segment. Split it. */
81     && unlikely (insert (dwfl, idx + 1,
82     end, dwfl->lookup_addr[idx + 1], -1)))
83     @@ -261,6 +283,12 @@ dwfl_report_segment (Dwfl *dwfl, int ndx
84     phdr->p_align < dwfl->segment_align))
85     dwfl->segment_align = phdr->p_align;
86    
87     + if (unlikely (dwfl->lookup_module != NULL))
88     + {
89     + free (dwfl->lookup_module);
90     + dwfl->lookup_module = NULL;
91     + }
92     +
93     GElf_Addr start = segment_start (dwfl, bias + phdr->p_vaddr);
94     GElf_Addr end = segment_end (dwfl, bias + phdr->p_vaddr + phdr->p_memsz);
95    
96     @@ -289,12 +317,6 @@ dwfl_report_segment (Dwfl *dwfl, int ndx
97     dwfl->lookup_tail_offset = end - bias - phdr->p_vaddr + phdr->p_offset;
98     dwfl->lookup_tail_ndx = ndx + 1;
99    
100     - if (unlikely (dwfl->lookup_module != NULL))
101     - {
102     - free (dwfl->lookup_module);
103     - dwfl->lookup_module = NULL;
104     - }
105     -
106     return ndx;
107     }
108     INTDEF (dwfl_report_segment)
109     --- elfutils-0.137/libelf/ChangeLog
110     +++ elfutils-0.137/libelf/ChangeLog
111     @@ -1,3 +1,9 @@
112     +2008-08-27 Roland McGrath <roland@redhat.com>
113     +
114     + * elf_begin.c (get_shnum): Avoid misaligned reads for matching endian.
115     +
116     + * libelfP.h [!ALLOW_UNALIGNED] (__libelf_type_align): Fix CLASS index.
117     +
118     2008-08-25 Roland McGrath <roland@redhat.com>
119    
120     * Makefile.am (libelf_so_LDLIBS): New variable.
121     --- elfutils-0.137/libelf/elf_begin.c
122     +++ elfutils-0.137/libelf/elf_begin.c
123     @@ -111,7 +111,11 @@ get_shnum (void *map_address, unsigned c
124     bool is32 = e_ident[EI_CLASS] == ELFCLASS32;
125    
126     /* Make the ELF header available. */
127     - if (e_ident[EI_DATA] == MY_ELFDATA)
128     + if (e_ident[EI_DATA] == MY_ELFDATA
129     + && (ALLOW_UNALIGNED
130     + || (((size_t) e_ident
131     + & ((is32 ? __alignof__ (Elf32_Ehdr) : __alignof__ (Elf64_Ehdr))
132     + - 1)) == 0)))
133     ehdr.p = e_ident;
134     else
135     {
136     @@ -130,8 +134,11 @@ get_shnum (void *map_address, unsigned c
137     else
138     memcpy (&ehdr_mem, e_ident, sizeof (Elf32_Ehdr));
139    
140     - CONVERT (ehdr_mem.e32.e_shnum);
141     - CONVERT (ehdr_mem.e32.e_shoff);
142     + if (e_ident[EI_DATA] != MY_ELFDATA)
143     + {
144     + CONVERT (ehdr_mem.e32.e_shnum);
145     + CONVERT (ehdr_mem.e32.e_shoff);
146     + }
147     }
148     else
149     {
150     @@ -143,8 +150,11 @@ get_shnum (void *map_address, unsigned c
151     else
152     memcpy (&ehdr_mem, e_ident, sizeof (Elf64_Ehdr));
153    
154     - CONVERT (ehdr_mem.e64.e_shnum);
155     - CONVERT (ehdr_mem.e64.e_shoff);
156     + if (e_ident[EI_DATA] != MY_ELFDATA)
157     + {
158     + CONVERT (ehdr_mem.e64.e_shnum);
159     + CONVERT (ehdr_mem.e64.e_shoff);
160     + }
161     }
162     }
163    
164     --- elfutils-0.137/libelf/libelfP.h
165     +++ elfutils-0.137/libelf/libelfP.h
166     @@ -460,7 +460,7 @@ extern const uint_fast8_t __libelf_type_
167     version, binary class, and type. */
168     extern const uint_fast8_t __libelf_type_aligns[EV_NUM - 1][ELFCLASSNUM - 1][ELF_T_NUM] attribute_hidden;
169     # define __libelf_type_align(class, type) \
170     - (__libelf_type_aligns[LIBELF_EV_IDX][class][type] ?: 1)
171     + (__libelf_type_aligns[LIBELF_EV_IDX][class - 1][type] ?: 1)
172     #else
173     # define __libelf_type_align(class, type) 1
174     #endif