We want to prevent compiling something against one version of a dynamic library and then, at runtime accidentally using a different version of the dynamic library. With the old symbol-naming scheme this could not happen because every symbol had the SVH in it and you'd get an error by the dynamic linker when using the wrong version of a dylib. With the new naming scheme this isn't the case any more, so this patch adds the "link-guard" to prevent this error case. This is implemented as follows: - In every crate that we compile, we emit a function called "__rustc_link_guard_<crate-name>_<crate-svh>" - The body of this function contains calls to the "__rustc_link_guard" functions of all dependencies. - An executable contains a call to it's own "__rustc_link_guard" function. As a consequence the "__rustc_link_guard" function call graph mirrors the crate graph and the dynamic linker will fail if a wrong dylib is loaded somewhere because its "__rustc_link_guard" function will contain a different SVH in its name.
19 lines
373 B
Makefile
19 lines
373 B
Makefile
-include ../tools.mk
|
|
|
|
all: others
|
|
$(RUSTC) -C relocation-model=dynamic-no-pic foo.rs
|
|
$(call RUN,foo)
|
|
|
|
$(RUSTC) -C relocation-model=default foo.rs
|
|
$(call RUN,foo)
|
|
|
|
$(RUSTC) -C relocation-model=dynamic-no-pic --crate-type=dylib foo.rs --emit=link,obj
|
|
|
|
ifdef IS_MSVC
|
|
# FIXME(#28026)
|
|
others:
|
|
else
|
|
others:
|
|
$(RUSTC) -C relocation-model=static foo.rs
|
|
$(call RUN,foo)
|
|
endif
|