|
Lines 208-213
Link Here
|
| 208 |
return SYSCALL_RET(ret); |
208 |
return SYSCALL_RET(ret); |
| 209 |
} |
209 |
} |
| 210 |
|
210 |
|
|
|
211 |
static inline int wld_personality( int perso ) |
| 212 |
{ |
| 213 |
int ret; |
| 214 |
__asm__ __volatile__( "pushl %%ebx; movl %2,%%ebx; int $0x80; popl %%ebx" |
| 215 |
: "=a" (ret) : "0" (SYS_personality), "r" (perso) ); |
| 216 |
return SYSCALL_RET(ret); |
| 217 |
} |
| 218 |
|
| 211 |
static inline ssize_t wld_read( int fd, void *buffer, size_t len ) |
219 |
static inline ssize_t wld_read( int fd, void *buffer, size_t len ) |
| 212 |
{ |
220 |
{ |
| 213 |
int ret; |
221 |
int ret; |
|
Lines 226-231
Link Here
|
| 226 |
return SYSCALL_RET(ret); |
234 |
return SYSCALL_RET(ret); |
| 227 |
} |
235 |
} |
| 228 |
|
236 |
|
|
|
237 |
static inline int wld_execve( const char * path, char **argv, char ** envp ) |
| 238 |
{ |
| 239 |
int ret; |
| 240 |
__asm__ __volatile__( "pushl %%ebx; movl %2,%%ebx; int $0x80; popl %%ebx" |
| 241 |
: "=a" (ret) : "0" (SYS_execve), "r" (path), "c" (argv), "d" (envp) ); |
| 242 |
return SYSCALL_RET(ret); |
| 243 |
} |
| 244 |
|
| 229 |
static inline int wld_mprotect( const void *addr, size_t len, int prot ) |
245 |
static inline int wld_mprotect( const void *addr, size_t len, int prot ) |
| 230 |
{ |
246 |
{ |
| 231 |
int ret; |
247 |
int ret; |
|
Lines 886-891
Link Here
|
| 886 |
ElfW(auxv_t) new_av[12], delete_av[3], *av; |
902 |
ElfW(auxv_t) new_av[12], delete_av[3], *av; |
| 887 |
struct wld_link_map main_binary_map, ld_so_map; |
903 |
struct wld_link_map main_binary_map, ld_so_map; |
| 888 |
struct wine_preload_info **wine_main_preload_info; |
904 |
struct wine_preload_info **wine_main_preload_info; |
|
|
905 |
unsigned int perso; |
| 889 |
|
906 |
|
| 890 |
pargc = *stack; |
907 |
pargc = *stack; |
| 891 |
argv = (char **)pargc + 1; |
908 |
argv = (char **)pargc + 1; |
|
Lines 894-899
Link Here
|
| 894 |
/* skip over the parameters */ |
911 |
/* skip over the parameters */ |
| 895 |
p = argv + *pargc + 1; |
912 |
p = argv + *pargc + 1; |
| 896 |
|
913 |
|
|
|
914 |
perso = wld_personality(0xffffffff); |
| 915 |
if (!(perso & 0x200000)) { |
| 916 |
wld_personality(perso | 0x200000); |
| 917 |
wld_execve(argv[0],argv,p); |
| 918 |
fatal_error( "Failed execve %s\n", argv[0] ); |
| 919 |
return NULL; |
| 920 |
} |
| 921 |
|
| 897 |
/* skip over the environment */ |
922 |
/* skip over the environment */ |
| 898 |
while (*p) |
923 |
while (*p) |
| 899 |
{ |
924 |
{ |