This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: libbfd problem
Hi,
I solved with this small snippet, thank you, anyway.
Best Regards,
Laszlo Papp
#include <stdio.h>
#include <string.h>
#include <ctype.h>
const char *AR_MAGIC = "!<arch>\n";
const char *CONTROL_FILE_DEBIAN = "control.tar.gz";
const char *DATA_FILE_DEBIAN = "data.tar.gz";
const char *DEBIAN_BINARY = "debian-binary";
#define MIN(a, b) ((a) < (b) ? (a) : (b))
struct ar_hdr
{
char name[16];
char mod[12];
char uid[6];
char gid[6];
char mode[8];
char size[10];
char magic[2];
};
int extract_file(FILE *ar, const char *name)
{
char buffer[1024];
struct ar_hdr file_hdr;
FILE *fpout = 0;
fseek(ar, 0, SEEK_SET);
fread(buffer, 1, strlen(AR_MAGIC), ar);
if (strncmp(buffer, AR_MAGIC, strlen(AR_MAGIC)))
return -1;
for (fread(&file_hdr, sizeof(file_hdr), 1, ar);
!feof(ar);
fread(&file_hdr, sizeof(file_hdr), 1, ar))
{
char *spc;
size_t fsize = 0;
int i;
for (i = 0; i < 10 && isdigit(file_hdr.size[i]); ++i)
fsize = fsize * 10 + file_hdr.size[i] - '0';
memcpy(buffer, file_hdr.name, sizeof(file_hdr.name));
buffer[sizeof(file_hdr.name)] = '\0';
// GNU ar
if ((spc = strchr(buffer, '/')))
*spc = '\0';
// Common ar
else if ((spc = strchr(buffer, ' ')))
*spc = '\0';
if (strcmp(buffer, name)) {
fseek(ar, fsize + (fsize&1), SEEK_CUR);
continue;
} else {
size_t byte_read = 0;
fpout = fopen(name, "w");
if (fpout) {
while (byte_read < fsize + (fsize&1)) {
if (feof(ar))
return -1;
size_t r = fread(buffer, 1, MIN(sizeof(buffer), fsize + (fsize&1)
- byte_read), ar);
fwrite(buffer, 1, MIN(r, fsize - byte_read), fpout);
byte_read += r;
}
}
fclose(fpout);
return 0;
}
}
return 0;
}
int main(int argc, char **argv)
{
int i;
FILE *ar;
const char *extracted_files[] = {DEBIAN_BINARY, CONTROL_FILE_DEBIAN,
DATA_FILE_DEBIAN, 0};
if (argc < 2)
return -1;
ar = fopen(argv[1], "rb");
for (i = 0; extracted_files[i]; ++i)
extract_file(ar, extracted_files[i]);
fclose(ar);
return 0;
}
On Mon, Oct 25, 2010 at 12:45 PM, Laszlo Papp <djszapi@archlinux.us> wrote:
> Hello,
>
> I have just attached my 'ar' like program. The purpose is that to
> extract a debian package, but it seems to not work on my armv7. It
> works perfectly on i686, x86_64 host linux distributions.
> When I try to run it on armv7, I get empty or unreasonable files... I
> use libbfd library for this task, please help me :)
>
> Best Regards,
> Laszlo Papp
>