basic idea of ar

This commit is contained in:
Gregory 2019-07-31 23:15:15 +03:00
parent d122896244
commit d991383a26
3 changed files with 46 additions and 2 deletions

16
.vscode/launch.json vendored
View file

@ -64,6 +64,22 @@
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"osx": {
"MIMode": "lldb"
}
},
{
"name": "ar",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/debug_bld/ft_nm",
"args": ["${workspaceFolder}/debug_bld/subprojects/libft/libft.a"],
"preLaunchTask": "build",
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"osx": {
"MIMode": "lldb"
}

View file

@ -1,6 +1,31 @@
#include "ft_nm.h"
#include "libft.h"
#include <ar.h>
void ar(t_nm_file *file)
{
(void)file;
struct ar_hdr *runner;
char *long_name;
size_t offset;
t_nm_file obj;
runner = file->file + SARMAG;
while ((void *)runner < file->file + file->size)
{
if (ft_strncmp(runner->ar_name, AR_EFMT1, 3) == 0)
{
offset = ft_atoi(&runner->ar_name[3]);
long_name = (char *)runner + sizeof(struct ar_hdr);
ft_putstr("\n");
ft_putstr(long_name);
ft_putstr("\n");
obj.file = (void *)((size_t)runner + sizeof(struct ar_hdr) + offset);
obj.size = ft_atoi(runner->ar_size) - offset;
if (*(uint32_t *)obj.file == MH_MAGIC_64)
macho64(&obj);
}
runner = (struct ar_hdr *)((size_t)runner + ft_atoi(runner->ar_size) + sizeof(struct ar_hdr));
}
}

View file

@ -6,7 +6,7 @@
/* By: gtertysh <gtertysh@student.unit.ua> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/07/13 14:52:27 by gtertysh #+# #+# */
/* Updated: 2019/07/27 19:35:42 by gtertysh ### ########.fr */
/* Updated: 2019/07/31 21:37:00 by gtertysh ### ########.fr */
/* */
/* ************************************************************************** */
@ -19,6 +19,7 @@ void hanldle_file(const char *filename)
t_nm_file file;
uint32_t magic;
// create dispatch table for this bullshit
init_file(&file);
open_file(filename, &file);
magic = *(uint32_t *)file.file;
@ -28,6 +29,8 @@ void hanldle_file(const char *filename)
macho32(&file);
else if (magic == FAT_CIGAM)
fat(&file);
else if (ft_strncmp(file.file, ARMAG, SARMAG) == 0)
ar(&file);
else
ft_putstr("invalid magic number.");
close_file(&file);