1 |
27 |
unneback |
|
2 |
|
|
These notes were written to record the current state of this code.
|
3 |
|
|
Much of it was written during the investigation work.
|
4 |
|
|
|
5 |
|
|
At present this stuff is only partially functional. Do not assume
|
6 |
|
|
anything works. In particular things like constructor/destructors and
|
7 |
|
|
init/fini sections have not been fully implemented.
|
8 |
|
|
|
9 |
|
|
|
10 |
|
|
Initial Investigations
|
11 |
|
|
======================
|
12 |
|
|
|
13 |
|
|
Attempts to build a simple shared library using the existing
|
14 |
|
|
tools. Command line is something like:
|
15 |
|
|
|
16 |
|
|
xxx-gcc -shared -o libfoo.so foo.so
|
17 |
|
|
|
18 |
|
|
|
19 |
|
|
arm-elf no - includes crt0 which fails to find main() etc.
|
20 |
|
|
thumb-elf no - includes crt0 which fails to find main() etc.
|
21 |
|
|
i686-pc-linux-gnu yes
|
22 |
|
|
i386-elf no - tries to build program
|
23 |
|
|
mn10300 no - tries to build program
|
24 |
|
|
powerpc-eabi no - implicit ref to libc.so
|
25 |
|
|
sh-elf no - tries to build program
|
26 |
|
|
sparclite no - fails to find crtn.o
|
27 |
|
|
mips-tx39-elf yes - but seriously mangles PHDR DYNAMIC section
|
28 |
|
|
mips66vr4300-elf yes - but seriously mangles PHDR DYNAMIC section
|
29 |
|
|
|
30 |
|
|
|
31 |
|
|
Building new Toolchains
|
32 |
|
|
=======================
|
33 |
|
|
|
34 |
|
|
Given the poor results from our standard toolchains, it was decided to
|
35 |
|
|
try and use Linux-targeted toolchains, which are guranteed to have the
|
36 |
|
|
necessary support.
|
37 |
|
|
|
38 |
|
|
These builds all use bindutils-2.1.1, gcc-2.95.2 and gdb-5.0.
|
39 |
|
|
|
40 |
|
|
arm-unknown-linux-gnu build of libgcc fails looking for asm/unistd.h
|
41 |
|
|
|
42 |
|
|
All MIPS Linux toolchains use collect2 constructors, so no priorities.
|
43 |
|
|
MIPS support also requires PIC code support, which needs HAL
|
44 |
|
|
changes. In this case it is fairly easy since the assembler does a lot
|
45 |
|
|
of the conversion for us but there are still some things that need
|
46 |
|
|
fixing.
|
47 |
|
|
|
48 |
|
|
MIPS BSD toolchains fail building libgcc, but adding files from
|
49 |
|
|
openbsd sources allows these to build. However, these then fail to
|
50 |
|
|
build proper PIC code and omit some features.
|
51 |
|
|
|
52 |
|
|
PowerPC toolchains need to use the full ABI, not the ebedded one, with
|
53 |
|
|
TOCs and all the trimmings. This requires major changes to the
|
54 |
|
|
HAL. Or maybe not - not too sure about this one.
|
55 |
|
|
|
56 |
|
|
Since we are having so much difficulty getting any of these to work,
|
57 |
|
|
try to get it running on the i686-pc-linux-gnu synthetic target, since
|
58 |
|
|
we know that works.
|
59 |
|
|
|
60 |
|
|
|
61 |
|
|
Synthetic Target
|
62 |
|
|
================
|
63 |
|
|
|
64 |
|
|
To enable a progam to be capable of loading a shared library it must
|
65 |
|
|
include a DYNAMIC section. This includes the symbol, string and hash
|
66 |
|
|
tables needed to satisfy any references from the loaded library back
|
67 |
|
|
to the executable. The only way I have so far worked out to make this
|
68 |
|
|
happen is to link the executable against a dynamic library. This needs
|
69 |
|
|
the -Wl,-static flag to be removed.
|
70 |
|
|
|
71 |
|
|
A simple library, libdlforce.so has been created to make this
|
72 |
|
|
happen. It is not even necessary for the progam to call into the
|
73 |
|
|
library, just having it on the command line is enough.
|
74 |
|
|
|
75 |
|
|
|
76 |
|
|
Generation of usable libraries and executables is very sensitive to
|
77 |
|
|
the exact form of the linker scripts used.
|
78 |
|
|
|
79 |
|
|
src/dynamic.ld has been replaced by a very lightly edited copy of
|
80 |
|
|
i686-pc-linux-gnu/H-i686-pc-linux-gnu/i686-pc-linux-gnu/lib/ldscripts/elf_i386.xs
|
81 |
|
|
|
82 |
|
|
To make the main executable work correctly the i386.dynamic.ld script
|
83 |
|
|
in this directory must be copied over target.ld before building any
|
84 |
|
|
programs. I have not yet worked out what the problems are, but the
|
85 |
|
|
original target.ld causes programs built for dynamic loading to
|
86 |
|
|
SIGSEGV in ld.so.
|
87 |
|
|
|
88 |
|
|
If we try to use the POSIX package, we get spurious calls to
|
89 |
|
|
pthread_mutex_unlock() from somewhere in the Linux runtime. This may
|
90 |
|
|
be a result of using a different linker script, however.
|
91 |
|
|
|
92 |
|
|
|
93 |
|
|
Retesting toolchains
|
94 |
|
|
====================
|
95 |
|
|
|
96 |
|
|
Having got the synthetic target sort-of working, now go back and see
|
97 |
|
|
what happens when configuring each of our standard toolchains for the
|
98 |
|
|
loader.
|
99 |
|
|
|
100 |
|
|
arm-elf - build of shared library with external references
|
101 |
|
|
result in "undefined reference to `fee'".
|
102 |
|
|
|
103 |
|
|
mips-tx39-elf - mangles DYNAMIC section as before.
|
104 |
|
|
|
105 |
|
|
powerpc-eabi - Compiler selects a libgcc.a that contains references
|
106 |
|
|
to "abort" and "strcmp". With these defined we get
|
107 |
|
|
sensible looking libraries.
|