Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Если у Вас много маленьких файлов, то исходник с ресурсами будет содержать кучи текста, который будет значительно замедлять компиляцию
Если там используется полное имя файла, может имеет смысл завести ишью в gcc и попросить их сделать возможность либо использовать относительные имена, либо явно указывать идентификатор для ресурса? То, что вы там кривыми скриптами правите символы — это ненормально.
И еще, а нельзя ли сделать секцию в ELF с кастомным именем и засунуть ресурс в нее?
function gen(data,name,h,c)
local size,buf_size,buf,w,i,a,la,line
size=data:seek("end") data:seek("set",0)
h:write("enum { "..name.."_size="..size.." };\n")
h:write("extern const unsigned char "..name.."["..name.."_size];\n")
c:write("const unsigned char "..name.."[]={\n")
a=0 w=16 buf_size=32 buf={}
while buf do
la=1
while la<=#buf do
line="\t"
for i=1,w do
if la>#buf then break end
line=line..string.format("%3d",buf:byte(la))
a=a+1 la=la+1
if a<size then line=line.."," end
end
c:write(line.."\n")
end
buf=data:read(buf_size)
end
c:write"};\n"
end
function gen_list(list,hdr,src)
local h,c,d
hdr=hdr or "res.h"
src=src or "res.c"
h=io.open(hdr,"w+") or error "unable to create header"
c=io.open(src,"w+") or error "unable to create source"
h:write("// "..hdr.." : autogenerated file\n")
h:write"#pragma once\n"
for line in io.lines(list) do
local name,fn=line:match"%s*(%S+)%s+(.+)%s*"
if fn then
d=io.open(fn,"rb") or error("unable to open "..fn)
gen(d,name,h,c)
d:close()
end
end
c:close()
h:close()
end
gen_list "list.txt"
res1 file1.dat res2 file2.dat res3 file3.dat
Вы немножко усложнили себе жизнь на ровном месте. Если давать ld относительные адреса и правильно устанавливать cwd, то получаются действительно нормальные символы:
~
➜ ld -r -b binary -o blob.o some/dir/to/blob.png
~
➜ objdump -t blob.o
blob.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 g .data 0000000000000000 _binary_some_dir_to_blob_png_end
0000000000000000 g .data 0000000000000000 _binary_some_dir_to_blob_png_start
0000000000000000 g *ABS* 0000000000000000 _binary_some_dir_to_blob_png_size~
➜ ld -r -b binary -o blob.o $(realpath some/dir/to/blob.png)
~
➜ objdump -t blob.o
blob.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 g *ABS* 0000000000000000 _binary__home_prok_some_dir_to_blob_png_size
0000000000000000 g .data 0000000000000000 _binary__home_prok_some_dir_to_blob_png_end
0000000000000000 g .data 0000000000000000 _binary__home_prok_some_dir_to_blob_png_startНе совсем в тему, просто забавный факт: GIMP умеет экспортировать картинки в сишный исходник:
/* GIMP RGB C-Source image dump (test.c) */
static const struct {
guint width;
guint height;
guint bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */
guint8 pixel_data[100 * 100 * 3 + 1];
} gimp_image = {
100, 100, 3,
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
...
C/C++. Как использовать внедряемые ресурсы приложения, при работе в GCC на Linux