stuff
This commit is contained in:
parent
b1ba5b3f44
commit
b8eadccc85
14 changed files with 76 additions and 79 deletions
|
|
@ -35,10 +35,9 @@ OTOOL_OBJ = $(OBJ_DIR)ft_otool.o
|
|||
|
||||
SRC_BASE = \
|
||||
dump_symtab.c\
|
||||
fetch_header.c\
|
||||
ft_nm.c\
|
||||
ft_otool.c\
|
||||
mach_o_parse.c\
|
||||
mach_64.c\
|
||||
symbol_filter.c\
|
||||
symbol_format.c\
|
||||
symbol_free.c\
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/02/20 14:36:10 by jhalford #+# #+# */
|
||||
/* Updated: 2017/10/08 16:37:58 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/10/23 16:49:52 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -25,7 +25,8 @@
|
|||
# include <mach-o/nlist.h>
|
||||
# include <mach-o/fat.h>
|
||||
|
||||
# define IS_MAGIC_64(x) (x == MH_MAGIC_64 || x == MH_CIGAM_64)
|
||||
# define IS_MACH_64(x) (x == MH_MAGIC_64 || x == MH_CIGAM_64)
|
||||
# define IS_MACH_32(x) (x == MH_MAGIC || x == MH_CIGAM)
|
||||
# define IS_FAT(x) (x == FAT_MAGIC || x == FAT_CIGAM)
|
||||
|
||||
/*
|
||||
|
|
@ -44,8 +45,8 @@
|
|||
** filtering flags
|
||||
** -a show all symbols
|
||||
** -g filter-out local symbols
|
||||
** -u show only undefined symbols
|
||||
** -U filter-out undefined symbols
|
||||
** -u show only undefined symbols
|
||||
*/
|
||||
|
||||
# define NM_ALL (1 << 4)
|
||||
|
|
@ -120,23 +121,26 @@ struct s_symbolmap
|
|||
extern t_symbolmap g_symbolmap[];
|
||||
extern t_machodata *g_data;
|
||||
|
||||
int mach_o_parse(t_machodata *data);
|
||||
int fetch_header(t_machodata *data);
|
||||
|
||||
int symbol_init(t_symbol *symbol,
|
||||
char *stringtable, struct nlist_64 *array, int i);
|
||||
int symbol_set(t_symbol *symbol, t_machodata *data);
|
||||
int symbol_sort(t_list **syms, t_flag flag);
|
||||
int symbol_filter(t_list **syms, t_flag flag);
|
||||
void symbol_free(void *data, size_t size);
|
||||
|
||||
int symbol_sort(t_list **syms, t_flag flag);
|
||||
|
||||
int symbol_filter(t_list **syms, t_flag flag);
|
||||
int is_external(t_symbol *s);
|
||||
int is_not_external(t_symbol *s);
|
||||
|
||||
int symbol_format(t_symbol *symbol, t_nmdata *data);
|
||||
void symbol_format_dfl(t_symbol *symbol);
|
||||
void symbol_format_m(t_symbol *symbol);
|
||||
void symbol_format_full(t_symbol *symbol);
|
||||
|
||||
void mach_64_dump(struct mach_header_64 *file,
|
||||
t_nmdata *data);
|
||||
void mach_64_parse(t_machodata *data);
|
||||
void dump_dysymtab(t_machodata *data,
|
||||
struct dysymtab_command *dysymtab);
|
||||
struct dysymtab_command *dysymtab);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/03/25 01:56:58 by jhalford #+# #+# */
|
||||
/* Updated: 2017/03/25 02:02:06 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/10/23 15:58:26 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2016/11/04 11:09:17 by jhalford #+# #+# */
|
||||
/* Updated: 2017/05/16 17:34:15 by ariard ### ########.fr */
|
||||
/* Updated: 2017/10/23 16:28:53 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/03/26 16:56:02 by jhalford #+# #+# */
|
||||
/* Updated: 2017/03/26 19:10:03 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/10/23 16:29:21 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/03/25 19:39:15 by jhalford #+# #+# */
|
||||
/* Updated: 2017/10/07 18:26:32 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/10/23 16:49:46 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/02/19 03:09:12 by jhalford #+# #+# */
|
||||
/* Updated: 2017/10/08 11:33:44 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/10/23 16:33:42 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -21,12 +21,12 @@ t_cliopts g_nm_opts[] =
|
|||
{'p', NULL, NM_NOSORT, 0, NULL, 0},
|
||||
{'r', NULL, NM_RSORT, 0, NULL, 0},
|
||||
|
||||
{0xff, "full", NM_FULL, 0, NULL, 0},
|
||||
{'a', NULL, NM_ALL, 0, NULL, 0},
|
||||
{'g', NULL, NM_NO_LOCAL, 0, NULL, 0},
|
||||
{'u', NULL, NM_ONLY_UNDF, 0, NULL, 0},
|
||||
{'U', NULL, NM_NO_UNDF, 0, NULL, 0},
|
||||
|
||||
{0xff, "full", NM_FULL, 0, NULL, 0},
|
||||
{'o', NULL, NM_OFORMAT, 0, NULL, 0},
|
||||
{'m', NULL, NM_MFORMAT, 0, NULL, 0},
|
||||
|
||||
|
|
@ -35,25 +35,14 @@ t_cliopts g_nm_opts[] =
|
|||
{'j', NULL, 0, 0, NULL, 0},
|
||||
};
|
||||
|
||||
void mach_64_dump(struct mach_header_64 *file, t_nmdata *data)
|
||||
{
|
||||
t_machodata mach;
|
||||
|
||||
mach.sects = NULL;
|
||||
mach.symbols = NULL;
|
||||
mach.file = file;
|
||||
mach_64_parse(&mach);
|
||||
symbol_sort(&mach.symbols, data->flag);
|
||||
symbol_filter(&mach.symbols, data->flag);
|
||||
ft_lstiter(mach.symbols, symbol_format, data);
|
||||
}
|
||||
|
||||
int nm_file(void *file, t_nmdata *data)
|
||||
{
|
||||
uint32_t magic;
|
||||
|
||||
magic = *(int*)file;
|
||||
if (IS_MAGIC_64(magic))
|
||||
if (IS_MACH_64(magic))
|
||||
mach_64_dump(file, data);
|
||||
else if (IS_MACH_32(magic))
|
||||
mach_64_dump(file, data);
|
||||
else if (IS_FAT(magic))
|
||||
ft_printf("{red}unsupported arch:{eoc} magic=%#x(FAT)\n", magic);
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/02/20 14:08:14 by jhalford #+# #+# */
|
||||
/* Updated: 2017/10/07 18:35:37 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/10/23 16:37:45 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -49,7 +49,7 @@ void otool(void *file)
|
|||
magic = *(int *)file;
|
||||
if (IS_FAT(magic))
|
||||
ft_printf("fat binary not supported yet\n");
|
||||
else if (IS_MAGIC_64(magic))
|
||||
else if (IS_MACH_64(magic))
|
||||
{
|
||||
sect = get_text_section(file);
|
||||
ft_printf("Contents of (__TEXT,__text) section\n");
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* fetch_header.c :+: :+: :+: */
|
||||
/* mach_64.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/03/23 15:56:37 by jhalford #+# #+# */
|
||||
/* Updated: 2017/10/07 18:31:01 by jhalford ### ########.fr */
|
||||
/* Created: 2017/10/23 16:06:44 by jhalford #+# #+# */
|
||||
/* Updated: 2017/10/23 16:42:06 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -69,3 +69,16 @@ void mach_64_parse(t_machodata *data)
|
|||
lc = (void*)lc + lc->cmdsize;
|
||||
}
|
||||
}
|
||||
|
||||
void mach_64_dump(struct mach_header_64 *file, t_nmdata *data)
|
||||
{
|
||||
t_machodata mach;
|
||||
|
||||
mach.sects = NULL;
|
||||
mach.symbols = NULL;
|
||||
mach.file = file;
|
||||
mach_64_parse(&mach);
|
||||
symbol_sort(&mach.symbols, data->flag);
|
||||
symbol_filter(&mach.symbols, data->flag);
|
||||
ft_lstiter(mach.symbols, symbol_format, data);
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* mach_o_parse.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/03/25 20:56:50 by jhalford #+# #+# */
|
||||
/* Updated: 2017/03/25 22:09:56 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "ft_nm_otool.h"
|
||||
|
||||
int mach_o_parse(t_machodata *data)
|
||||
{
|
||||
(void)data;
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -6,38 +6,40 @@
|
|||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/03/28 20:34:36 by jhalford #+# #+# */
|
||||
/* Updated: 2017/03/28 20:35:11 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/10/23 16:45:54 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "ft_nm_otool.h"
|
||||
|
||||
int cmp_symtype(t_symbol *sym, void *type)
|
||||
int cmp_symtype(t_symbol *sym, void *type)
|
||||
{
|
||||
return (sym->type - *(t_type*)type);
|
||||
return ((1 << sym->type) & *(uint64_t*)type);
|
||||
}
|
||||
|
||||
int cmp_no_symtype(t_symbol *sym, void *type)
|
||||
inline int is_not_external(t_symbol *s)
|
||||
{
|
||||
return (!(sym->type - *(t_type*)type));
|
||||
return (!(s->nlist->n_type & N_EXT));
|
||||
}
|
||||
|
||||
int mask_nlisttype(t_symbol *sym, void *type)
|
||||
inline int is_external(t_symbol *s)
|
||||
{
|
||||
return (sym->nlist->n_type & *(t_type*)type);
|
||||
return (s->nlist->n_type & N_EXT);
|
||||
}
|
||||
|
||||
int symbol_filter(t_list **symbols, t_flag flag)
|
||||
int symbol_filter(t_list **symbols, t_flag flag)
|
||||
{
|
||||
t_type symtype;
|
||||
uint64_t allowed_syms;
|
||||
|
||||
if (!(flag & NM_ALL) && (symtype = SYM_STAB))
|
||||
ft_lst_filterout(symbols, &symtype, cmp_symtype, symbol_free);
|
||||
if ((flag & NM_NO_UNDF) && !(symtype = SYM_UNDF))
|
||||
ft_lst_filterout(symbols, &symtype, cmp_symtype, symbol_free);
|
||||
if ((flag & NM_ONLY_UNDF) && !(symtype = SYM_UNDF))
|
||||
ft_lst_filterout(symbols, &symtype, cmp_no_symtype, symbol_free);
|
||||
if ((flag & NM_NO_LOCAL) && (symtype = N_EXT))
|
||||
ft_lst_filterout(symbols, &symtype, mask_nlisttype, symbol_free);
|
||||
allowed_syms = ~(1 << SYM_STAB);
|
||||
if (flag & NM_ALL)
|
||||
allowed_syms |= (1 << SYM_STAB);
|
||||
if (flag & NM_NO_UNDF)
|
||||
allowed_syms &= ~(1 << SYM_UNDF);
|
||||
if (flag & NM_ONLY_UNDF)
|
||||
allowed_syms &= (1 << SYM_UNDF);
|
||||
ft_lst_filterout(symbols, &allowed_syms, cmp_symtype, symbol_free);
|
||||
if (flag & NM_NO_LOCAL)
|
||||
ft_lst_filterout(symbols, NULL, is_external, symbol_free);
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/03/28 20:34:32 by jhalford #+# #+# */
|
||||
/* Updated: 2017/10/08 11:34:43 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/10/23 16:31:36 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -29,7 +29,7 @@ void symbol_format_desc(t_symbol *symbol)
|
|||
{
|
||||
if (symbol->nlist->n_desc & REFERENCED_DYNAMICALLY)
|
||||
ft_printf(" [referenced dynamically]");
|
||||
if (symbol->nlist->n_type & N_EXT)
|
||||
if (is_external(symbol))
|
||||
ft_printf(" external");
|
||||
else
|
||||
{
|
||||
|
|
@ -66,11 +66,12 @@ void symbol_format_full(t_symbol *symbol)
|
|||
void symbol_format_dfl(t_symbol *symbol)
|
||||
{
|
||||
t_symbolmap map;
|
||||
char c;
|
||||
|
||||
map = g_symbolmap[symbol->type];
|
||||
c = symbol->nlist->n_type & N_EXT ? map.c : map.c + 32;
|
||||
ft_printf(" %c", c);
|
||||
if (is_external(symbol))
|
||||
ft_printf(" %c", map.c);
|
||||
else
|
||||
ft_printf(" %c", map.c + 'a' - 'A');
|
||||
if (symbol->type == SYM_STAB)
|
||||
ft_printf(" %02x %04b %#x",
|
||||
symbol->nlist->n_sect, symbol->nlist->n_desc,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/03/25 21:22:06 by jhalford #+# #+# */
|
||||
/* Updated: 2017/10/08 11:02:50 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/10/23 16:41:15 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -24,6 +24,10 @@ int symbol_init(t_symbol *symbol,
|
|||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
** Calculate the sym->type field
|
||||
*/
|
||||
|
||||
static int symbol_gettype(int type_mask,
|
||||
struct nlist_64 *nlist, struct section_64 *section)
|
||||
{
|
||||
|
|
@ -47,6 +51,10 @@ static int symbol_gettype(int type_mask,
|
|||
return (SYM_OTHER);
|
||||
}
|
||||
|
||||
/*
|
||||
** Construct symbol data
|
||||
*/
|
||||
|
||||
int symbol_set(t_symbol *sym, t_machodata *data)
|
||||
{
|
||||
t_list *lst;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2017/03/27 20:33:02 by jhalford #+# #+# */
|
||||
/* Updated: 2017/10/07 18:29:45 by jhalford ### ########.fr */
|
||||
/* Updated: 2017/10/23 16:38:29 by jhalford ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue