Also ich habe nun folgendes ausprobiert und festgestellt:

"set option naming=xxx" wird tatsächlich abgewiesen.
Das Naming ist durch die aktuelle Umgebung definiert und wird zum Erstellzeitpunkt in das Programm übernommen. Egal ob ich STRSQL oder RUNSQLSTM verwende.

Ist *SYS eingestellt wird die unqualifizierte Tabelle später über *LIBL gesucht, bei *SQL eben über USERNAME (bzw. DFTRDBCOL).
Dies kann man sehr schön über DSPJOB->14 (SysReq) sehen.

Durch ändern der Libliste wird dann auch korrekt die eingestellte Tabelle ermittelt.

Dass die Objekte nicht kopiert werden können ist nur bedingt richtig. Entscheidend ist hier die verwendete Methode !
CRTDUPOBJ erstellt tatsächlich nur eine Kopie des reinen Programmobjektes.

Ein SAVOBJ sichert SQL-Informationen mit, ein RSTOBJ trägt diese SQL-Infos auch ins Repository.
Normalerweise werden Programme ja von SystemA nach SystemB transportiert und natürlich ohne Quellen. Dies geht auch wunderbar, sonst könnte ich keine SQL-Programme (Funktionen/Prozeduren) ausliefern.

Muss man dies lokal von LibA nach LibB machen, reicht eben ein CRTDUPOBJ nicht mehr aus. Ich kann das Programm/Service-Programm jedoch mittel SAVOBJ/RSTOBJ über eine SAVF kopieren, und siehe da, die SYSPROCS/SYSFUNCS enthalten die korekten Verweise.

Siehe "select * from sysprocs" / "select * from sysfuncs"