diff --git a/src/Makefile.am b/src/Makefile.am
index 26ceda7..3fe220b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -175,3 +175,40 @@ EXTRA_DIST = \
radeon_atombios.h \
radeon_dri2.h \
drmmode_display.h
+
+# Generate linker mapfiles for symbols found in other modules and use them
+# and library flag additions to make sure all symbols are resolvable
+
+radeon_MAPFILES = \
+ mapfile-theatre_detect_drv-external \
+ mapfile-theatre_drv-external \
+ mapfile-tda9885_drv-external \
+ mapfile-msp3430_drv-external \
+ mapfile-uda1380_drv-external \
+ mapfile-fi1236_drv-external \
+ mapfile-bt829_drv-external
+
+radeon_drv_la_LDFLAGS += $(radeon_MAPFILES:%=-Wl,-M,%) \
+ $(radeon_drv_la_LDFLAGS_add) \
+ -lexa -lfb -lint10 -lvbe -lvgahw -lshadow \
+ -lpixman-1 -ldrm -lglx -lm
+
+radeon_drv_la_DEPENDENCIES = $(radeon_MAPFILES)
+
+mapfiles: $(MAPFILES)
+
+mapfile-theatre_drv-external: $(theatre_drv_la_OBJECTS)
+mapfile-theatre_detect_drv-external: $(theatre_detect_drv_la_OBJECTS)
+mapfile-bt829_drv-external: $(bt829_drv_la_OBJECTS)
+mapfile-fi1236_drv-external: $(fi1236_drv_OBJECTS)
+mapfile-uda1380_drv-external: $(uda1380_drv_OBJECTS)
+mapfile-msp3430_drv-external: $(msp3430_drv_OBJECTS)
+mapfile-tda9885_drv-external: $(tda9885_drv_OBJECTS)
+
+mapfile-%-external:
+ -rm -f $@
+ printf '# Functions exported to loadable modules\n\n' > $@
+ printf '{\n global:\n' >> $@
+ /usr/ccs/bin/nm -g $? | grep -v UNDEF | sed -n -e 's/^.*\|FUNC \|GLOB \|.*\|\(.*\)$$/ \1 = FUNCTION extern;/p' -e 's/^.*\|OBJT \|GLOB \|.*\|\(.*\)$$/ \1 = DATA extern;/p' >> $@
+ printf '};\n' >> $@
+