Устранить предупреждения.

This commit is contained in:
rexim 2024-01-20 17:54:26 +07:00
parent ab0ff4ed39
commit f93bb2f5de
3 changed files with 45 additions and 14 deletions

View File

@ -258,17 +258,58 @@ const КОМАНДЫ: &[Команда] = &[
},
Команда {
имя: "объект",
сигнатура: "<путь_к_файлу>",
сигнатура: " [-цель <цель>] <путь_к_файлу>",
описание: "Сгенерировать объектный файл, который можно скомпоновать со статическими библиотеками.",
запустить: |программа, mut аргы| {
let путь_к_файлу = if let Some(путь_к_файлу) = аргы.next() {
PathBuf::from(путь_к_файлу)
let mut файл_вывода = None;
let mut цель = Цель::ЛинуксИкс86_64Фазм;
loop {
match аргы.next() {
Some(арг) => match арг.as_str() {
"-цель" => {
match аргы.next() {
Some(арг) => match арг.as_str() {
"эльф" => цель = Цель::ЛинуксИкс86_64Эльф,
"фазм" => цель = Цель::ЛинуксИкс86_64Фазм,
_ => {
eprintln!("ОШИБКА: неизвестная цель «{арг}»");
// СДЕЛАТЬ: напечатать список возможных целей
return Err(())
}
}
None => {
eprintln!("ОШИБКА: Флаг «{арг}» требует значение.");
return Err(())
}
}
}
_ => {
if файл_вывода.is_some() {
пример(программа);
eprintln!("ОШИБКА: Неизвестный флаг «{арг}».");
return Err(())
} else {
файл_вывода = Some(арг)
}
}
}
None => break,
}
}
let файл_вывода = if let Some(файл_вывода) = аргы.next() {
PathBuf::from(файл_вывода)
} else {
пример(программа);
eprintln!("ОШИБКА: требуется путь к файлу!");
return Err(());
};
фазм::сгенерировать_объектный_файл(&путь_к_файлу)
match цель {
Цель::ЛинуксИкс86_64Фазм => фазм::сгенерировать_объектный_файл(&файл_вывода),
Цель::ЛинуксИкс86_64Эльф => эльф::сгенерировать_объектный_файл(&файл_вывода),
}
}
},
];

View File

@ -27,7 +27,6 @@ const ЭЛЬФ_ТЕКУЩАЯ_ВЕРСИЯ: usize = 1; // EV_CURRENT
const ЭЛЬФ64_РАЗМЕР_ЭЛЬФ_ЗАГОЛОВКА: usize = 64; // sizeof(Elf64_Ehdr)
const ЭЛЬФ64_РАЗМЕРРОГ_ЗАГОЛОВКА: usize = 56; // sizeof(Elf64_Phdr)
const ЭЛЬФ64_РАЗМЕР_СЕКЦ_ЗАГОЛОВКА: usize = 64; // sizeof(Elf64_Shdr)
const ЭЛЬФ64_РАЗМЕР_ЗАПИСИ_СИМВОЛА: usize = 24; // sizeof(Elf64_Sym)
enum ЭльфТип { // e_type
Перемещаемый = 1, // ET_REL
@ -328,11 +327,6 @@ pub fn сгенерировать_исполняемый_файл(путь_к_ф
}
}
fn выравнять_байты(байты: &mut Vec<u8>, выравнивание: usize) {
let новый_размер = (байты.len() + выравнивание - 1)/выравнивание*выравнивание;
байты.resize(новый_размер, 0);
}
#[derive(Clone, Copy)]
enum ТипСекции { // sh_type
Пустая = 0, // SHT_NULL
@ -406,14 +400,11 @@ impl Секция {
#[derive(Clone, Copy)]
enum ТипСимвола {
Никакой = 0, // STT_NOTYPE
Функция = 2, // STT_FUNC
Секция = 3, // STT_SECTION
}
#[derive(Clone, Copy)]
enum СвязьСимвола {
Локальная = 0, // STB_LOCAL
Глобальная = 1, // STB_GLOBAL
}
fn символ_инфо(связь: СвязьСимвола, тип: ТипСимвола) -> u8 { // ELF64_ST_INFO(bind, type)

View File

@ -6,7 +6,6 @@ mkdir -p ./сборка/
rustc -o ./сборка/хуяк -g исходники/хуяк.rs
mkdir -p ./сборка/примеры/
./сборка/хуяк комп -цель фазм -вывод ./сборка/примеры/01-привет-фазм ./примеры/01-привет.хуя
./сборка/хуяк комп -цель фазм -вывод ./сборка/примеры/02-цикл-фазм ./примеры/02-цикл.хуя
./сборка/хуяк комп -цель фазм -вывод ./сборка/примеры/03-имя-фазм ./примеры/03-имя.хуя