Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
689f936f
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
689f936f
编写于
4月 29, 2003
作者:
B
bellard
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
symbol fix
git-svn-id:
svn://svn.savannah.nongnu.org/qemu/trunk@103
c046a42c-6fe2-441c-8c8c-71466251a162
上级
6977fbfd
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
80 addition
and
3 deletion
+80
-3
elf.h
elf.h
+5
-3
linux-user/elfload.c
linux-user/elfload.c
+75
-0
未找到文件。
elf.h
浏览文件 @
689f936f
#ifndef _ELF_H
#define _ELF_H
#ifndef _
QEMU_
ELF_H
#define _
QEMU_
ELF_H
#include <inttypes.h>
...
...
@@ -996,6 +996,7 @@ typedef struct elf64_note {
#define elf_phdr elf32_phdr
#define elf_note elf32_note
#define elf_shdr elf32_shdr
#define elf_sym elf32_sym
#ifdef ELF_USES_RELOCA
# define ELF_RELOC Elf32_Rela
...
...
@@ -1009,6 +1010,7 @@ typedef struct elf64_note {
#define elf_phdr elf64_phdr
#define elf_note elf64_note
#define elf_shdr elf64_shdr
#define elf_sym elf64_sym
#ifdef ELF_USES_RELOCA
# define ELF_RELOC Elf64_Rela
...
...
@@ -1029,4 +1031,4 @@ typedef struct elf64_note {
#endif
#endif
/* _ELF_H */
#endif
/* _
QEMU_
ELF_H */
linux-user/elfload.c
浏览文件 @
689f936f
...
...
@@ -11,6 +11,7 @@
#include <string.h>
#include "qemu.h"
#include "disas.h"
#ifdef TARGET_I386
...
...
@@ -195,6 +196,28 @@ static void bswap_phdr(Elf32_Phdr *phdr)
bswap32s
(
&
phdr
->
p_flags
);
/* Segment flags */
bswap32s
(
&
phdr
->
p_align
);
/* Segment alignment */
}
static
void
bswap_shdr
(
Elf32_Shdr
*
shdr
)
{
bswap32s
(
&
shdr
->
sh_name
);
bswap32s
(
&
shdr
->
sh_type
);
bswap32s
(
&
shdr
->
sh_flags
);
bswap32s
(
&
shdr
->
sh_addr
);
bswap32s
(
&
shdr
->
sh_offset
);
bswap32s
(
&
shdr
->
sh_size
);
bswap32s
(
&
shdr
->
sh_link
);
bswap32s
(
&
shdr
->
sh_info
);
bswap32s
(
&
shdr
->
sh_addralign
);
bswap32s
(
&
shdr
->
sh_entsize
);
}
static
void
bswap_sym
(
Elf32_Sym
*
sym
)
{
bswap32s
(
&
sym
->
st_name
);
bswap32s
(
&
sym
->
st_value
);
bswap32s
(
&
sym
->
st_size
);
bswap16s
(
&
sym
->
st_shndx
);
}
#endif
static
void
*
get_free_page
(
void
)
...
...
@@ -656,7 +679,56 @@ static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex,
return
((
unsigned
long
)
interp_elf_ex
->
e_entry
)
+
load_addr
;
}
/* Best attempt to load symbols from this ELF object. */
static
void
load_symbols
(
struct
elfhdr
*
hdr
,
int
fd
)
{
unsigned
int
i
;
struct
elf_shdr
sechdr
,
symtab
,
strtab
;
char
*
strings
;
lseek
(
fd
,
hdr
->
e_shoff
,
SEEK_SET
);
for
(
i
=
0
;
i
<
hdr
->
e_shnum
;
i
++
)
{
if
(
read
(
fd
,
&
sechdr
,
sizeof
(
sechdr
))
!=
sizeof
(
sechdr
))
return
;
#ifdef BSWAP_NEEDED
bswap_shdr
(
&
sechdr
);
#endif
if
(
sechdr
.
sh_type
==
SHT_SYMTAB
)
{
symtab
=
sechdr
;
lseek
(
fd
,
hdr
->
e_shoff
+
sizeof
(
sechdr
)
*
sechdr
.
sh_link
,
SEEK_SET
);
if
(
read
(
fd
,
&
strtab
,
sizeof
(
strtab
))
!=
sizeof
(
strtab
))
return
;
#ifdef BSWAP_NEEDED
bswap_shdr
(
&
strtab
);
#endif
goto
found
;
}
}
return
;
/* Shouldn't happen... */
found:
/* Now know where the strtab and symtab are. Snarf them. */
disas_symtab
=
malloc
(
symtab
.
sh_size
);
disas_strtab
=
strings
=
malloc
(
strtab
.
sh_size
);
if
(
!
disas_symtab
||
!
disas_strtab
)
return
;
lseek
(
fd
,
symtab
.
sh_offset
,
SEEK_SET
);
if
(
read
(
fd
,
disas_symtab
,
symtab
.
sh_size
)
!=
symtab
.
sh_size
)
return
;
#ifdef BSWAP_NEEDED
for
(
i
=
0
;
i
<
symtab
.
sh_size
/
sizeof
(
struct
elf_sym
);
i
++
)
bswap_sym
(
disas_symtab
+
sizeof
(
struct
elf_sym
)
*
i
);
#endif
lseek
(
fd
,
strtab
.
sh_offset
,
SEEK_SET
);
if
(
read
(
fd
,
strings
,
strtab
.
sh_size
)
!=
strtab
.
sh_size
)
return
;
disas_num_syms
=
symtab
.
sh_size
/
sizeof
(
struct
elf_sym
);
}
static
int
load_elf_binary
(
struct
linux_binprm
*
bprm
,
struct
target_pt_regs
*
regs
,
struct
image_info
*
info
)
...
...
@@ -989,6 +1061,9 @@ static int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * r
free
(
elf_phdata
);
if
(
loglevel
)
load_symbols
(
&
elf_ex
,
bprm
->
fd
);
if
(
interpreter_type
!=
INTERPRETER_AOUT
)
close
(
bprm
->
fd
);
info
->
personality
=
(
ibcs2_interpreter
?
PER_SVR4
:
PER_LINUX
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录