Hey,
The following code creates a raw binary (no ELF or PE.. just raw):
gcc -nostartfiles -c -o hello.o hello.c
ld -o hello1 hello.o --oformat binary
You can try the following code out with it:
void _start()
{
while(1);
}
The resulting raw binary is 5 bytes.
Now how do you do this in clang/llvm?
Apparently llvm-ld doesn't have a "--oformat binary" option.
Anybody know how to do this with llvm?
Hey,
The following code creates a raw binary (no ELF or PE.. just raw):
gcc -nostartfiles -c -o hello.o hello.c
ld -o hello1 hello.o --oformat binary
You can try the following code out with it:
void _start()
{
while(1);
}
The resulting raw binary is 5 bytes.
It is 2.1M here (on x86_64), and 4.3k with -m32 when using gcc 4.4.2.
Apparently it includes the dynamic linker inside it.
Now how do you do this in clang/llvm?
Apparently llvm-ld doesn't have a "--oformat binary" option.
Anybody know how to do this with llvm?
Simple, use ld on the .o files, as you would with gcc.
An example with clang:
$ clang -nostartfiles -c x.c -o x.o
$ ld -o x x.o --oformat binary
Or to get a 32-bit one:
$ /llvm-git/obj/Release/bin/clang -nostartfiles -c x.c -o x.o -m32
$ ld -o x1 x.o --oformat binary -melf_i386
This one is indeed 5 bytes long.
Best regards,
--Edwin
Indeed ld does link it. The reason I am using llvm-ld, is for its unique
functionality.
I intend to link to object files together (created by cling), and link them
with llvm-ld.
The main feature that I am currently interested in is the ability to have
"inline functions" between two object files. This was basically impossible
with gcc.
Is there any way to make the raw binary with llvm?
Thank you,
Ven
Török Edwin wrote:
Take the .bc file produced by llvm-ld, compile it to assembly with
llc, then use the same procedure you were originally using.
-Eli
$ clang -ffunction-sections -fdata-sections -Os -nostartfiles -c -o hello.o
hello.c
$ clang -ffunction-sections -fdata-sections -Os -nostartfiles -c -o test.o
test.c
$ llvm-ld -s -o hello2 hello.o
$ llc hello2.bc -o hello3
$ ld -o hello_B hello3 --oformat binary
ld:hello3: file format not recognized; treating as linker script
ld:hello3:1: syntax error
I am guessing that is what you meant by the "then use the same procedure you
were originally using." right?
Sorry for the hasle. Thank you for your help,
Ven
Eli Friedman-2 wrote:
Umm, yes, except you need to add a step to assemble the output of llc
(something like "gcc -x assembler hello3 -c -o hello4").
-Eli
LiteHacker wrote:
Indeed ld does link it. The reason I am using llvm-ld, is for its unique
functionality.
I intend to link to object files together (created by cling), and link them
with llvm-ld.
The main feature that I am currently interested in is the ability to have
"inline functions" between two object files. This was basically impossible
with gcc.
Is there any way to make the raw binary with llvm?
Use llvm-ld -link-as-library to perform many .bc files -> single .bc file with link-time optimization applied.
The use llc to turn a single .bc files to a .s (assembly) file which gcc can in turn handle.
Nick