format: import a Mach-O plug-in
This commit is contained in:
parent
4d0ea35ff2
commit
ac1ed5b7f6
136
src/format/mach-o.c
Normal file
136
src/format/mach-o.c
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
/* $Id$ */
|
||||||
|
/* Copyright (c) 2025 Pierre Pronchery <khorben@defora.org> */
|
||||||
|
/* This file is part of DeforaOS Devel Asm */
|
||||||
|
/* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, version 3 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <System.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "Asm.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Mach-O */
|
||||||
|
/* private */
|
||||||
|
/* types */
|
||||||
|
struct _AsmFormatPlugin
|
||||||
|
{
|
||||||
|
AsmFormatPluginHelper * helper;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* prototypes */
|
||||||
|
/* plug-in */
|
||||||
|
static AsmFormatPlugin * _macho_init(AsmFormatPluginHelper * helper,
|
||||||
|
char const * arch);
|
||||||
|
static int _macho_destroy(AsmFormatPlugin * format);
|
||||||
|
static char const * _macho_guess(AsmFormatPlugin * format, char const * hint);
|
||||||
|
static int _macho_section(AsmFormatPlugin * format, char const * section);
|
||||||
|
static int _macho_decode(AsmFormatPlugin * format, int raw);
|
||||||
|
static int _macho_decode_section(AsmFormatPlugin * format, AsmSection * section,
|
||||||
|
AsmArchInstructionCall ** calls, size_t * calls_cnt);
|
||||||
|
|
||||||
|
|
||||||
|
/* public */
|
||||||
|
/* variables */
|
||||||
|
/* plug-in */
|
||||||
|
AsmFormatPluginDefinition format_plugin =
|
||||||
|
{
|
||||||
|
"mach-o",
|
||||||
|
"Mach-O file",
|
||||||
|
LICENSE_GNU_LGPL3_FLAGS,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
_macho_init,
|
||||||
|
_macho_destroy,
|
||||||
|
_macho_guess,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
_macho_section,
|
||||||
|
NULL,
|
||||||
|
_macho_decode,
|
||||||
|
_macho_decode_section
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* private */
|
||||||
|
/* functions */
|
||||||
|
/* plug-in */
|
||||||
|
/* macho_init */
|
||||||
|
static AsmFormatPlugin * _macho_init(AsmFormatPluginHelper * helper,
|
||||||
|
char const * arch)
|
||||||
|
{
|
||||||
|
AsmFormatPlugin * macho;
|
||||||
|
(void) arch;
|
||||||
|
|
||||||
|
if((macho = object_new(sizeof(*macho))) == NULL)
|
||||||
|
return NULL;
|
||||||
|
macho->helper = helper;
|
||||||
|
return macho;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* macho_destroy */
|
||||||
|
static int _macho_destroy(AsmFormatPlugin * format)
|
||||||
|
{
|
||||||
|
object_delete(format);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* macho_guess */
|
||||||
|
static char const * _macho_guess(AsmFormatPlugin * format, char const * hint)
|
||||||
|
{
|
||||||
|
(void) format;
|
||||||
|
|
||||||
|
return hint;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* macho_section */
|
||||||
|
static int _macho_section(AsmFormatPlugin * format, char const * section)
|
||||||
|
{
|
||||||
|
(void) format;
|
||||||
|
(void) section;
|
||||||
|
|
||||||
|
/* ignore sections */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* macho_decode */
|
||||||
|
static int _macho_decode(AsmFormatPlugin * format, int raw)
|
||||||
|
{
|
||||||
|
AsmFormatPluginHelper * helper = format->helper;
|
||||||
|
off_t offset;
|
||||||
|
(void) raw;
|
||||||
|
|
||||||
|
if((offset = helper->seek(helper->format, 0, SEEK_END)) >= 0
|
||||||
|
&& helper->set_section(helper->format, 0, 0, ".text", 0,
|
||||||
|
offset, 0) != NULL)
|
||||||
|
return 0;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* macho_decode_section */
|
||||||
|
static int _macho_decode_section(AsmFormatPlugin * format, AsmSection * section,
|
||||||
|
AsmArchInstructionCall ** calls, size_t * calls_cnt)
|
||||||
|
{
|
||||||
|
AsmFormatPluginHelper * helper = format->helper;
|
||||||
|
|
||||||
|
if(section->id != 0)
|
||||||
|
return -1;
|
||||||
|
return helper->decode(helper->format, section->offset, section->size,
|
||||||
|
section->base, calls, calls_cnt);
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
targets=dex,elf,flat,java,mbr,pe,template
|
targets=dex,elf,flat,java,mach-o,mbr,pe,template
|
||||||
cppflags_force=-I../../include
|
cppflags_force=-I../../include
|
||||||
cflags_force=`pkg-config --cflags libSystem` -fPIC
|
cflags_force=`pkg-config --cflags libSystem` -fPIC
|
||||||
cflags=-W -Wall -g -O2 -D_FORTIFY_SOURCE=2 -fstack-protector
|
cflags=-W -Wall -g -O2 -D_FORTIFY_SOURCE=2 -fstack-protector
|
||||||
|
@ -33,6 +33,10 @@ type=plugin
|
||||||
sources=java.c
|
sources=java.c
|
||||||
install=$(LIBDIR)/Asm/format
|
install=$(LIBDIR)/Asm/format
|
||||||
|
|
||||||
|
[mach-o]
|
||||||
|
type=plugin
|
||||||
|
sources=mach-o.c
|
||||||
|
|
||||||
[mbr]
|
[mbr]
|
||||||
type=plugin
|
type=plugin
|
||||||
sources=mbr.c
|
sources=mbr.c
|
||||||
|
|
Loading…
Reference in New Issue
Block a user