提交 a3b81113 编写于 作者: R Robin Getz 提交者: Linus Torvalds

remove support for un-needed _extratext section

When passing a zero address to kallsyms_lookup(), the kernel thought it was
a valid kernel address, even if it is not.  This is because is_ksym_addr()
called is_kernel_extratext() and checked against labels that don't exist on
many archs (which default as zero).  Since PPC was the only kernel which
defines _extra_text, (in 2005), and no longer needs it, this patch removes
_extra_text support.

For some history (provided by Jon):
 http://ozlabs.org/pipermail/linuxppc-dev/2005-September/019734.html
 http://ozlabs.org/pipermail/linuxppc-dev/2005-September/019736.html
 http://ozlabs.org/pipermail/linuxppc-dev/2005-September/019751.html

[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: NRobin Getz <rgetz@blackfin.uclinux.org>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Jon Loeliger <jdl@freescale.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 0a5dcb51
...@@ -143,11 +143,6 @@ SECTIONS ...@@ -143,11 +143,6 @@ SECTIONS
. = ALIGN(4096); . = ALIGN(4096);
__init_end = .; __init_end = .;
. = ALIGN(4096);
_sextratext = .;
_eextratext = .;
__bss_start = .; __bss_start = .;
.bss : .bss :
{ {
......
...@@ -8,8 +8,6 @@ extern char _data[], _sdata[], _edata[]; ...@@ -8,8 +8,6 @@ extern char _data[], _sdata[], _edata[];
extern char __bss_start[], __bss_stop[]; extern char __bss_start[], __bss_stop[];
extern char __init_begin[], __init_end[]; extern char __init_begin[], __init_end[];
extern char _sinittext[], _einittext[]; extern char _sinittext[], _einittext[];
extern char _sextratext[] __attribute__((weak));
extern char _eextratext[] __attribute__((weak));
extern char _end[]; extern char _end[];
extern char __per_cpu_start[], __per_cpu_end[]; extern char __per_cpu_start[], __per_cpu_end[];
extern char __kprobes_text_start[], __kprobes_text_end[]; extern char __kprobes_text_start[], __kprobes_text_end[];
......
...@@ -53,14 +53,6 @@ static inline int is_kernel_inittext(unsigned long addr) ...@@ -53,14 +53,6 @@ static inline int is_kernel_inittext(unsigned long addr)
return 0; return 0;
} }
static inline int is_kernel_extratext(unsigned long addr)
{
if (addr >= (unsigned long)_sextratext
&& addr <= (unsigned long)_eextratext)
return 1;
return 0;
}
static inline int is_kernel_text(unsigned long addr) static inline int is_kernel_text(unsigned long addr)
{ {
if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext)
...@@ -80,8 +72,7 @@ static int is_ksym_addr(unsigned long addr) ...@@ -80,8 +72,7 @@ static int is_ksym_addr(unsigned long addr)
if (all_var) if (all_var)
return is_kernel(addr); return is_kernel(addr);
return is_kernel_text(addr) || is_kernel_inittext(addr) || return is_kernel_text(addr) || is_kernel_inittext(addr);
is_kernel_extratext(addr);
} }
/* expand a compressed symbol data into the resulting uncompressed string, /* expand a compressed symbol data into the resulting uncompressed string,
......
...@@ -41,7 +41,7 @@ struct sym_entry { ...@@ -41,7 +41,7 @@ struct sym_entry {
static struct sym_entry *table; static struct sym_entry *table;
static unsigned int table_size, table_cnt; static unsigned int table_size, table_cnt;
static unsigned long long _text, _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext; static unsigned long long _text, _stext, _etext, _sinittext, _einittext;
static int all_symbols = 0; static int all_symbols = 0;
static char symbol_prefix_char = '\0'; static char symbol_prefix_char = '\0';
...@@ -99,10 +99,6 @@ static int read_symbol(FILE *in, struct sym_entry *s) ...@@ -99,10 +99,6 @@ static int read_symbol(FILE *in, struct sym_entry *s)
_sinittext = s->addr; _sinittext = s->addr;
else if (strcmp(sym, "_einittext") == 0) else if (strcmp(sym, "_einittext") == 0)
_einittext = s->addr; _einittext = s->addr;
else if (strcmp(sym, "_sextratext") == 0)
_sextratext = s->addr;
else if (strcmp(sym, "_eextratext") == 0)
_eextratext = s->addr;
else if (toupper(stype) == 'A') else if (toupper(stype) == 'A')
{ {
/* Keep these useful absolute symbols */ /* Keep these useful absolute symbols */
...@@ -165,18 +161,18 @@ static int symbol_valid(struct sym_entry *s) ...@@ -165,18 +161,18 @@ static int symbol_valid(struct sym_entry *s)
* and inittext sections are discarded */ * and inittext sections are discarded */
if (!all_symbols) { if (!all_symbols) {
if ((s->addr < _stext || s->addr > _etext) if ((s->addr < _stext || s->addr > _etext)
&& (s->addr < _sinittext || s->addr > _einittext) && (s->addr < _sinittext || s->addr > _einittext))
&& (s->addr < _sextratext || s->addr > _eextratext))
return 0; return 0;
/* Corner case. Discard any symbols with the same value as /* Corner case. Discard any symbols with the same value as
* _etext _einittext or _eextratext; they can move between pass * _etext _einittext; they can move between pass 1 and 2 when
* 1 and 2 when the kallsyms data are added. If these symbols * the kallsyms data are added. If these symbols move then
* move then they may get dropped in pass 2, which breaks the * they may get dropped in pass 2, which breaks the kallsyms
* kallsyms rules. * rules.
*/ */
if ((s->addr == _etext && strcmp((char*)s->sym + offset, "_etext")) || if ((s->addr == _etext &&
(s->addr == _einittext && strcmp((char*)s->sym + offset, "_einittext")) || strcmp((char *)s->sym + offset, "_etext")) ||
(s->addr == _eextratext && strcmp((char*)s->sym + offset, "_eextratext"))) (s->addr == _einittext &&
strcmp((char *)s->sym + offset, "_einittext")))
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册