mirror of
https://github.com/tsoding/good_training_language.git
synced 2026-09-12 19:50:53 +05:00
Порядок линковки библиотек имеет значение.
This commit is contained in:
parent
a13adc771c
commit
590159b32d
@ -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<usize>,
|
||||
pub строки: HashMap<String, usize>,
|
||||
pub внешние_символы: HashMap<String, usize>,
|
||||
pub библиотеки: HashSet<String>,
|
||||
pub библиотеки: HashMap<String, usize>,
|
||||
}
|
||||
|
||||
impl ПП {
|
||||
@ -1086,7 +1086,7 @@ impl Программа {
|
||||
}
|
||||
ВидЛексемы::КлючБибл => {
|
||||
let имя = лекс.вытащить_лексему_вида(&[ВидЛексемы::Идент])?;
|
||||
self.пп.библиотеки.insert(имя.текст.clone());
|
||||
self.пп.библиотеки.insert(имя.текст.clone(), self.пп.библиотеки.len());
|
||||
let _ = лекс.вытащить_лексему_вида(&[ВидЛексемы::ТочкаЗапятая])?;
|
||||
}
|
||||
ВидЛексемы::Конец => break,
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user