norme done

This commit is contained in:
Jack Halford 2017-10-08 11:35:05 +02:00
parent cfa90b1cd8
commit 5be6c47685
5 changed files with 88 additions and 67 deletions

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/20 14:36:10 by jhalford #+# #+# */ /* Created: 2017/02/20 14:36:10 by jhalford #+# #+# */
/* Updated: 2017/10/07 17:43:29 by jhalford ### ########.fr */ /* Updated: 2017/10/08 11:26:29 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -35,6 +35,7 @@
* -n numerical sort (as opposed to alphabetical) * -n numerical sort (as opposed to alphabetical)
* -p don't sort * -p don't sort
*/ */
# define NM_NOSORT (1 << 0) # define NM_NOSORT (1 << 0)
# define NM_NSORT (1 << 1) # define NM_NSORT (1 << 1)
# define NM_ASORT (1 << 2) # define NM_ASORT (1 << 2)
@ -47,6 +48,7 @@
* -u show only undefined symbols * -u show only undefined symbols
* -U filter-out undefined symbols * -U filter-out undefined symbols
*/ */
# define NM_ALL (1 << 4) # define NM_ALL (1 << 4)
# define NM_NO_LOCAL (1 << 5) # define NM_NO_LOCAL (1 << 5)
# define NM_NO_UNDF (1 << 6) # define NM_NO_UNDF (1 << 6)
@ -61,6 +63,7 @@
* get displayed as (undefined), (common), (absolute), and (indirect), * get displayed as (undefined), (common), (absolute), and (indirect),
* respectively. * respectively.
*/ */
# define NM_FULL (1 << 8) # define NM_FULL (1 << 8)
# define NM_OFORMAT (1 << 9) # define NM_OFORMAT (1 << 9)
# define NM_MFORMAT (1 << 10) # define NM_MFORMAT (1 << 10)
@ -137,6 +140,4 @@ void symbol_format_full(t_symbol *symbol);
void mach_64_parse(t_machodata *data); void mach_64_parse(t_machodata *data);
void dump_dysymtab(t_machodata *data, struct dysymtab_command *dysymtab); void dump_dysymtab(t_machodata *data, struct dysymtab_command *dysymtab);
void *hexdump(void *addr, unsigned int offset, unsigned int size);
#endif #endif

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/03 14:58:04 by jhalford #+# #+# */ /* Created: 2016/11/03 14:58:04 by jhalford #+# #+# */
/* Updated: 2016/11/03 15:02:10 by jhalford ### ########.fr */ /* Updated: 2017/10/08 10:39:45 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/02/19 03:09:12 by jhalford #+# #+# */ /* Created: 2017/02/19 03:09:12 by jhalford #+# #+# */
/* Updated: 2017/10/07 17:44:54 by jhalford ### ########.fr */ /* Updated: 2017/10/08 11:33:44 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -48,28 +48,51 @@ void mach_64_dump(struct mach_header_64 *file, t_nmdata *data)
ft_lstiter(mach.symbols, symbol_format, data); ft_lstiter(mach.symbols, symbol_format, data);
} }
int nm(void *file, t_nmdata *data) int nm_file(void *file, t_nmdata *data)
{ {
uint32_t magic = *(int *)file; uint32_t magic;
int is_fat = IS_FAT(magic);
int is_64 = IS_MAGIC_64(magic);
if (is_64) magic = *(int*)file;
if (IS_MAGIC_64(magic))
mach_64_dump(file, data); mach_64_dump(file, data);
else if (is_fat) else if (IS_FAT(magic))
ft_printf("{red}unsupported architecture:{eoc} magic = %#x (FAT)\n", magic); ft_printf("{red}unsupported arch:{eoc} magic=%#x(FAT)\n", magic);
else else
ft_printf("{red}unsupported architecture:{eoc} magic = %#x\n", magic); ft_printf("{red}unsupported arch:{eoc} magic=%#x\n", magic);
return (0);
}
int nm(int ac, char **av, t_nmdata data)
{
int i;
struct stat buf;
int fd;
char *file;
i = data.av_data - av;
while (i < ac && av[i])
{
data.filename = av[i];
if (!(data.flag & NM_OFORMAT) && ac - (data.av_data - av) > 1)
ft_printf("%c%s:\n", i - (data.av_data - av) ? '\n' : 0, av[i]);
if ((fd = open((data.filename), O_RDONLY)) < 0)
return (1);
if ((fstat(fd, &buf)) < 0)
return (1);
if ((file = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0))
== MAP_FAILED)
return (1);
nm_file(file, &data);
if (munmap(file, buf.st_size))
return (1);
i++;
}
return (0); return (0);
} }
int main(int ac, char **av) int main(int ac, char **av)
{ {
char *file;
t_nmdata data; t_nmdata data;
int fd;
int i;
struct stat buf;
data.flag = NM_ASORT; data.flag = NM_ASORT;
if (cliopts_get(av, g_nm_opts, &data)) if (cliopts_get(av, g_nm_opts, &data))
@ -78,22 +101,5 @@ int main(int ac, char **av)
ft_dprintf(2, NM_USAGE"\n"); ft_dprintf(2, NM_USAGE"\n");
return (1); return (1);
} }
i = data.av_data - av; return (nm(ac, av, data));
while (i < ac && av[i])
{
if (!(data.flag & NM_OFORMAT) && ac - (data.av_data - av) > 1)
ft_printf("%c%s:\n", i - (data.av_data - av) ? '\n' : 0, av[i]);
if ((fd = open((data.filename = av[i]), O_RDONLY)) < 0)
return (1);
if ((fstat(fd, &buf)) < 0)
return (1);
if ((file = mmap(NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0))
== MAP_FAILED)
return (1);
nm(file, &data);
if (munmap(file, buf.st_size))
return (1);
i++;
}
return (0);
} }

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/28 20:34:32 by jhalford #+# #+# */ /* Created: 2017/03/28 20:34:32 by jhalford #+# #+# */
/* Updated: 2017/10/07 17:43:32 by jhalford ### ########.fr */ /* Updated: 2017/10/08 11:34:43 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -29,10 +29,14 @@ void symbol_format_desc(t_symbol *symbol)
{ {
if (symbol->nlist->n_desc & REFERENCED_DYNAMICALLY) if (symbol->nlist->n_desc & REFERENCED_DYNAMICALLY)
ft_printf(" [referenced dynamically]"); ft_printf(" [referenced dynamically]");
ft_printf(" %sexternal", symbol->nlist->n_type & N_EXT ? "" : "non-"); if (symbol->nlist->n_type & N_EXT)
ft_printf("%s", ft_printf(" external");
!(symbol->nlist->n_type & N_EXT) else
&& symbol->nlist->n_type & N_PEXT ? " (was a private externel)" : ""); {
ft_printf(" non-external");
if (symbol->nlist->n_type & N_PEXT)
ft_printf(" (was a private external)");
}
} }
void symbol_format_m(t_symbol *symbol) void symbol_format_m(t_symbol *symbol)
@ -49,7 +53,7 @@ void symbol_format_m(t_symbol *symbol)
void symbol_format_full(t_symbol *symbol) void symbol_format_full(t_symbol *symbol)
{ {
ft_printf("\t%03b|%b|%x|%b \t%i(%s) \t%04x", ft_printf("\t%i %03b|%b|%x|%b \t%i(%s) \t%04x",
symbol->pos, symbol->pos,
(symbol->nlist->n_type & N_STAB) >> 5, (symbol->nlist->n_type & N_STAB) >> 5,
(symbol->nlist->n_type & N_PEXT) >> 4, (symbol->nlist->n_type & N_PEXT) >> 4,

View file

@ -6,7 +6,7 @@
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */ /* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2017/03/25 21:22:06 by jhalford #+# #+# */ /* Created: 2017/03/25 21:22:06 by jhalford #+# #+# */
/* Updated: 2017/10/07 18:35:41 by jhalford ### ########.fr */ /* Updated: 2017/10/08 11:02:50 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -14,7 +14,8 @@
t_machodata *g_data; t_machodata *g_data;
int symbol_init(t_symbol *symbol, char *stringtable, struct nlist_64 *array, int i) int symbol_init(t_symbol *symbol,
char *stringtable, struct nlist_64 *array, int i)
{ {
symbol->type = 0; symbol->type = 0;
symbol->pos = i; symbol->pos = i;
@ -23,34 +24,43 @@ int symbol_init(t_symbol *symbol, char *stringtable, struct nlist_64 *array, in
return (0); return (0);
} }
int symbol_set(t_symbol *symbol, t_machodata *data) static int symbol_gettype(int type_mask,
struct nlist_64 *nlist, struct section_64 *section)
{ {
struct nlist_64 *nlist; if (nlist->n_type & N_STAB)
uint8_t n_type; return (SYM_STAB);
uint8_t type_mask; else if (type_mask == N_UNDF && nlist->n_type & N_EXT && nlist->n_value)
return (SYM_COMMON);
nlist = symbol->nlist;
n_type = symbol->nlist->n_type;
type_mask = n_type & N_TYPE;
symbol->section = symbol->nlist->n_sect ?
(*(struct section_64**)ft_lst_at(data->sects, symbol->nlist->n_sect - 1)->content) : NULL;
if (n_type & N_STAB)
symbol->type = SYM_STAB;
else if (type_mask == N_UNDF && n_type & N_EXT && nlist->n_value != 0)
symbol->type = SYM_COMMON;
else if (type_mask == N_UNDF) else if (type_mask == N_UNDF)
symbol->type = SYM_UNDF; return (SYM_UNDF);
else if (type_mask == N_ABS) else if (type_mask == N_ABS)
symbol->type = SYM_ABS; return (SYM_ABS);
else if (type_mask == N_SECT && ft_strcmp("__text", symbol->section->sectname) == 0) else if (type_mask == N_SECT && ft_strequ("__text", section->sectname))
symbol->type = SYM_TEXT; return (SYM_TEXT);
else if (type_mask == N_SECT && ft_strcmp("__data", symbol->section->sectname) == 0) else if (type_mask == N_SECT && ft_strequ("__data", section->sectname))
symbol->type = SYM_DATA; return (SYM_DATA);
else if (type_mask == N_SECT && ft_strcmp("__bss", symbol->section->sectname) == 0) else if (type_mask == N_SECT && ft_strequ("__bss", section->sectname))
symbol->type = SYM_BSS; return (SYM_BSS);
else if (type_mask == N_INDR) else if (type_mask == N_INDR)
symbol->type = SYM_INDR; return (SYM_INDR);
else else
symbol->type = SYM_OTHER; return (SYM_OTHER);
}
int symbol_set(t_symbol *sym, t_machodata *data)
{
t_list *lst;
if (sym->nlist->n_sect)
{
lst = ft_lst_at(data->sects, sym->nlist->n_sect - 1);
sym->section = *(struct section_64**)(lst->content);
}
else
sym->section = NULL;
sym->type = symbol_gettype(
sym->nlist->n_type & N_TYPE,
sym->nlist,
sym->section);
return (0); return (0);
} }