Порядок линковки библиотек имеет значение.

This commit is contained in:
rexim 2024-01-27 03:04:59 +07:00
parent a13adc771c
commit 590159b32d
2 changed files with 9 additions and 6 deletions

View File

@ -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,

View File

@ -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()