summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/makedeffile48
-rwxr-xr-xbin/makeexpfile39
-rwxr-xr-xbin/makeordinalmap41
-rw-r--r--mkspecs/symbian/linux-armcc/features/default_post.prf20
4 files changed, 109 insertions, 39 deletions
diff --git a/bin/makedeffile b/bin/makedeffile
new file mode 100755
index 0000000..e1534c4
--- /dev/null
+++ b/bin/makedeffile
@@ -0,0 +1,48 @@
+#!/usr/bin/perl -w
+
+my $deffile = $ARGV[0];
+
+shift @ARGV;
+
+sub uniqueify {
+ # String must be sorted beforehand.
+ my $c;
+ my $last = $_[0];
+ for ($c = 1; $c < scalar(@_); $c++) {
+ if ($_[$c] eq $last) {
+ splice(@_, $c, 1);
+ $c--;
+ } else {
+ $last = $_[$c];
+ }
+ }
+
+ return @_;
+}
+
+my @exports;
+
+foreach (@ARGV) {
+ my $file;
+ open($file, "< $_") or die("Could not open $_");
+ while (<$file>) {
+ s/[\r\n]//g;
+ push (@exports, $_);
+ }
+ close($file);
+}
+
+@exports = sort(@exports);
+
+@exports = uniqueify(@exports);
+
+open(HANDLE, "> $deffile");
+print (HANDLE "EXPORTS\n; NEW:\n");
+for (my $c = 0; $c < scalar(@exports); $c++) {
+ if ($exports[$c] =~ /[ ]*([^ ]+)(.*)/) {
+ print (HANDLE "\t$1 \@ " . ($c + 1) . " NONAME$2\n");
+ }
+}
+print(HANDLE "\n");
+close(HANDLE);
+
diff --git a/bin/makeexpfile b/bin/makeexpfile
new file mode 100755
index 0000000..521791d
--- /dev/null
+++ b/bin/makeexpfile
@@ -0,0 +1,39 @@
+#!/usr/bin/perl -w
+
+my $deffile = $ARGV[0];
+my $target = $ARGV[1];
+
+my @exports;
+open (HANDLE, "< $deffile") or die ("Could not open $deffile");
+while (<HANDLE>) {
+ while (/(_Z[^ ]+)/xg) {
+ push (@exports, $1);
+ }
+}
+close(HANDLE);
+
+open(HANDLE, "> $target.s") or die("Could not open $target.s");
+print (HANDLE "\tEXPORT __DLL_Export_Table__\n\n");
+print (HANDLE "\tEXPORT |DLL##ExportTable|\n\n");
+print (HANDLE "\tEXPORT |DLL##ExportTableSize|\n\n");
+print (HANDLE "\tAREA ExportTable, CODE\n");
+print (HANDLE "__DLL_Export_Table__\n");
+print (HANDLE "\tBX lr\n");
+print (HANDLE "|DLL##ExportTableSize|\n");
+print (HANDLE "\tDCD " . scalar(@exports) . "\n");
+print (HANDLE "|DLL##ExportTable|\n");
+print (HANDLE "\tPRESERVE8\n\n");
+for (my $c = 0; $c < scalar(@exports); $c++) {
+ print (HANDLE "\tIMPORT $exports[$c]\n");
+ print (HANDLE "\tDCD $exports[$c] ; \@ ". ($c + 1) . "\n");
+}
+print (HANDLE "\n");
+print (HANDLE "\tAREA |.directive|, READONLY, NOALLOC\n");
+print (HANDLE "\tDCB \"#<SYMEDIT>#\\n\"\n");
+print (HANDLE "\tDCB \"EXPORT DLL##ExportTable\\n\"\n");
+print (HANDLE "\tDCB \"EXPORT DLL##ExportTableSize\\n\"\n");
+print (HANDLE "\tEND\n");
+close(HANDLE);
+
+my $result = system("armasm --apcs /inter -o $target $target.s");
+die("Could not execute armar") if ($result);
diff --git a/bin/makeordinalmap b/bin/makeordinalmap
index 940a9e4..4642772 100755
--- a/bin/makeordinalmap
+++ b/bin/makeordinalmap
@@ -1,46 +1,17 @@
#!/usr/bin/perl -w
my $objects_dir = $ARGV[0];
-my $target = $ARGV[1];
+my $deffile = $ARGV[1];
my $dllFile = $ARGV[2];
-
-shift @ARGV;
-shift @ARGV;
-shift @ARGV;
-
-sub uniqueify {
- # String must be sorted beforehand.
- my $c;
- my $last = $_[0];
- for ($c = 1; $c < scalar(@_); $c++) {
- if ($_[$c] eq $last) {
- splice(@_, $c, 1);
- $c--;
- } else {
- $last = $_[$c];
- }
- }
-
- return @_;
-}
+my $target = $ARGV[3];
my @exports;
-
-foreach (@ARGV) {
- my $file;
- open($file, "< $_") or die("Could not open $_");
- while (<$file>) {
- push (@exports, $_);
+open (HANDLE, "< $deffile") or die ("Could not open $deffile");
+while (<HANDLE>) {
+ while (/(_Z[^ ]+)/xg) {
+ push (@exports, $1);
}
- close($file);
}
-
-@exports = sort(@exports);
-
-@exports = uniqueify(@exports);
-
-open(HANDLE, "> test.txt");
-print (HANDLE join("", @exports));
close(HANDLE);
my @ordinalfiles;
diff --git a/mkspecs/symbian/linux-armcc/features/default_post.prf b/mkspecs/symbian/linux-armcc/features/default_post.prf
index 1d8f565..d575737 100644
--- a/mkspecs/symbian/linux-armcc/features/default_post.prf
+++ b/mkspecs/symbian/linux-armcc/features/default_post.prf
@@ -4,11 +4,23 @@ exports.input = OBJECTS
exports.variable_out = ORDINALMAP
exports.CONFIG = no_link
-ordinalmap.input = ORDINALMAP
+deffile.input = ORDINALMAP
+deffile.output = $$OBJECTS_DIR/$${TARGET}.def
+deffile.commands = makedeffile $$OBJECTS_DIR/$${TARGET}.def ${QMAKE_FILE_NAME}
+deffile.variable_out = DEFFILE
+deffile.CONFIG = no_link combine
+
+expfile.input = DEFFILE
+expfile.output = $$OBJECTS_DIR/$${TARGET}.exp
+expfile.commands = makeexpfile ${QMAKE_FILE_NAME} $$OBJECTS_DIR/$${TARGET}.exp
+expfile.variable_out = PRE_TARGETDEPS
+
+ordinalmap.input = DEFFILE
ordinalmap.output = $$OBJECTS_DIR/$${TARGET}.lib
-ordinalmap.commands = makeordinalmap $$OBJECTS_DIR $$OBJECTS_DIR/$${TARGET}.lib $${TARGET}.dll ${QMAKE_FILE_NAME}
+ordinalmap.commands = makeordinalmap $$OBJECTS_DIR ${QMAKE_FILE_NAME} $${TARGET}.dll $$OBJECTS_DIR/$${TARGET}.lib
ordinalmap.variable_out = PRE_TARGETDEPS
-ordinalmap.CONFIG = combine
-QMAKE_EXTRA_COMPILERS += ordinalmap
QMAKE_EXTRA_COMPILERS += exports
+QMAKE_EXTRA_COMPILERS += deffile
+QMAKE_EXTRA_COMPILERS += expfile
+QMAKE_EXTRA_COMPILERS += ordinalmap