我正在通过学习源码研究Android动态库的加载过程。在/bionic/linker/linker.cpp中,我发现获取动态库及其依赖库的信息后,将它们放入“load_list”,然后调用“shuffle”函数对其进行随机化,然后加载库在“加载列表”中。我想知道随机化的目的是什么。
我研究的Android版本是8.0.0_r4,随机操作是2015年10月以后加入的,之前的版本没有。
1498static void shuffle(std::vector<LoadTask*>* v) {
1499 for (size_t i = 0, size = v->size(); i < size; ++i) {
1500 size_t n = size - i;
1501 size_t r = arc4random_uniform(n);
1502 std::swap((*v)[n-1], (*v)[r]);
1503 }
1504}
1615 shuffle(&load_list);
1616
1617 for (auto&& task : load_list) {
1618 if (!task->load()) {
1619 return false;
1620 }
1621 }