diff --git a/исходники/компилятор.rs b/исходники/компилятор.rs index d311f99..4c5f088 100644 --- a/исходники/компилятор.rs +++ b/исходники/компилятор.rs @@ -1,7 +1,7 @@ /// Промежуточное Представление use super::Результат; -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use std::path::PathBuf; use синтаксис::*; use диагностика::*; @@ -106,7 +106,7 @@ pub struct ПП { pub заплатки_неиниц_указателей: Vec, pub строки: HashMap, pub внешние_символы: HashMap, - pub библиотеки: HashSet, + pub библиотеки: HashMap, } impl ПП { @@ -1086,7 +1086,7 @@ impl Программа { } ВидЛексемы::КлючБибл => { let имя = лекс.вытащить_лексему_вида(&[ВидЛексемы::Идент])?; - self.пп.библиотеки.insert(имя.текст.clone()); + self.пп.библиотеки.insert(имя.текст.clone(), self.пп.библиотеки.len()); let _ = лекс.вытащить_лексему_вида(&[ВидЛексемы::ТочкаЗапятая])?; } ВидЛексемы::Конец => break, diff --git a/исходники/фазм.rs b/исходники/фазм.rs index 8a38c1b..ff208a0 100644 --- a/исходники/фазм.rs +++ b/исходники/фазм.rs @@ -254,6 +254,8 @@ pub fn сгенерировать_исполняемый_файл(путь_к_и } let _ = writeln!(&mut файл, " rb {}", пп.размер_неиниц_данных); + let _ = writeln!(&mut файл, "section \".note.GNU-stack\""); + drop(файл); println!("ИНФО: сгенерирован файл «{путь_к_фазму}»", путь_к_фазму = путь_к_фазму.display()); @@ -301,9 +303,10 @@ pub fn сгенерировать_исполняемый_файл(путь_к_и .arg("-dynamic-linker").arg("/lib64/ld-linux-x86-64.so.2") // СДЕЛАТЬ: расхардкодить пусть к линкуемым библиотекам .arg("-L./модули/"); - // СДЕЛАТЬ: проверить имеет ли значение порядок линковки библиотек - for библ in &пп.библиотеки { - кмд.arg(format!("-l{библ}")); + let mut библиотеки: Vec<_> = пп.библиотеки.iter().collect(); + библиотеки.sort_by_key(|(_, индекс)| *индекс); + for (имя, _) in &библиотеки { + кмд.arg(format!("-l{имя}")); } кмд.stdout(Stdio::inherit()) .spawn()