about summary refs log tree commit diff
path: root/src/libstd/sys
diff options
context:
space:
mode:
authorleo60228 <iakornfeld@gmail.com>2019-11-21 08:21:14 -0500
committerleo60228 <iakornfeld@gmail.com>2019-11-22 12:27:07 -0500
commitd8b6be9b1ffad1bff1eebe0905b60b35a234ebee (patch)
tree2685c74a45ba4146446defb883acb00f14429e0b /src/libstd/sys
parent9d6ff1553b7debbe5c99c102ce0978b6130592f8 (diff)
downloadrust-d8b6be9b1ffad1bff1eebe0905b60b35a234ebee.tar.gz
rust-d8b6be9b1ffad1bff1eebe0905b60b35a234ebee.zip
Use .init_array section on glibc
Diffstat (limited to 'src/libstd/sys')
-rw-r--r--src/libstd/sys/unix/args.rs20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/libstd/sys/unix/args.rs b/src/libstd/sys/unix/args.rs
index 82ef35ea7b5..4dd331d3130 100644
--- a/src/libstd/sys/unix/args.rs
+++ b/src/libstd/sys/unix/args.rs
@@ -78,6 +78,26 @@ mod imp {
         ARGV = argv;
     }
 
+    #[cfg(all(target_os = "linux", target_env = "gnu"))]
+    #[used]
+    #[link_section = ".init_array"]
+    static ARGV_INIT_ARRAY: extern "C" fn(
+        crate::os::raw::c_int,
+        *const *const u8,
+        *const *const u8,
+    ) = {
+        extern "C" fn init_wrapper(
+            argc: crate::os::raw::c_int,
+            argv: *const *const u8,
+            _envp: *const *const u8,
+        ) {
+            unsafe {
+                init(argc as isize, argv);
+            }
+        }
+        init_wrapper
+    };
+
     pub unsafe fn cleanup() {
         let _guard = LOCK.lock();
         ARGC = 0;