Przeglądaj źródła

extract suffix from objects

Alexandre Janniaux 5 lat temu
rodzic
commit
ae5097bca8
3 zmienionych plików z 92 dodań i 7 usunięć
  1. 49 0
      Cargo.lock
  2. 1 0
      Cargo.toml
  3. 42 7
      src/main.rs

+ 49 - 0
Cargo.lock

@@ -1,6 +1,14 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
 [[package]]
+name = "aho-corasick"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "ansi_term"
 version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -52,6 +60,7 @@ version = "0.1.0"
 dependencies = [
  "ar 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "structopt 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -64,11 +73,21 @@ dependencies = [
 ]
 
 [[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "libc"
 version = "0.2.65"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
+name = "memchr"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "proc-macro-error"
 version = "0.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -95,6 +114,22 @@ dependencies = [
 ]
 
 [[package]]
+name = "regex"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
+ "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "strsim"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -139,6 +174,14 @@ dependencies = [
 ]
 
 [[package]]
+name = "thread_local"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
 name = "unicode-segmentation"
 version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -178,6 +221,7 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [metadata]
+"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d"
 "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
 "checksum ar 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "450575f58f7bee32816abbff470cbc47797397c2a81e0eaced4b98436daf52e1"
 "checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90"
@@ -185,15 +229,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)" = "aa87058dce70a3ff5621797f1506cb837edd02ac4c0ae642b4542dce802908b8"
 "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
 "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
+"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 "checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8"
+"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
 "checksum proc-macro-error 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aeccfe4d5d8ea175d5f0e4a2ad0637e0f4121d63bd99d356fb1f39ab2e7c6097"
 "checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27"
 "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
+"checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd"
+"checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716"
 "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
 "checksum structopt 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c167b61c7d4c126927f5346a4327ce20abf8a186b8041bbeb1ce49e5db49587b"
 "checksum structopt-derive 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "519621841414165d2ad0d4c92be8f41844203f2b67e245f9345a5a12d40c69d7"
 "checksum syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "661641ea2aa15845cddeb97dad000d22070bb5c1fb456b96c1cba883ec691e92"
 "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
 "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0"
 "checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20"
 "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"

+ 1 - 0
Cargo.toml

@@ -10,3 +10,4 @@ edition = "2018"
 structopt = "0.3"
 ar = "0.8"
 cc = "1.0"
+regex = "1.3"

+ 42 - 7
src/main.rs

@@ -7,6 +7,7 @@ use ar::Archive;
 use std::fs::File;
 use std::io;
 use std::io::Write;
+use regex::Regex;
 
 #[derive(Debug, StructOpt)]
 #[structopt(name = "Localize", about = "Localize a static library into a single object archive")]
@@ -80,6 +81,8 @@ fn localize_hidden(input: &PathBuf)
      * */
 
     Command::new("objcopy")
+        .arg("--wildcard")
+        .arg("--globalize-symbol=vlc_entry*")
         .arg("--localize-hidden")
         .arg("--strip-unneeded")
         .arg("--strip-symbol=vlc_module_name")
@@ -104,6 +107,7 @@ fn link(input_lib: &PathBuf, output_object: &PathBuf)
     localize_hidden(&output_object);
 }
 
+#[derive(Debug)]
 struct PluginEntry
 {
     lib: PathBuf,
@@ -116,6 +120,8 @@ fn generate_plugin(
     output: &PathBuf
 ) {
 
+    println!("{:?}", plugins);
+
     let plugins_entries : Vec<String> = plugins
         .iter()
         .map(|plugin| String::from("vlc_entry") + &plugin.suffix)
@@ -123,15 +129,16 @@ fn generate_plugin(
 
     let prototypes = plugins_entries
         .iter()
-        .map(|entry| String::from("int ") + entry + "(vlc_set_cb, void*);")
+        .map(|entry| String::from("int ") + entry + "(vlc_set_cb, void*);\n")
         .fold(String::new(), |entries, entry| entries + &entry);
 
     let entries = plugins_entries
         .iter()
         .fold(String::new(), |entries, entry|
-              entries + &entry + " ,");
+              entries + &entry + " ,\n    ");
 
     let sources = format!("
+#include <stddef.h>
 typedef int (*vlc_set_cb) (void *, void *, int, ...);
 typedef int (*vlc_plugin_entry) (vlc_set_cb, void *);
 
@@ -145,7 +152,8 @@ const char vlc_module_name[] = \"FOO\";
 
 VLC_LOCAL
 vlc_plugin_entry vlc_plugin_entries[] = {{
-    {entries} 0,
+    {entries}
+    NULL,
 }};
 
 VLC_EXPORT
@@ -231,6 +239,31 @@ const char * vlc_entry_api_version()
         .unwrap();
 }
 
+fn find_vlc_suffix(input_lib: &PathBuf)
+    -> Option<String>
+{
+    let ret = Command::new("objdump")
+        .arg("-t")
+        .arg(&input_lib)
+        .output()
+        .unwrap();
+
+    let vlc_entry_pattern = Regex::new(r"vlc_entry__([0-9a-zA-Z_]+)")
+        .unwrap();
+
+    let entry = String::from_utf8(ret.stdout)
+        .unwrap()
+        .lines()
+        .inspect(|line| println!("Analysing {}", line))
+        .filter_map(|line| vlc_entry_pattern.captures(line))
+        .inspect(|line| println!("Found {:?}", line))
+        .map(|cap| String::from(&cap[0]["vlc_entry__".len()..]))
+        .next();
+
+    return entry
+}
+
+
 fn main() {
     let opt = LocalizeArgs::from_args();
     println!("{:?}", opt);
@@ -262,10 +295,12 @@ fn main() {
 
     // Generate the plugin entries information needed for the new
     // merging plugin.
-    let plugin_entries = output_files
-        .into_iter()
-        .map(|object| PluginEntry {
-            suffix: "__video_chroma_yuy2_i420".into(),
+    let plugin_entries = opt.input_files
+        .iter()
+        .map(|filepath| find_vlc_suffix(&filepath).unwrap())
+        .zip(output_files.into_iter())
+        .map(|(input, object)| PluginEntry {
+            suffix: format!("__{}", input),
             lib: object, })
         .collect();