tu jest najbliżej tłumaczenie do polecenia łącznikowej Linux wykonać osadzanie binarnego z łącznikiem OSX:
touch stub.c
gcc -o stub.o -c stub.c
ld -r -o foo.o -sectcreate binary foo_bin foo.bin stub.o
foo.bin
będą przechowywane w segmencie binary
sekcja foo_bin
(obie nazwy są dowolna, ale wybrana do naśladowania GNU ld dla ELF na Linuksie) obiektu foo.o
.
stub
jest konieczne, ponieważ ld
odmawia utworzenia tylko niestandardowego segmentu/sekcji. Nie potrzebujesz tego, jeśli jesteś link directly with a real code object.
Aby uzyskać dane z powrotem z sekcji, użyj getsectbyname (struktura jest zdefiniowana w mach-o/loader.h
):
#include <mach-o/getsect.h>
const struct section_64 *sect = getsectbyname("binary", "foo_bin");
char *buffer = calloc(1, sect->size+1);
memcpy(buffer, sect->addr, sect->size); // whatever
lub getsectdata:
#include <mach-o/getsect.h>
size_t size;
char *data = getsectdata("binary", "foo_bin", &size);
char *buffer = calloc(1, size+1);
memcpy(buffer, data, size); // whatever
(użyłem go do przechowywania danych tekstowych, stąd stringification przez calloc
zerowanie rozmiaru + 1 plus kopiowanie bloba)
Ostrzeżenie: Od 10,7, ASLR staje się silniejszy i bardzo źle funkcjonuje z funkcjami getsect*
, czego skutkiem są błędy w segfaultach. set disable-aslr off
w GDB przed run
ning do odtworzenia EXC_BAD_ACCESS (SIGSEGV) w warunkach debugowania. Ludzie musieli jump through inordinate hoops, aby znaleźć prawdziwy adres i sprawić, by to znowu działało.
A simple workaround to uzyskać przesunięcie i rozmiar, otworzyć plik binarny i odczytać dane bezpośrednio z dysku. Oto działający przykład:
// main.c, build with gcc -o main main.c foo.o
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <mach-o/getsect.h>
int main() {
// finding the filename of the running binary is left as an exercise to the reader
char *filename = "main";
const struct section_64 *sect = getsectbyname("binary", "foo_bin");
if (sect == NULL) {
exit(1);
}
char *buffer = calloc(1, sect->size+1);
int fd = open(filename, O_RDONLY);
if (fd < 0) {
exit(1);
}
lseek(fd, sect->offset, SEEK_SET);
if (read(fd, buffer, sect->size) != sect->size) {
close(fd);
exit(1);
}
printf("%s", buffer);
}
powinieneś po prostu zrobić coś takiego jak 'ld -dylib -o libFoo.dylib fooSource * .o'. problem wydaje się być z foo.bin - jeśli robisz "file foo.bin", co to mówi? –
Dane wyjściowe pliku foo.bin to: 'foo.bit: dane BIT Xilinx - od foo.ncd; HW_TIMEOUT = FALSE; Us - dla 0xFFFFFFFF - zbudowany slx16ftg256 (011/03/15) - długość danych 0x31373a35' – Satpal
hmm , obawiam się, że nie wygląda na to, że LLVM clang ld robi osadzanie binarnych bloków, które robi gnu ld.możesz spróbować zainstalować gcc z Macports (http://www.macports.org/)? nie jestem pewien, czy to by pomogło, ale warto spróbować. –