2012-01-19 20 views
6

Próbuję skompilować plik binarny do pliku obiektu MACH_O, aby można go było połączyć w dylib. Dylib jest napisany w języku c/C++.Skompiluj plik binarny do łączenia OSX

Na linux stosowany jest następujące polecenie: ld -r -b binarny -o foo.o foo.bin

Próbowałem różnych opcji na OSX, ale bezskutecznie:

ld -r foo.bin -o foo.o 
gives: 
ld: warning: -arch not specified 
ld: warning: ignoring file foo.bin, file was built for unsupported file format which is not the architecture being linked (x86_64) 

Zostanie utworzony pusty plik .o

ld -arch x86_64 -r foo.bin -o foo.o 
ld: warning: ignoring file foo.bin, file was built for unsupported file format which is not the architecture being linked (x86_64) 

Ponownie zostanie utworzony pusty plik .o. Sprawdzanie plików za pomocą nm daje: nm foo.o nm: brak listy nazw

Plik binarny to w rzeczywistości oprogramowanie układowe, które zostanie pobrane na urządzenie zewnętrzne.

Dzięki za patrząc

+0

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? –

+0

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

+0

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ć. –

Odpowiedz

7

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); 
} 
+1

Wygląda na to, że są nieco nowsze wersje 'getsection *' funkcji 'getsect *', które mogą być używane i które nie są dotknięte problemami ASLR. Nieco ładniejsze niż czytanie surowego pliku binarnego. –

+0

http://gareus.org/wiki/embedding_resources_in_executables zauważa również, że nazwa sekcji przekazana do '-sectcreate' nie może być dłuższa niż ** 16 ** znaków ... – cfstras

Powiązane problemy