diff options
Diffstat (limited to 'exec/exec.c')
| -rw-r--r-- | exec/exec.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/exec/exec.c b/exec/exec.c index b1c9825daff..7a8ef2c3a1a 100644 --- a/exec/exec.c +++ b/exec/exec.c | |||
| @@ -831,7 +831,7 @@ insert_args (struct exec_tracee *tracee, USER_REGS_STRUCT *regs, | |||
| 831 | assert (new3 == new + effective_size); | 831 | assert (new3 == new + effective_size); |
| 832 | 832 | ||
| 833 | /* And that it is properly aligned. */ | 833 | /* And that it is properly aligned. */ |
| 834 | assert (!(new3 & (sizeof new3 - 2))); | 834 | assert (!(new3 & (sizeof new3 - 1))); |
| 835 | 835 | ||
| 836 | /* Now modify the system call argument to point to new + | 836 | /* Now modify the system call argument to point to new + |
| 837 | text_size. */ | 837 | text_size. */ |
| @@ -916,6 +916,9 @@ exec_0 (char *name, struct exec_tracee *tracee, | |||
| 916 | program_header program; | 916 | program_header program; |
| 917 | USER_WORD entry, program_entry, offset; | 917 | USER_WORD entry, program_entry, offset; |
| 918 | USER_WORD header_offset; | 918 | USER_WORD header_offset; |
| 919 | #ifndef __mips__ | ||
| 920 | USER_WORD name_len, aligned_len; | ||
| 921 | #endif /* !__mips__ */ | ||
| 919 | struct exec_jump_command jump; | 922 | struct exec_jump_command jump; |
| 920 | #if defined __mips__ && !defined MIPS_NABI | 923 | #if defined __mips__ && !defined MIPS_NABI |
| 921 | int fpu_mode; | 924 | int fpu_mode; |
| @@ -1146,6 +1149,26 @@ exec_0 (char *name, struct exec_tracee *tracee, | |||
| 1146 | sizeof jump); | 1149 | sizeof jump); |
| 1147 | loader_area_used += sizeof jump; | 1150 | loader_area_used += sizeof jump; |
| 1148 | 1151 | ||
| 1152 | /* TODO: MIPS support. */ | ||
| 1153 | #ifndef __mips__ | ||
| 1154 | /* Copy the length of NAME and NAME itself to the loader area. */ | ||
| 1155 | name_len = strlen (name); | ||
| 1156 | aligned_len = ((name_len + 1 + sizeof name_len - 1) | ||
| 1157 | & -sizeof name_len); | ||
| 1158 | if (sizeof loader_area - loader_area_used | ||
| 1159 | < aligned_len + sizeof name_len) | ||
| 1160 | goto fail1; | ||
| 1161 | memcpy (loader_area + loader_area_used, &name_len, sizeof name_len); | ||
| 1162 | loader_area_used += sizeof name_len; | ||
| 1163 | memcpy (loader_area + loader_area_used, name, name_len + 1); | ||
| 1164 | loader_area_used += name_len + 1; | ||
| 1165 | |||
| 1166 | /* Properly align the loader area. */ | ||
| 1167 | offset = aligned_len - (name_len + 1); | ||
| 1168 | while (offset--) | ||
| 1169 | loader_area[loader_area_used++] = '\0'; | ||
| 1170 | #endif /* !__mips__ */ | ||
| 1171 | |||
| 1149 | /* Close the file descriptor and return the number of bytes | 1172 | /* Close the file descriptor and return the number of bytes |
| 1150 | used. */ | 1173 | used. */ |
| 1151 | 1174 | ||