Skip to content

Commit bae4498

Browse files
authored
[7.x][ML] Native compilation and unit test for Linux on aarch64 (#1134)
This PR adds the ability to compile and unit test the code on the aarch64 architecture. It is NOT workable aarch64 support. That would additionally require the ability to cross compile for aarch64 from the x86_64 release manager and CI VMs, and also changes to the Gradle scripts that assemble the final artifacts. However, the relative ease of getting the code to compile and run on aarch64 suggests that supporting this platform is a realistic goal. The unit test changes highlight that aarch64 floating point calculations produce slightly different results to the equivalent x86_64 calculations. Backport of #1132
1 parent bfb57fc commit bae4498

File tree

9 files changed

+140
-93
lines changed

9 files changed

+140
-93
lines changed

3rd_party/3rd_party.sh

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,12 @@ case `uname` in
4949
if [ -z "$CPP_CROSS_COMPILE" ] ; then
5050
BOOST_LOCATION=/usr/local/gcc75/lib
5151
BOOST_COMPILER=gcc
52-
BOOST_EXTENSION=mt-x64-1_71.so.1.71.0
52+
if [ `uname -m` = aarch64 ] ; then
53+
BOOST_ARCH=a64
54+
else
55+
BOOST_ARCH=x64
56+
fi
57+
BOOST_EXTENSION=mt-${BOOST_ARCH}-1_71.so.1.71.0
5358
BOOST_LIBRARIES='atomic chrono date_time filesystem iostreams log log_setup program_options regex system thread'
5459
XML_LOCATION=/usr/local/gcc75/lib
5560
XML_EXTENSION=.so.2

build-setup/linux.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
21
# Machine Learning Build Machine Setup for Linux
32

3+
These same instructions should work for native compilation on both x86_64 and aarch64 architectures.
4+
45
To ensure everything is consistent for redistributable builds we build all redistributable components from source with a specific version of gcc.
56

67
You will need the following environment variables to be defined:

lib/maths/unittest/CBasicStatisticsTest.cc

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -451,12 +451,13 @@ BOOST_AUTO_TEST_CASE(testCentralMoments) {
451451
maths::CBasicStatistics::count(meansAndVariances[0]),
452452
maths::CBasicStatistics::count(vectorMeanAndVariances));
453453
for (std::size_t j = 0u; j < 4; ++j) {
454-
BOOST_REQUIRE_EQUAL(
454+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
455455
maths::CBasicStatistics::mean(meansAndVariances[j]),
456-
(maths::CBasicStatistics::mean(vectorMeanAndVariances))(j));
457-
BOOST_REQUIRE_EQUAL(
456+
(maths::CBasicStatistics::mean(vectorMeanAndVariances))(j), 1e-14);
457+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
458458
maths::CBasicStatistics::variance(meansAndVariances[j]),
459-
(maths::CBasicStatistics::variance(vectorMeanAndVariances))(j));
459+
(maths::CBasicStatistics::variance(vectorMeanAndVariances))(j),
460+
1e-14);
460461
}
461462
}
462463
}
@@ -482,15 +483,17 @@ BOOST_AUTO_TEST_CASE(testCentralMoments) {
482483
maths::CBasicStatistics::count(meansVariancesAndSkews[0]),
483484
maths::CBasicStatistics::count(vectorMeanVarianceAndSkew));
484485
for (std::size_t j = 0u; j < 4; ++j) {
485-
BOOST_REQUIRE_EQUAL(
486+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
486487
maths::CBasicStatistics::mean(meansVariancesAndSkews[j]),
487-
(maths::CBasicStatistics::mean(vectorMeanVarianceAndSkew))(j));
488-
BOOST_REQUIRE_EQUAL(
488+
(maths::CBasicStatistics::mean(vectorMeanVarianceAndSkew))(j), 1e-14);
489+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
489490
maths::CBasicStatistics::variance(meansVariancesAndSkews[j]),
490-
(maths::CBasicStatistics::variance(vectorMeanVarianceAndSkew))(j));
491-
BOOST_REQUIRE_EQUAL(
491+
(maths::CBasicStatistics::variance(vectorMeanVarianceAndSkew))(j),
492+
1e-14);
493+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
492494
maths::CBasicStatistics::skewness(meansVariancesAndSkews[j]),
493-
(maths::CBasicStatistics::skewness(vectorMeanVarianceAndSkew))(j));
495+
(maths::CBasicStatistics::skewness(vectorMeanVarianceAndSkew))(j),
496+
1e-14);
494497
}
495498
}
496499
}

lib/maths/unittest/CSplineTest.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,8 @@ BOOST_AUTO_TEST_CASE(testMean) {
277277
LOG_DEBUG(<< "expectedMean = " << expectedMean
278278
<< ", mean = " << spline.mean());
279279
BOOST_REQUIRE_CLOSE_ABSOLUTE(expectedMean, spline.mean(),
280-
std::numeric_limits<double>::epsilon() * expectedMean);
280+
std::numeric_limits<double>::epsilon() *
281+
expectedMean * 1.5);
281282
}
282283
}
283284

lib/maths/unittest/CXMeansOnlineTest.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,8 @@ BOOST_AUTO_TEST_CASE(testLatLongData) {
709709
maths::gaussianLogLikelihood(covariance, x - mean, llj);
710710
ll += w * std::exp(llj);
711711
Z += w;
712+
LOG_TRACE(<< "cluster " << j << " count " << clusters[j].count()
713+
<< " centre " << clusters[j].centre());
712714
}
713715
ll /= Z;
714716
LLC.add(std::log(ll));
@@ -718,7 +720,7 @@ BOOST_AUTO_TEST_CASE(testLatLongData) {
718720
LOG_DEBUG(<< "gaussian log(L) = " << maths::CBasicStatistics::mean(LLR));
719721
LOG_DEBUG(<< "clustered log(L) = " << maths::CBasicStatistics::mean(LLC));
720722
BOOST_TEST_REQUIRE(maths::CBasicStatistics::mean(LLC) >
721-
0.4 * maths::CBasicStatistics::mean(LLR));
723+
0.5 * maths::CBasicStatistics::mean(LLR));
722724
}
723725

724726
BOOST_AUTO_TEST_CASE(testPersist) {

lib/model/unittest/CMetricDataGathererTest.cc

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -279,14 +279,14 @@ BOOST_FIXTURE_TEST_CASE(testSingleSeries, CTestFixture) {
279279
bucketLength, featureData);
280280
LOG_DEBUG(<< "featureData = " << core::CContainerPrinter::print(featureData));
281281
BOOST_TEST_REQUIRE(!featureData.empty());
282-
BOOST_REQUIRE_EQUAL(
283-
1.5, featureData[0].second[0].second.s_BucketValue->value()[0]);
284-
BOOST_REQUIRE_EQUAL(
285-
0.9, featureData[1].second[0].second.s_BucketValue->value()[0]);
286-
BOOST_REQUIRE_EQUAL(
287-
2.1, featureData[2].second[0].second.s_BucketValue->value()[0]);
288-
BOOST_REQUIRE_EQUAL(
289-
9.0, featureData[3].second[0].second.s_BucketValue->value()[0]);
282+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
283+
1.5, featureData[0].second[0].second.s_BucketValue->value()[0], 1e-14);
284+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
285+
0.9, featureData[1].second[0].second.s_BucketValue->value()[0], 1e-14);
286+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
287+
2.1, featureData[2].second[0].second.s_BucketValue->value()[0], 1e-14);
288+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
289+
9.0, featureData[3].second[0].second.s_BucketValue->value()[0], 1e-14);
290290
BOOST_REQUIRE_EQUAL(false, featureData[0].second[0].second.s_IsInteger);
291291
BOOST_REQUIRE_EQUAL(false, featureData[1].second[0].second.s_IsInteger);
292292
BOOST_REQUIRE_EQUAL(false, featureData[2].second[0].second.s_IsInteger);
@@ -315,14 +315,14 @@ BOOST_FIXTURE_TEST_CASE(testSingleSeries, CTestFixture) {
315315
gatherer.sampleNow(startTime + bucketLength);
316316
gatherer.featureData(startTime + bucketLength, bucketLength, featureData);
317317
BOOST_TEST_REQUIRE(!featureData.empty());
318-
BOOST_REQUIRE_EQUAL(
319-
2.0, featureData[0].second[0].second.s_BucketValue->value()[0]);
320-
BOOST_REQUIRE_EQUAL(
321-
1.8, featureData[1].second[0].second.s_BucketValue->value()[0]);
322-
BOOST_REQUIRE_EQUAL(
323-
2.2, featureData[2].second[0].second.s_BucketValue->value()[0]);
324-
BOOST_REQUIRE_EQUAL(
325-
6.0, featureData[3].second[0].second.s_BucketValue->value()[0]);
318+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
319+
2.0, featureData[0].second[0].second.s_BucketValue->value()[0], 1e-14);
320+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
321+
1.8, featureData[1].second[0].second.s_BucketValue->value()[0], 1e-14);
322+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
323+
2.2, featureData[2].second[0].second.s_BucketValue->value()[0], 1e-14);
324+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
325+
6.0, featureData[3].second[0].second.s_BucketValue->value()[0], 1e-14);
326326
BOOST_REQUIRE_EQUAL(true, featureData[3].second[0].second.s_IsInteger);
327327
BOOST_REQUIRE_EQUAL(std::string("[(700 [2.1] 1 2)]"),
328328
core::CContainerPrinter::print(
@@ -378,10 +378,12 @@ BOOST_FIXTURE_TEST_CASE(testSingleSeries, CTestFixture) {
378378
BOOST_TEST_REQUIRE(!featureData.empty());
379379
BOOST_REQUIRE_CLOSE_ABSOLUTE(
380380
3.5, featureData[0].second[0].second.s_BucketValue->value()[0], 1e-10);
381-
BOOST_REQUIRE_EQUAL(3.2, featureData[1].second[0].second.s_BucketValue->value()[0]);
382-
BOOST_REQUIRE_EQUAL(3.8, featureData[2].second[0].second.s_BucketValue->value()[0]);
383-
BOOST_REQUIRE_EQUAL(
384-
10.5, featureData[3].second[0].second.s_BucketValue->value()[0]);
381+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
382+
3.2, featureData[1].second[0].second.s_BucketValue->value()[0], 1e-14);
383+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
384+
3.8, featureData[2].second[0].second.s_BucketValue->value()[0], 1e-14);
385+
BOOST_REQUIRE_CLOSE_ABSOLUTE(
386+
10.5, featureData[3].second[0].second.s_BucketValue->value()[0], 1e-14);
385387
BOOST_REQUIRE_EQUAL(false, featureData[0].second[0].second.s_IsInteger);
386388
BOOST_REQUIRE_EQUAL(false, featureData[1].second[0].second.s_IsInteger);
387389
BOOST_REQUIRE_EQUAL(false, featureData[2].second[0].second.s_IsInteger);

lib/seccomp/CSystemCallFilter_Linux.cc

Lines changed: 64 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77

88
#include <core/CLogger.h>
99

10+
#include <cerrno>
11+
#include <cstdint>
12+
#include <cstring>
13+
1014
#include <linux/audit.h>
1115
#include <linux/filter.h>
1216
#include <sys/prctl.h>
1317
#include <sys/syscall.h>
1418

15-
#include <cerrno>
16-
#include <cstdint>
17-
#include <cstring>
18-
1919
namespace ml {
2020
namespace seccomp {
2121

@@ -45,53 +45,70 @@ const std::uint32_t SECCOMP_DATA_NR_OFFSET = 0x00;
4545
const struct sock_filter FILTER[] = {
4646
// Load the system call number into accumulator
4747
BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SECCOMP_DATA_NR_OFFSET),
48-
// Only applies to X86_64 arch. Jump to disallow for calls using the x32 ABI
49-
BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, UPPER_NR_LIMIT, 42, 0),
48+
49+
#ifdef __x86_64__
50+
// Only applies to x86_64 arch. Jump to disallow for calls using the i386 ABI
51+
BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, UPPER_NR_LIMIT, 46, 0),
5052
// If any sys call filters are added or removed then the jump
5153
// destination for each statement including the one above must
5254
// be updated accordingly
5355

54-
// Allowed sys calls, jump to return allow on match
55-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_getpriority, 42, 0), // for nice
56-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_setpriority, 41, 0), // for nice
57-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_read, 40, 0),
58-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_write, 39, 0),
59-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_writev, 38, 0),
60-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_lseek, 37, 0),
61-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_lstat, 36, 0),
62-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_time, 35, 0),
63-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_clock_gettime, 34, 0),
64-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_gettimeofday, 33, 0),
65-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_readlink, 32, 0),
66-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_stat, 31, 0),
67-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_fstat, 30, 0),
68-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_open, 29, 0),
69-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_close, 28, 0),
70-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_connect, 27, 0),
71-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_clone, 26, 0),
72-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_statfs, 25, 0),
73-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_dup2, 24, 0),
74-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_mkdir, 23, 0), // for forecast temp storage
75-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_rmdir, 22, 0), // for forecast temp storage
76-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_unlinkat, 21, 0), // for forecast temp storage
77-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_getdents, 20, 0), // for forecast temp storage
78-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_getdents64, 19, 0), // for forecast temp storage
79-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_openat, 18, 0), // for forecast temp storage
80-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_tgkill, 17, 0), // for the crash handler
81-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_rt_sigaction, 16, 0), // for the crash handler
82-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_rt_sigreturn, 15, 0),
83-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_futex, 14, 0),
84-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_madvise, 13, 0),
85-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_unlink, 12, 0),
86-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_mknod, 11, 0),
87-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_nanosleep, 10, 0),
88-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_set_robust_list, 9, 0),
89-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_mprotect, 8, 0),
90-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_munmap, 7, 0),
91-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_mmap, 6, 0),
92-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_getuid, 5, 0),
93-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_exit_group, 4, 0),
94-
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_access, 3, 0),
56+
// Allowed architecture-specific sys calls, jump to return allow on match
57+
// Some of these are not used in latest glibc, and not supported in Linux
58+
// kernels for recent architectures, but in a few cases different sys calls
59+
// are used on different architectures
60+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_open, 46, 0),
61+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_dup2, 45, 0),
62+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_unlink, 44, 0),
63+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_stat, 43, 0),
64+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_lstat, 42, 0),
65+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_time, 41, 0),
66+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_readlink, 40, 0),
67+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_getdents, 39, 0), // for forecast temp storage
68+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_rmdir, 38, 0), // for forecast temp storage
69+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_mkdir, 37, 0), // for forecast temp storage
70+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_mknod, 36, 0),
71+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_access, 35, 0),
72+
#elif defined(__aarch64__)
73+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_mknodat, 36, 0),
74+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_faccessat, 35, 0),
75+
#else
76+
#error Unsupported hardware architecture
77+
#endif
78+
79+
// Allowed sys calls for all architectures, jump to return allow on match
80+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_newfstatat, 34, 0),
81+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_readlinkat, 33, 0),
82+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_dup3, 32, 0),
83+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_getpriority, 31, 0), // for nice
84+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_setpriority, 30, 0), // for nice
85+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_read, 29, 0),
86+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_write, 28, 0),
87+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_writev, 27, 0),
88+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_lseek, 26, 0),
89+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_clock_gettime, 25, 0),
90+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_gettimeofday, 24, 0),
91+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_fstat, 23, 0),
92+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_close, 22, 0),
93+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_connect, 21, 0),
94+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_clone, 20, 0),
95+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_statfs, 19, 0),
96+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_mkdirat, 18, 0), // for forecast temp storage
97+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_unlinkat, 17, 0), // for forecast temp storage
98+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_getdents64, 16, 0), // for forecast temp storage
99+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_openat, 15, 0), // for forecast temp storage
100+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_tgkill, 14, 0), // for the crash handler
101+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_rt_sigaction, 13, 0), // for the crash handler
102+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_rt_sigreturn, 12, 0),
103+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_futex, 11, 0),
104+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_madvise, 10, 0),
105+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_nanosleep, 9, 0),
106+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_set_robust_list, 8, 0),
107+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_mprotect, 7, 0),
108+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_munmap, 6, 0),
109+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_mmap, 5, 0),
110+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_getuid, 4, 0),
111+
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_exit_group, 3, 0),
95112
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_brk, 2, 0),
96113
BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_exit, 1, 0),
97114
// Disallow call with error code EACCES

mk/linux.mk

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
OS=Linux
88

9-
CPP_PLATFORM_HOME=$(CPP_DISTRIBUTION_HOME)/platform/linux-x86_64
9+
HARDWARE_ARCH:=$(shell uname -m)
10+
CPP_PLATFORM_HOME=$(CPP_DISTRIBUTION_HOME)/platform/linux-$(HARDWARE_ARCH)
1011

1112
CC=gcc
1213
CXX=g++ -std=gnu++14
@@ -23,9 +24,15 @@ COVERAGE=--coverage
2324
endif
2425
endif
2526

27+
ifeq ($(HARDWARE_ARCH),aarch64)
28+
ARCHCFLAGS=-march=armv8-a+crc+crypto
29+
else
30+
ARCHCFLAGS=-msse4.2 -mfpmath=sse
31+
endif
32+
2633
PLATPICFLAGS=-fPIC
2734
PLATPIEFLAGS=-fPIE
28-
CFLAGS=-g $(OPTCFLAGS) -msse4.2 -mfpmath=sse -fstack-protector -fno-math-errno -fno-permissive -Wall -Wcast-align -Wconversion -Wextra -Winit-self -Wparentheses -Wpointer-arith -Wswitch-enum $(COVERAGE)
35+
CFLAGS=-g $(OPTCFLAGS) $(ARCHCFLAGS) -fstack-protector -fno-math-errno -fno-permissive -Wall -Wcast-align -Wconversion -Wextra -Winit-self -Wparentheses -Wpointer-arith -Wswitch-enum $(COVERAGE)
2936
CXXFLAGS=$(CFLAGS) -Wno-ctor-dtor-privacy -Wno-deprecated-declarations -Wold-style-cast -fvisibility-inlines-hidden
3037
CPPFLAGS=-isystem $(CPP_SRC_HOME)/3rd_party/include -isystem /usr/local/gcc75/include -D$(OS) -D_REENTRANT $(OPTCPPFLAGS)
3138
CDEPFLAGS=-MM
@@ -43,21 +50,30 @@ RESOURCES_DIR=resources
4350
LOCALLIBS=-lm -lpthread -ldl -lrt
4451
NETLIBS=-lnsl
4552
BOOSTVER=1_71
53+
ifeq ($(HARDWARE_ARCH),aarch64)
54+
BOOSTARCH=a64
55+
else
56+
BOOSTARCH=x64
57+
endif
4658
BOOSTGCCVER:=$(shell $(CXX) -dumpversion | awk -F. '{ print $$1; }')
4759
# Use -isystem instead of -I for Boost headers to suppress warnings from Boost
4860
BOOSTINCLUDES=-isystem /usr/local/gcc75/include/boost-$(BOOSTVER)
4961
BOOSTCPPFLAGS=-DBOOST_ALL_DYN_LINK -DBOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
50-
BOOSTLOGLIBS=-lboost_log-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER)
51-
BOOSTLOGSETUPLIBS=-lboost_log_setup-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER)
52-
BOOSTREGEXLIBS=-lboost_regex-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER)
53-
BOOSTIOSTREAMSLIBS=-lboost_iostreams-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER)
54-
BOOSTPROGRAMOPTIONSLIBS=-lboost_program_options-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER)
55-
BOOSTTHREADLIBS=-lboost_thread-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER) -lboost_system-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER)
56-
BOOSTFILESYSTEMLIBS=-lboost_filesystem-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER) -lboost_system-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER)
57-
BOOSTDATETIMELIBS=-lboost_date_time-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER)
58-
BOOSTTESTLIBS=-lboost_unit_test_framework-gcc$(BOOSTGCCVER)-mt-x64-$(BOOSTVER)
62+
BOOSTLOGLIBS=-lboost_log-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER)
63+
BOOSTLOGSETUPLIBS=-lboost_log_setup-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER)
64+
BOOSTREGEXLIBS=-lboost_regex-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER)
65+
BOOSTIOSTREAMSLIBS=-lboost_iostreams-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER)
66+
BOOSTPROGRAMOPTIONSLIBS=-lboost_program_options-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER)
67+
BOOSTTHREADLIBS=-lboost_thread-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER) -lboost_system-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER)
68+
BOOSTFILESYSTEMLIBS=-lboost_filesystem-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER) -lboost_system-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER)
69+
BOOSTDATETIMELIBS=-lboost_date_time-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER)
70+
BOOSTTESTLIBS=-lboost_unit_test_framework-gcc$(BOOSTGCCVER)-mt-$(BOOSTARCH)-$(BOOSTVER)
5971
RAPIDJSONINCLUDES=-isystem $(CPP_SRC_HOME)/3rd_party/rapidjson/include
72+
ifeq ($(HARDWARE_ARCH),aarch64)
73+
RAPIDJSONCPPFLAGS=-DRAPIDJSON_HAS_STDSTRING -DRAPIDJSON_NEON
74+
else
6075
RAPIDJSONCPPFLAGS=-DRAPIDJSON_HAS_STDSTRING -DRAPIDJSON_SSE42
76+
endif
6177
EIGENINCLUDES=-isystem $(CPP_SRC_HOME)/3rd_party/eigen
6278
EIGENCPPFLAGS=-DEIGEN_MPL2_ONLY
6379
XMLINCLUDES=`/usr/local/gcc75/bin/xml2-config --cflags`

0 commit comments

Comments
 (0)