Linkerconfig is a program to generate linker configuration based on the runtime environment. Linkerconfig generates one or more ld.config.txt files and some other files under /linkerconfig during init. Linker will read this generated configuration file(s) to find out link relationship between libraries and executable.
TODO: explain inputs (e.g. /system/etc/public.libraries.txt, /apex/apex-info-list.xml, ..)
Linker configuration file can be used to add extra information while linkerconfig
creates linker configuration with the module. This module can be defined as
linker_config from Soong, and it will be translated as protobuf file at build
time.
A linker configuration file(linker.config.json) is compiled into a protobuf at build time
by conv_linker_config. You can find the compiled file under <base>/etc/linker.config.pb.
For example, /apex/com.android.art/etc/linker.config.pb is a configuration for the com.android.art
APEX.
/system/etc/linker.config.pb(or its source module system_linker_config) is special because
its provideLibs key is generated at build time.
linker.config.json file is in json format which can contain properties as below.
| Property Name | Type | Description | Allowed module |
|---|---|---|---|
| permittedPaths | List | Additional permitted paths | APEX |
| visible | bool | Force APEX namespace to be visible from all sections if the value is true | APEX |
| provideLibs | List | Libraries providing from the module | System |
| requireLibs | List | Libraries required from the module | System |
{
"permittedPaths" : [ "/a", "/b/c", "/d/e/f"],
"visible": true
}
{
"provideLibs" : [ "a.so", "b.so", "c.so" ],
"requireLibs" : [ "foo.so", "bar.so", "baz.so" ]
}
linkerconfig reads both /system/etc/public.libraries.txt and /vendor/etc/public.libraries.txt to identify
libraries that are provided by APEX and accessible from apps via libnativeloader.
linkerconfig generates apex.libraries.config.txt file which lists public libraries provided APEX. libnativeloader, then,
links those libraries from classloader-namespace to providing APEXes.
TODO: a few words about the files
Check ld.config.format.md.
The file describes libraries exposed from APEXes. libnativeloader is the main consumer of this file.
# comment line
jni com_android_foo libfoo_jni.so
public com_android_bar libbar.so:libbaz.so
The file is line-based and each line consists of tag apex_namespace library_list.
tagexplains whatlibrary_listis.apex_namespaceis the namespace of the apex. Note that it is mangled likecom_android_foofor the APEX("com.android.foo").library_listis colon-separated list of library names.- if
tagisjni,library_listis the list of JNI libraries exposed byapex_namespace. - if
tagispublic,library_listis the list of public libraries exposed byapex_namespace. Here, public libraries are the libs listed in/system/etc/public.libraries.txt.
- if