@@ -218,19 +218,42 @@ func mincore(addr unsafe.Pointer, n uintptr, dst *byte) int32
218
218
func sysargs (argc int32 , argv * * byte ) {
219
219
n := argc + 1
220
220
221
- // skip over argv, envp to get to auxv
222
- for argv_index (argv , n ) != nil {
223
- n ++
221
+ argsValid := true
222
+ if islibrary || isarchive {
223
+ if ! sysLibArgsValid () {
224
+ argsValid = false
225
+ }
224
226
}
225
227
226
- // skip NULL separator
227
- n ++
228
+ if argsValid {
229
+ // skip over argv, envp to get to auxv
230
+ for argv_index (argv , n ) != nil {
231
+ n ++
232
+ }
228
233
229
- // now argv+n is auxv
230
- auxv := (* [1 << 28 ]uintptr )(add (unsafe .Pointer (argv ), uintptr (n )* goarch .PtrSize ))
231
- if sysauxv (auxv [:]) != 0 {
232
- return
234
+ // skip NULL separator
235
+ n ++
236
+
237
+ // now argv+n is auxv
238
+ auxv := (* [1 << 28 ]uintptr )(add (unsafe .Pointer (argv ), uintptr (n )* goarch .PtrSize ))
239
+ if sysauxv (auxv [:]) != 0 {
240
+ return
241
+ }
242
+ } else {
243
+ args := unsafe .Pointer (persistentalloc (goarch .PtrSize * 4 , 0 , & memstats .other_sys ))
244
+ // argv pointer
245
+ * (* * byte )(args ) = (* byte )(add (args , goarch .PtrSize * 1 ))
246
+ // argv data
247
+ * (* * byte )(add (args , goarch .PtrSize * 1 )) = (* byte )(nil ) // end argv TODO: READ FROM /proc/
248
+ * (* * byte )(add (args , goarch .PtrSize * 2 )) = (* byte )(nil ) // end envp TODO: READ FROM /proc/
249
+ * (* * byte )(add (args , goarch .PtrSize * 3 )) = (* byte )(nil ) // end auxv TODO: READ FROM /proc/
250
+ argc = 0
251
+ argv = (* * byte )(args )
252
+
253
+ // argc = 0
254
+ // argv = (**byte)(&[3]*byte{nil, nil, nil})
233
255
}
256
+
234
257
// In some situations we don't get a loader-provided
235
258
// auxv, such as when loaded as a library on Android.
236
259
// Fall back to /proc/self/auxv.
0 commit comments