Skip to content

Commit 2440387

Browse files
ephox-gcc-pluginsMichal Marek
authored andcommitted
Shared library support
Infrastructure for building independent shared library targets. Based on work created by the PaX Team. Signed-off-by: Emese Revfy <[email protected]> Acked-by: Kees Cook <[email protected]> Signed-off-by: Michal Marek <[email protected]>
1 parent 1a695a9 commit 2440387

File tree

3 files changed

+58
-3
lines changed

3 files changed

+58
-3
lines changed

scripts/Makefile.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ endif
6060
endif
6161

6262
# Do not include host rules unless needed
63-
ifneq ($(hostprogs-y)$(hostprogs-m),)
63+
ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m)$(hostcxxlibs-y)$(hostcxxlibs-m),)
6464
include scripts/Makefile.host
6565
endif
6666

scripts/Makefile.clean

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn))
3838
__clean-files := $(extra-y) $(extra-m) $(extra-) \
3939
$(always) $(targets) $(clean-files) \
4040
$(host-progs) \
41-
$(hostprogs-y) $(hostprogs-m) $(hostprogs-)
41+
$(hostprogs-y) $(hostprogs-m) $(hostprogs-) \
42+
$(hostlibs-y) $(hostlibs-m) $(hostlibs-) \
43+
$(hostcxxlibs-y) $(hostcxxlibs-m)
4244

4345
__clean-files := $(filter-out $(no-clean-files), $(__clean-files))
4446

scripts/Makefile.host

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,15 @@
2020
# Will compile qconf as a C++ program, and menu as a C program.
2121
# They are linked as C++ code to the executable qconf
2222

23+
# hostcc-option
24+
# Usage: cflags-y += $(call hostcc-option,-march=winchip-c6,-march=i586)
25+
26+
hostcc-option = $(call try-run,\
27+
$(HOSTCC) $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2))
28+
2329
__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
30+
host-cshlib := $(sort $(hostlibs-y) $(hostlibs-m))
31+
host-cxxshlib := $(sort $(hostcxxlibs-y) $(hostcxxlibs-m))
2432

2533
# C code
2634
# Executables compiled from a single .c file
@@ -42,6 +50,10 @@ host-cxxmulti := $(foreach m,$(__hostprogs),$(if $($(m)-cxxobjs),$(m)))
4250
# C++ Object (.o) files compiled from .cc files
4351
host-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
4452

53+
# Object (.o) files used by the shared libaries
54+
host-cshobjs := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs))))
55+
host-cxxshobjs := $(sort $(foreach m,$(host-cxxshlib),$($(m:.so=-objs))))
56+
4557
# output directory for programs/.o files
4658
# hostprogs-y := tools/build may have been specified.
4759
# Retrieve also directory of .o files from prog-objs or prog-cxxobjs notation
@@ -56,6 +68,10 @@ host-cmulti := $(addprefix $(obj)/,$(host-cmulti))
5668
host-cobjs := $(addprefix $(obj)/,$(host-cobjs))
5769
host-cxxmulti := $(addprefix $(obj)/,$(host-cxxmulti))
5870
host-cxxobjs := $(addprefix $(obj)/,$(host-cxxobjs))
71+
host-cshlib := $(addprefix $(obj)/,$(host-cshlib))
72+
host-cxxshlib := $(addprefix $(obj)/,$(host-cxxshlib))
73+
host-cshobjs := $(addprefix $(obj)/,$(host-cshobjs))
74+
host-cxxshobjs := $(addprefix $(obj)/,$(host-cxxshobjs))
5975
host-objdirs := $(addprefix $(obj)/,$(host-objdirs))
6076

6177
obj-dirs += $(host-objdirs)
@@ -124,5 +140,42 @@ quiet_cmd_host-cxxobjs = HOSTCXX $@
124140
$(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE
125141
$(call if_changed_dep,host-cxxobjs)
126142

143+
# Compile .c file, create position independent .o file
144+
# host-cshobjs -> .o
145+
quiet_cmd_host-cshobjs = HOSTCC -fPIC $@
146+
cmd_host-cshobjs = $(HOSTCC) $(hostc_flags) -fPIC -c -o $@ $<
147+
$(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE
148+
$(call if_changed_dep,host-cshobjs)
149+
150+
# Compile .c file, create position independent .o file
151+
# Note that plugin capable gcc versions can be either C or C++ based
152+
# therefore plugin source files have to be compilable in both C and C++ mode.
153+
# This is why a C++ compiler is invoked on a .c file.
154+
# host-cxxshobjs -> .o
155+
quiet_cmd_host-cxxshobjs = HOSTCXX -fPIC $@
156+
cmd_host-cxxshobjs = $(HOSTCXX) $(hostcxx_flags) -fPIC -c -o $@ $<
157+
$(host-cxxshobjs): $(obj)/%.o: $(src)/%.c FORCE
158+
$(call if_changed_dep,host-cxxshobjs)
159+
160+
# Link a shared library, based on position independent .o files
161+
# *.o -> .so shared library (host-cshlib)
162+
quiet_cmd_host-cshlib = HOSTLLD -shared $@
163+
cmd_host-cshlib = $(HOSTCC) $(HOSTLDFLAGS) -shared -o $@ \
164+
$(addprefix $(obj)/,$($(@F:.so=-objs))) \
165+
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
166+
$(host-cshlib): FORCE
167+
$(call if_changed,host-cshlib)
168+
$(call multi_depend, $(host-cshlib), .so, -objs)
169+
170+
# Link a shared library, based on position independent .o files
171+
# *.o -> .so shared library (host-cxxshlib)
172+
quiet_cmd_host-cxxshlib = HOSTLLD -shared $@
173+
cmd_host-cxxshlib = $(HOSTCXX) $(HOSTLDFLAGS) -shared -o $@ \
174+
$(addprefix $(obj)/,$($(@F:.so=-objs))) \
175+
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
176+
$(host-cxxshlib): FORCE
177+
$(call if_changed,host-cxxshlib)
178+
$(call multi_depend, $(host-cxxshlib), .so, -objs)
179+
127180
targets += $(host-csingle) $(host-cmulti) $(host-cobjs)\
128-
$(host-cxxmulti) $(host-cxxobjs)
181+
$(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs) $(host-cxxshlib) $(host-cxxshobjs)

0 commit comments

Comments
 (0)