Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
377f9b8c
Commit
377f9b8c
authored
Jan 12, 2003
by
Richard Henderson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[MODULES] Centralize undefined symbol checks; handle undef weak.
parent
291b901b
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
63 additions
and
128 deletions
+63
-128
arch/alpha/kernel/module.c
arch/alpha/kernel/module.c
+3
-8
arch/arm/kernel/module.c
arch/arm/kernel/module.c
+0
-5
arch/i386/kernel/module.c
arch/i386/kernel/module.c
+2
-6
arch/ppc/kernel/module.c
arch/ppc/kernel/module.c
+2
-6
arch/s390/kernel/module.c
arch/s390/kernel/module.c
+3
-7
arch/s390x/kernel/module.c
arch/s390x/kernel/module.c
+2
-6
arch/sparc/kernel/module.c
arch/sparc/kernel/module.c
+3
-7
arch/sparc64/kernel/module.c
arch/sparc64/kernel/module.c
+3
-7
arch/v850/kernel/module.c
arch/v850/kernel/module.c
+3
-10
arch/x86_64/kernel/module.c
arch/x86_64/kernel/module.c
+2
-6
include/linux/elf.h
include/linux/elf.h
+6
-5
include/linux/moduleloader.h
include/linux/moduleloader.h
+0
-8
kernel/module.c
kernel/module.c
+34
-47
No files found.
arch/alpha/kernel/module.c
View file @
377f9b8c
...
...
@@ -190,15 +190,10 @@ apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,
/* This is where to make the change. */
location
=
base
+
rela
[
i
].
r_offset
;
/* This is the symbol it is referring to. */
/* This is the symbol it is referring to. Note that all
unresolved symbols have been resolved. */
sym
=
symtab
+
r_sym
;
value
=
sym
->
st_value
;
if
(
!
value
)
{
printk
(
KERN_ERR
"module %s: Unknown symbol %s
\n
"
,
me
->
name
,
strtab
+
sym
->
st_name
);
return
-
ENOENT
;
}
value
+=
rela
[
i
].
r_addend
;
value
=
sym
->
st_value
+
rela
[
i
].
r_addend
;
switch
(
r_type
)
{
case
R_ALPHA_NONE
:
...
...
arch/arm/kernel/module.c
View file @
377f9b8c
...
...
@@ -98,11 +98,6 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
}
sym
=
((
Elf32_Sym
*
)
symsec
->
sh_addr
)
+
offset
;
if
(
!
sym
->
st_value
)
{
printk
(
KERN_WARNING
"%s: unknown symbol %s
\n
"
,
module
->
name
,
strtab
+
sym
->
st_name
);
return
-
ENOENT
;
}
if
(
rel
->
r_offset
<
0
||
rel
->
r_offset
>
dstsec
->
sh_size
-
sizeof
(
u32
))
{
printk
(
KERN_ERR
"%s: out of bounds relocation, "
...
...
arch/i386/kernel/module.c
View file @
377f9b8c
...
...
@@ -70,14 +70,10 @@ int apply_relocate(Elf32_Shdr *sechdrs,
/* This is where to make the change */
location
=
(
void
*
)
sechdrs
[
sechdrs
[
relsec
].
sh_info
].
sh_addr
+
rel
[
i
].
r_offset
;
/* This is the symbol it is referring to */
/* This is the symbol it is referring to. Note that all
undefined symbols have been resolved. */
sym
=
(
Elf32_Sym
*
)
sechdrs
[
symindex
].
sh_addr
+
ELF32_R_SYM
(
rel
[
i
].
r_info
);
if
(
!
sym
->
st_value
)
{
printk
(
KERN_WARNING
"%s: Unknown symbol %s
\n
"
,
me
->
name
,
strtab
+
sym
->
st_name
);
return
-
ENOENT
;
}
switch
(
ELF32_R_TYPE
(
rel
[
i
].
r_info
))
{
case
R_386_32
:
...
...
arch/ppc/kernel/module.c
View file @
377f9b8c
...
...
@@ -197,14 +197,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
/* This is where to make the change */
location
=
(
void
*
)
sechdrs
[
sechdrs
[
relsec
].
sh_info
].
sh_addr
+
rela
[
i
].
r_offset
;
/* This is the symbol it is referring to */
/* This is the symbol it is referring to. Note that all
undefined symbols have been resolved. */
sym
=
(
Elf32_Sym
*
)
sechdrs
[
symindex
].
sh_addr
+
ELF32_R_SYM
(
rela
[
i
].
r_info
);
if
(
!
sym
->
st_value
)
{
printk
(
KERN_WARNING
"%s: Unknown symbol %s
\n
"
,
module
->
name
,
strtab
+
sym
->
st_name
);
return
-
ENOENT
;
}
/* `Everything is relative'. */
value
=
sym
->
st_value
+
rela
[
i
].
r_addend
;
...
...
arch/s390/kernel/module.c
View file @
377f9b8c
/*
* arch/s390
x/kernel/module.c - Kernel module help for s390x
.
* arch/s390
/kernel/module.c - Kernel module help for s390
.
*
* S390 version
* Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
...
...
@@ -77,14 +77,10 @@ int apply_relocate(Elf_Shdr *sechdrs,
/* This is where to make the change */
location
=
(
void
*
)
sechdrs
[
sechdrs
[
relsec
].
sh_info
].
sh_addr
+
rel
[
i
].
r_offset
;
/* This is the symbol it is referring to */
/* This is the symbol it is referring to. Note that all
undefined symbols have been resolved. */
sym
=
(
ElfW
(
Sym
)
*
)
sechdrs
[
symindex
].
sh_addr
+
ELFW
(
R_SYM
)(
rel
[
i
].
r_info
);
if
(
!
sym
->
st_value
)
{
printk
(
KERN_WARNING
"%s: Unknown symbol %s
\n
"
,
me
->
name
,
strtab
+
sym
->
st_name
);
return
-
ENOENT
;
}
switch
(
ELF_R_TYPE
(
rel
[
i
].
r_info
))
{
case
R_390_8
:
/* Direct 8 bit. */
...
...
arch/s390x/kernel/module.c
View file @
377f9b8c
...
...
@@ -78,14 +78,10 @@ int apply_relocate(Elf_Shdr *sechdrs,
/* This is where to make the change */
location
=
(
void
*
)
sechdrs
[
sechdrs
[
relsec
].
sh_info
].
sh_addr
+
rel
[
i
].
r_offset
;
/* This is the symbol it is referring to */
/* This is the symbol it is referring to. Note that all
undefined symbols have been resolved. */
sym
=
(
ElfW
(
Sym
)
*
)
sechdrs
[
symindex
].
sh_addr
+
ELFW
(
R_SYM
)(
rel
[
i
].
r_info
);
if
(
!
sym
->
st_value
)
{
printk
(
KERN_WARNING
"%s: Unknown symbol %s
\n
"
,
me
->
name
,
strtab
+
sym
->
st_name
);
return
-
ENOENT
;
}
switch
(
ELF_R_TYPE
(
rel
[
i
].
r_info
))
{
case
R_390_8
:
/* Direct 8 bit. */
...
...
arch/sparc/kernel/module.c
View file @
377f9b8c
...
...
@@ -75,15 +75,11 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
location
=
(
u8
*
)
sechdrs
[
sechdrs
[
relsec
].
sh_info
].
sh_addr
+
rel
[
i
].
r_offset
;
loc32
=
(
u32
*
)
location
;
/* This is the symbol it is referring to */
/* This is the symbol it is referring to. Note that all
undefined symbols have been resolved. */
sym
=
(
Elf32_Sym
*
)
sechdrs
[
symindex
].
sh_addr
+
ELF32_R_SYM
(
rel
[
i
].
r_info
);
if
(
!
(
v
=
sym
->
st_value
))
{
printk
(
KERN_WARNING
"%s: Unknown symbol %s
\n
"
,
me
->
name
,
strtab
+
sym
->
st_name
);
return
-
ENOENT
;
}
v
+=
rel
[
i
].
r_addend
;
v
=
sym
->
st_value
+
rel
[
i
].
r_addend
;
switch
(
ELF32_R_TYPE
(
rel
[
i
].
r_info
))
{
case
R_SPARC_32
:
...
...
arch/sparc64/kernel/module.c
View file @
377f9b8c
...
...
@@ -185,15 +185,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
BUG_ON
(((
u64
)
location
>>
(
u64
)
32
)
!=
(
u64
)
0
);
/* This is the symbol it is referring to */
/* This is the symbol it is referring to. Note that all
undefined symbols have been resolved. */
sym
=
(
Elf64_Sym
*
)
sechdrs
[
symindex
].
sh_addr
+
ELF64_R_SYM
(
rel
[
i
].
r_info
);
if
(
!
(
v
=
sym
->
st_value
))
{
printk
(
KERN_WARNING
"%s: Unknown symbol %s
\n
"
,
me
->
name
,
strtab
+
sym
->
st_name
);
return
-
ENOENT
;
}
v
+=
rel
[
i
].
r_addend
;
v
=
sym
->
st_value
+
rel
[
i
].
r_addend
;
switch
(
ELF64_R_TYPE
(
rel
[
i
].
r_info
)
&
0xff
)
{
case
R_SPARC_64
:
...
...
arch/v850/kernel/module.c
View file @
377f9b8c
...
...
@@ -184,19 +184,12 @@ int apply_relocate_add (Elf32_Shdr *sechdrs, const char *strtab,
uint32_t
*
loc
=
((
void
*
)
sechdrs
[
sechdrs
[
relsec
].
sh_info
].
sh_addr
+
rela
[
i
].
r_offset
);
/* This is the symbol it is referring to */
/* This is the symbol it is referring to. Note that all
undefined symbols have been resolved. */
Elf32_Sym
*
sym
=
((
Elf32_Sym
*
)
sechdrs
[
symindex
].
sh_addr
+
ELF32_R_SYM
(
rela
[
i
].
r_info
));
uint32_t
val
=
sym
->
st_value
;
if
(
!
val
)
{
printk
(
KERN_WARNING
"%s: Unknown symbol %s
\n
"
,
mod
->
name
,
strtab
+
sym
->
st_name
);
return
-
ENOENT
;
}
val
+=
rela
[
i
].
r_addend
;
uint32_t
val
=
sym
->
st_value
+
rela
[
i
].
r_addend
;
switch
(
ELF32_R_TYPE
(
rela
[
i
].
r_info
))
{
case
R_V850_32
:
...
...
arch/x86_64/kernel/module.c
View file @
377f9b8c
...
...
@@ -53,14 +53,10 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
loc
=
(
void
*
)
sechdrs
[
sechdrs
[
relsec
].
sh_info
].
sh_addr
+
rel
[
i
].
r_offset
;
/* This is the symbol it is referring to */
/* This is the symbol it is referring to. Note that all
undefined symbols have been resolved. */
sym
=
(
Elf64_Sym
*
)
sechdrs
[
symindex
].
sh_addr
+
ELF64_R_SYM
(
rel
[
i
].
r_info
);
if
(
!
sym
->
st_value
)
{
printk
(
KERN_WARNING
"%s: Unknown symbol %s
\n
"
,
me
->
name
,
strtab
+
sym
->
st_name
);
return
-
ENOENT
;
}
DEBUGP
(
"type %d st_value %Lx r_addend %Lx loc %Lx
\n
"
,
(
int
)
ELF64_R_TYPE
(
rel
[
i
].
r_info
),
...
...
include/linux/elf.h
View file @
377f9b8c
...
...
@@ -156,11 +156,12 @@ typedef __s64 Elf64_Sxword;
#define STT_SECTION 3
#define STT_FILE 4
#define ELF32_ST_BIND(x) ((x) >> 4)
#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
#define ELF64_ST_BIND(x) ((x) >> 4)
#define ELF64_ST_TYPE(x) (((unsigned int) x) & 0xf)
#define ELF_ST_BIND(x) ((x) >> 4)
#define ELF_ST_TYPE(x) (((unsigned int) x) & 0xf)
#define ELF32_ST_BIND(x) ELF_ST_BIND(x)
#define ELF32_ST_TYPE(x) ELF_ST_TYPE(x)
#define ELF64_ST_BIND(x) ELF_ST_BIND(x)
#define ELF64_ST_TYPE(x) ELF_ST_TYPE(x)
/* Symbolic values for the entries in the auxiliary table
put on the initial stack */
...
...
include/linux/moduleloader.h
View file @
377f9b8c
...
...
@@ -5,14 +5,6 @@
#include <linux/module.h>
#include <linux/elf.h>
/* Helper function for arch-specific module loaders */
unsigned
long
find_symbol_internal
(
Elf_Shdr
*
sechdrs
,
unsigned
int
symindex
,
const
char
*
strtab
,
const
char
*
name
,
struct
module
*
mod
,
struct
kernel_symbol_group
**
group
);
/* These must be implemented by the specific architecture */
/* Adjust arch-specific sections. Return 0 on success. */
...
...
kernel/module.c
View file @
377f9b8c
...
...
@@ -722,28 +722,22 @@ static int obsolete_params(const char *name,
}
#endif
/* CONFIG_OBSOLETE_MODPARM */
/* Find an symbol for this module (ie. resolve internals first).
It we find one, record usage. Must be holding module_mutex. */
unsigned
long
find_symbol_internal
(
Elf_Shdr
*
sechdrs
,
unsigned
int
symindex
,
const
char
*
strtab
,
const
char
*
name
,
struct
module
*
mod
,
struct
kernel_symbol_group
**
ksg
)
/* Resolve a symbol for this module. I.e. if we find one, record usage.
Must be holding module_mutex. */
static
unsigned
long
resolve_symbol
(
Elf_Shdr
*
sechdrs
,
unsigned
int
symindex
,
const
char
*
strtab
,
const
char
*
name
,
struct
module
*
mod
)
{
struct
kernel_symbol_group
*
ksg
;
unsigned
long
ret
;
ret
=
find_local_symbol
(
sechdrs
,
symindex
,
strtab
,
name
);
if
(
ret
)
{
*
ksg
=
NULL
;
return
ret
;
}
/* Look in other modules... */
spin_lock_irq
(
&
modlist_lock
);
ret
=
__find_symbol
(
name
,
ksg
,
mod
->
license_gplok
);
ret
=
__find_symbol
(
name
,
&
ksg
,
mod
->
license_gplok
);
if
(
ret
)
{
/* This can fail due to OOM, or module unloading */
if
(
!
use_module
(
mod
,
(
*
ksg
)
->
owner
))
if
(
!
use_module
(
mod
,
ksg
->
owner
))
ret
=
0
;
}
spin_unlock_irq
(
&
modlist_lock
);
...
...
@@ -832,21 +826,19 @@ static int simplify_symbols(Elf_Shdr *sechdrs,
unsigned
int
strindex
,
struct
module
*
mod
)
{
unsigned
int
i
;
Elf_Sym
*
sym
;
/* First simplify defined symbols, so if they become the
"answer" to undefined symbols, copying their st_value us
correct. */
for
(
sym
=
(
void
*
)
sechdrs
[
symindex
].
sh_addr
,
i
=
0
;
i
<
sechdrs
[
symindex
].
sh_size
/
sizeof
(
Elf_Sym
);
i
++
)
{
Elf_Sym
*
sym
=
(
void
*
)
sechdrs
[
symindex
].
sh_addr
;
const
char
*
strtab
=
(
char
*
)
sechdrs
[
strindex
].
sh_addr
;
unsigned
int
i
,
n
=
sechdrs
[
symindex
].
sh_size
/
sizeof
(
Elf_Sym
);
int
ret
=
0
;
for
(
i
=
1
;
i
<
n
;
i
++
)
{
switch
(
sym
[
i
].
st_shndx
)
{
case
SHN_COMMON
:
/* We compiled with -fno-common. These are not
supposed to happen. */
DEBUGP
(
"Common symbol: %s
\n
"
,
strtab
+
sym
[
i
].
st_name
);
return
-
ENOEXEC
;
ret
=
-
ENOEXEC
;
break
;
case
SHN_ABS
:
/* Don't need to do anything */
...
...
@@ -855,6 +847,20 @@ static int simplify_symbols(Elf_Shdr *sechdrs,
break
;
case
SHN_UNDEF
:
sym
[
i
].
st_value
=
resolve_symbol
(
sechdrs
,
symindex
,
strtab
,
strtab
+
sym
[
i
].
st_name
,
mod
);
/* Ok if resolved. */
if
(
sym
[
i
].
st_value
!=
0
)
break
;
/* Ok if weak. */
if
(
ELF_ST_BIND
(
sym
[
i
].
st_info
)
==
STB_WEAK
)
break
;
printk
(
KERN_WARNING
"%s: Unknown symbol %s
\n
"
,
mod
->
name
,
strtab
+
sym
[
i
].
st_name
);
ret
=
-
ENOENT
;
break
;
default:
...
...
@@ -862,30 +868,11 @@ static int simplify_symbols(Elf_Shdr *sechdrs,
=
(
unsigned
long
)
(
sechdrs
[
sym
[
i
].
st_shndx
].
sh_addr
+
sym
[
i
].
st_value
);
break
;
}
}
/* Now try to resolve undefined symbols */
for
(
sym
=
(
void
*
)
sechdrs
[
symindex
].
sh_addr
,
i
=
0
;
i
<
sechdrs
[
symindex
].
sh_size
/
sizeof
(
Elf_Sym
);
i
++
)
{
if
(
sym
[
i
].
st_shndx
==
SHN_UNDEF
)
{
/* Look for symbol */
struct
kernel_symbol_group
*
ksg
=
NULL
;
const
char
*
strtab
=
(
char
*
)
sechdrs
[
strindex
].
sh_addr
;
sym
[
i
].
st_value
=
find_symbol_internal
(
sechdrs
,
symindex
,
strtab
,
strtab
+
sym
[
i
].
st_name
,
mod
,
&
ksg
);
}
}
return
0
;
return
ret
;
}
/* Update size with this section: return offset. */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment