I have no direct experience with the ZyBo, however it happened to me to be in a similar situation various times and I learned how to gather information from the Internet (even, before the Internet) and fill the gaps with a bit of reverse engineering followed by trial and error.
I've collected what I believe are useful information but I never had a ZyBo, so take this with a grain of salt.
Also, take time to read the linked document if you don't understand some terminology.
It seems that you can avoid part of the Vivado SDK and the IDE, the Zynq 7000 Software Developer guide in Appendix A describes the use of bootgen
and BIF
files to generate a boot image.
In Zybo terminology, the boot image contains the BootROM header and the First Stage Bootloader (the stage 1 phase of the bootstrap process, it also contains user code).
Note that The BootROM itself is not writable, so you cannot alter the stage 0 unless you find a way to hack it (it is not a great idea though, the stage 0 do a minimal amount of work and make the board usable).
An example taken from that manual
// A simple BIF file example.
the_ROM_image:
{
[init]init_data.int
[bootloader]myDesign.elf
Partition1.bit
Partition1.rbt
Partition2.elf
}
And the manual explicitly says that ELF is a supported file format (at least I hope it is that ELF).
So you could use GCC to generate an ARM ELF and than bootgen
to make a boot image (of course no C Runtime).
Binary files are supported too, so any ARM assembler will do.
This should avoid any SDK initialization code, leaving only the stage 0 being executed before your code.
The Zynq 7000 Technical Reference Manual describes the BootROM header format in detail.
It also explain the various hardware components and the architectural decisions made, including the boot process and the various bare metal options.
So you can even get rid of bootgen
and make your own tool.
The BootROM header seems to have a field for defining the Interrupt Table when in XIP mode, however, as said, it is the BootROM the first code executed so you don't start from the ARM reset vector.
I'm not familiar with the SDK but I'm sure that if you snoop around the SDK bin folder you'll find a lot of the usual GNU tools for the ARM toolchain (pretty much like it happens for the Android NDK).
XILINX states, in one of its document (alas I don't remember which one) that they used the standard GNU tools with slight augmentations.
As for avoiding XILINX libraries you can try reading their source if available or disassembling their binaries.
With the help of the Technical reference manual you should be able to avoid them in the first place.
XILINX does a great job describing its board on the two documents linked (a shorter one is here), reading both will explain a lot of things going on under the hood.
Usually vendors reuse existing tools so, unless XILINX developed their own, you should find the command line tools used by the IDE familiar.
And you may even start liking the Vivado SDK after knowing how it works in depth!