linux-user: fake /proc/self/auxv

Gtk tries to read /proc/self/auxv to find its auxv table instead of
taking it from its own program memory space.

However, when running with linux-user, we see the host's auxv which
clearly exposes wrong information. so let's instead expose the guest
memory backed auxv tables via /proc/self/auxv as well.

Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
Alexander Graf 2011-11-02 20:23:26 +01:00 committed by Riku Voipio
parent 480b8e7dd5
commit 257450ee59
1 changed files with 30 additions and 0 deletions

View File

@ -4639,6 +4639,35 @@ static int open_self_stat(void *cpu_env, int fd)
return 0;
}
static int open_self_auxv(void *cpu_env, int fd)
{
TaskState *ts = ((CPUState *)cpu_env)->opaque;
abi_ulong auxv = ts->info->saved_auxv;
abi_ulong len = ts->info->auxv_len;
char *ptr;
/*
* Auxiliary vector is stored in target process stack.
* read in whole auxv vector and copy it to file
*/
ptr = lock_user(VERIFY_READ, auxv, len, 0);
if (ptr != NULL) {
while (len > 0) {
ssize_t r;
r = write(fd, ptr, len);
if (r <= 0) {
break;
}
len -= r;
ptr += r;
}
lseek(fd, 0, SEEK_SET);
unlock_user(ptr, auxv, len);
}
return 0;
}
static int do_open(void *cpu_env, const char *pathname, int flags, mode_t mode)
{
struct fake_open {
@ -4649,6 +4678,7 @@ static int do_open(void *cpu_env, const char *pathname, int flags, mode_t mode)
static const struct fake_open fakes[] = {
{ "/proc/self/maps", open_self_maps },
{ "/proc/self/stat", open_self_stat },
{ "/proc/self/auxv", open_self_auxv },
{ NULL, NULL }
};